From d23a4410958a6565d9c9bd18041d9b39a99066cf Mon Sep 17 00:00:00 2001 From: marc Date: Fri, 12 May 2017 07:29:56 +0200 Subject: [PATCH 001/247] Added LeafValueEditor interface to MaterialTimePicker to integrate with the Editor structures --- .../design/addins/client/timepicker/MaterialTimePicker.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java index 22f8fb204..79f2f5b13 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java @@ -22,6 +22,7 @@ import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style; +import com.google.gwt.editor.client.LeafValueEditor; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.logical.shared.*; @@ -73,7 +74,7 @@ */ //@formatter:on public class MaterialTimePicker extends AbstractValueWidget implements HasPlaceholder, HasOrientation, - HasCloseHandlers, HasOpenHandlers, HasIcon, HasReadOnly { + HasCloseHandlers, HasOpenHandlers, HasIcon, HasReadOnly, LeafValueEditor { static { if (MaterialAddins.isDebug()) { From bfb0625b189b6652d9739c3104621a178aeb2b81 Mon Sep 17 00:00:00 2001 From: marc Date: Wed, 23 Aug 2017 10:31:48 +0200 Subject: [PATCH 002/247] Fix TimePicker: setOrientation function initializes js if it's not initialized causing malfunctions if the component is not loaded yet --- .../design/addins/client/timepicker/MaterialTimePicker.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java index c2ea762e2..7dffe9a32 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java @@ -20,6 +20,7 @@ package gwt.material.design.addins.client.timepicker; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.shared.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style; import com.google.gwt.editor.client.LeafValueEditor; @@ -248,8 +249,6 @@ public void setOrientation(Orientation orientation) { this.orientation = orientation; if(isInitialize()) { JsTimePicker.$(timeInput.getElement()).lolliclock("setOrientation", orientation.getCssName()); - } else { - initialize(); } } From 77daeca436b33fe0168d06206aebd1ed5064aa76 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 22 Jul 2018 12:05:14 +0800 Subject: [PATCH 003/247] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25a7c44d9..0a24aa776 100644 --- a/README.md +++ b/README.md @@ -111,5 +111,5 @@ We created [Java Docs](http://gwtmaterialdesign.github.io/gwt-material-demo/apid - Timer (Infinite) - Toggle -##Follow Us +## Follow Us Google Plus From adee37d647d4f024b42dcdab2737373415afe55e Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 24 Jul 2018 21:08:14 +0800 Subject: [PATCH 004/247] Updated README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0a24aa776..a9bdaff0a 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,12 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gw ``` -## Snapshot Version 2.2-SNAPSHOT +## Snapshot Version 2.1.1-SNAPSHOT ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.2-SNAPSHOT + 2.1.1-SNAPSHOT ``` From 4797a947432b0b57b692c5cd14ec7265449ac36c Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 24 Jul 2018 21:12:04 +0800 Subject: [PATCH 005/247] Iteration for next 2.1.1-SNAPSHOT --- .travis.yml | 4 ++-- .utility/deploy.sh | 2 +- pom.xml | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 72e285147..2f4ac0913 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,12 +7,12 @@ cache: - $HOME/.m2 before_install: # install the gwt-material-jquery library before we build the demo -- git clone -b master https://github.com/GwtMaterialDesign/gwt-material-jquery.git +- git clone -b release_2.1.1 https://github.com/GwtMaterialDesign/gwt-material-jquery.git - cd gwt-material-jquery - mvn install -DskipTests=true -DdryRun=true - cd .. # install the gwt-material library before we build the demo -- git clone -b master https://github.com/GwtMaterialDesign/gwt-material.git +- git clone -b release_2.1.1 https://github.com/GwtMaterialDesign/gwt-material.git - cd gwt-material - mvn install -DskipTests=true -DdryRun=true - cd .. diff --git a/.utility/deploy.sh b/.utility/deploy.sh index 6a2ced0db..f56a6e2ef 100644 --- a/.utility/deploy.sh +++ b/.utility/deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash set -ev -if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "master" ]; then +if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.1.1" ]; then echo "ossrh\${env.OSSRH_USER}\${env.OSSRH_PASS}" > ~/settings.xml mvn deploy --settings ~/settings.xml fi \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0730b327c..6da7ddd33 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.1 + 2.1.1-SNAPSHOT gwt-material-addins @@ -16,14 +16,14 @@ Extra Components of GWT Material Framework - 2.1 + 2.1.1-SNAPSHOT scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.1 + v2.1.1-SNAPSHOT From 804c8a419f33aa2a7294e4ce2eeaec8ce3c9d310 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 24 Jul 2018 21:53:07 +0800 Subject: [PATCH 006/247] Fixed snapshot version for travis auto deploy --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6da7ddd33..6c84be51f 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ gwt-lib Gwt Material Addins - 2.1 + 2.1.1-SNAPSHOT Extra Components of GWT Material Framework From 2cc7bc5966b459e7971d8528b5b811cd364895c8 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 25 Jul 2018 17:12:29 +0800 Subject: [PATCH 007/247] Improvements on AsyncButtons now support icons. --- .../client/async/AbstractAsyncButton.java | 157 ++++++++++++++++++ .../incubator/client/async/AsyncButton.java | 153 ++--------------- .../incubator/client/async/AsyncIcon.java | 17 ++ .../client/async/events/ErrorEvent.java | 57 +++++++ .../client/async/events/HasAsyncHandlers.java | 10 ++ .../client/async/events/LoadingEvent.java | 57 +++++++ .../client/async/events/SuccessEvent.java | 57 +++++++ .../base/constants/IncubatorCssName.java | 1 + .../infinitescroll/data/LoadResult.java | 6 - .../async/resources/css/async-button.css | 21 ++- .../async/resources/css/async-button.min.css | 25 ++- 11 files changed, 412 insertions(+), 149 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java create mode 100644 src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java create mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java create mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java diff --git a/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java b/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java new file mode 100644 index 000000000..98a90aec1 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java @@ -0,0 +1,157 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.async; + +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.AbstractIconButton; +import gwt.material.design.client.base.HasActive; +import gwt.material.design.client.base.mixin.ActiveMixin; +import gwt.material.design.client.constants.IconPosition; +import gwt.material.design.client.constants.IconType; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.async.events.ErrorEvent; +import gwt.material.design.incubator.client.async.events.HasAsyncHandlers; +import gwt.material.design.incubator.client.async.events.LoadingEvent; +import gwt.material.design.incubator.client.async.events.SuccessEvent; +import gwt.material.design.incubator.client.base.IncubatorWidget; + +//@formatter:off + +/** + * Asynchronous buttons are components that is good ux for + * calling the server side component and automatically updates + * the states of the ui logic. + * + *

+ * Note: This component is under the incubation process and subject to change. + *

+ *

XML Namespace Declaration

+ * + * @author kevzlou7979 + */ +public abstract class AbstractAsyncButton extends AbstractIconButton + implements HasActive, HasAsyncHandlers { + + static { + IncubatorWidget.showWarning(AbstractAsyncButton.class); + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(AsyncDebugClientBundle.INSTANCE.asyncButtonDebugCss()); + } else { + MaterialDesignBase.injectCss(AsyncClientBundle.INSTANCE.asyncButtonCss()); + } + } + + protected ActiveMixin activeMixin; + protected IconType loadingIcon = IconType.AUTORENEW; + protected IconType errorIcon = IconType.WARNING; + protected IconType successIcon = IconType.CHECK; + + protected AbstractAsyncButton() { + super(); + } + + public AbstractAsyncButton(String className) { + super(className, ""); + + setIconPosition(IconPosition.LEFT); + } + + @Override + protected void onLoad() { + super.onLoad(); + } + + public void loading(String message) { + setActive(true); + setIconType(loadingIcon); + setEnabled(false); + LoadingEvent.fire(this); + } + + public void error(String message) { + setActive(false); + setIconType(errorIcon); + setEnabled(true); + ErrorEvent.fire(this); + } + + public void success(String message) { + setActive(false); + setIconType(successIcon); + setEnabled(true); + SuccessEvent.fire(this); + } + + @Override + public void setActive(boolean value) { + getActiveMixin().setActive(value); + } + + @Override + public boolean isActive() { + return getActiveMixin().isActive(); + } + + public ActiveMixin getActiveMixin() { + if (activeMixin == null) { + activeMixin = new ActiveMixin<>(this); + } + return activeMixin; + } + + public IconType getLoadingIcon() { + return loadingIcon; + } + + public void setLoadingIcon(IconType loadingIcon) { + this.loadingIcon = loadingIcon; + } + + public IconType getErrorIcon() { + return errorIcon; + } + + public void setErrorIcon(IconType errorIcon) { + this.errorIcon = errorIcon; + } + + public IconType getSuccessIcon() { + return successIcon; + } + + public void setSuccessIcon(IconType successIcon) { + this.successIcon = successIcon; + } + + @Override + public void addLoadingHandler(LoadingEvent.LoadingHandler handler) { + addHandler(handler, LoadingEvent.getType()); + } + + @Override + public void addErrorHandler(ErrorEvent.ErrorHandler handler) { + addHandler(handler, ErrorEvent.getType()); + } + + @Override + public void addSuccessHandler(SuccessEvent.SuccessHandler handler) { + addHandler(handler, SuccessEvent.getType()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java index 1f31179f8..6f1e47ce9 100644 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java +++ b/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java @@ -1,163 +1,38 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ package gwt.material.design.incubator.client.async; -import gwt.material.design.client.MaterialDesignBase; -import gwt.material.design.client.base.HasActive; -import gwt.material.design.client.base.mixin.ActiveMixin; -import gwt.material.design.client.constants.Color; -import gwt.material.design.client.constants.IconType; -import gwt.material.design.client.constants.SpinnerColor; -import gwt.material.design.client.ui.MaterialButton; -import gwt.material.design.client.ui.MaterialSpinner; -import gwt.material.design.incubator.client.AddinsIncubator; -import gwt.material.design.incubator.client.base.IncubatorWidget; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import gwt.material.design.client.constants.ButtonType; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; -//@formatter:off - -/** - * Asynchronous buttons are components that is good ux for - * calling the server side component and automatically updates - * the states of the ui logic. - * - *

- * Note: This component is under the incubation process and subject to change. - *

- *

XML Namespace Declaration

- * - * @author kevzlou7979 - */ -public class AsyncButton extends MaterialButton implements HasActive { - - static { - IncubatorWidget.showWarning(AsyncButton.class); - if (AddinsIncubator.isDebug()) { - MaterialDesignBase.injectCss(AsyncDebugClientBundle.INSTANCE.asyncButtonDebugCss()); - } else { - MaterialDesignBase.injectCss(AsyncClientBundle.INSTANCE.asyncButtonCss()); - } - } - - private MaterialSpinner loader = new MaterialSpinner(); - private ActiveMixin activeMixin; - - private IconType loadingIcon = IconType.DEFAULT; - private IconType errorIcon = IconType.WARNING; - private IconType successIcon = IconType.CHECK; +public class AsyncButton extends AbstractAsyncButton { public AsyncButton() { - super(); - addStyleName(IncubatorCssName.ASYNC_BUTTON); - } - - public AsyncButton(String text) { - super(text); - addStyleName(IncubatorCssName.ASYNC_BUTTON); - } + super(IncubatorCssName.ASYNC_BUTTON); - public AsyncButton(String text, IconType loadingIcon, IconType errorIcon, IconType successIcon) { - super(text); - addStyleName(IncubatorCssName.ASYNC_BUTTON); - this.loadingIcon = loadingIcon; - this.errorIcon = errorIcon; - this.successIcon = successIcon; - } - - public AsyncButton(IconType loadingIcon, IconType errorIcon, IconType successIcon) { - addStyleName(IncubatorCssName.ASYNC_BUTTON); - this.loadingIcon = loadingIcon; - this.errorIcon = errorIcon; - this.successIcon = successIcon; + setType(ButtonType.RAISED); } @Override - protected void onLoad() { - super.onLoad(); - - loader.setColor(SpinnerColor.BLUE_ONLY); - add(loader); - } - public void loading(String message) { - setActive(true); - setBackgroundColor(Color.WHITE); - setTextColor(Color.BLACK); - setText(message); - setIconType(loadingIcon); - } - - public void error(String message) { - setActive(false); - setBackgroundColor(Color.WHITE); - setTextColor(Color.RED); - setIconType(errorIcon); + super.loading(message); setText(message); } + @Override public void success(String message) { - setActive(false); - setBackgroundColor(Color.WHITE); - setTextColor(Color.BLACK); - setIconType(successIcon); + super.success(message); setText(message); } @Override - public void setActive(boolean value) { - getActiveMixin().setActive(value); + public void error(String message) { + super.error(message); + setText(message); } @Override - public boolean isActive() { - return getActiveMixin().isActive(); - } - - public ActiveMixin getActiveMixin() { - if (activeMixin == null) { - activeMixin = new ActiveMixin<>(this); - } - return activeMixin; - } - - public IconType getLoadingIcon() { - return loadingIcon; - } - - public void setLoadingIcon(IconType loadingIcon) { - this.loadingIcon = loadingIcon; - } - - public IconType getErrorIcon() { - return errorIcon; - } - - public void setErrorIcon(IconType errorIcon) { - this.errorIcon = errorIcon; - } - - public IconType getSuccessIcon() { - return successIcon; - } - - public void setSuccessIcon(IconType successIcon) { - this.successIcon = successIcon; + protected Element createElement() { + return Document.get().createPushButtonElement(); } } diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java new file mode 100644 index 000000000..782b41b18 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java @@ -0,0 +1,17 @@ +package gwt.material.design.incubator.client.async; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import gwt.material.design.incubator.client.base.constants.IncubatorCssName; + +public class AsyncIcon extends AbstractAsyncButton { + + public AsyncIcon() { + super(IncubatorCssName.ASYNC_ICON); + } + + @Override + protected Element createElement() { + return Document.get().createElement("i"); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java b/src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java new file mode 100644 index 000000000..35a149682 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java @@ -0,0 +1,57 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.async.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +//@formatter:off + +/** + * @author kevzlou7979 + */ +public class ErrorEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + public ErrorEvent() {} + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new ErrorEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ErrorHandler handler) { + handler.onError(this); + } + + public interface ErrorHandler extends EventHandler { + void onError(ErrorEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java b/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java new file mode 100644 index 000000000..7a1a18cb3 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java @@ -0,0 +1,10 @@ +package gwt.material.design.incubator.client.async.events; + +public interface HasAsyncHandlers { + + void addLoadingHandler(LoadingEvent.LoadingHandler handler); + + void addErrorHandler(ErrorEvent.ErrorHandler handler); + + void addSuccessHandler(SuccessEvent.SuccessHandler handler); +} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java b/src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java new file mode 100644 index 000000000..6bf45e9de --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java @@ -0,0 +1,57 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.async.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +//@formatter:off + +/** + * @author kevzlou7979 + */ +public class LoadingEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + public LoadingEvent() {} + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new LoadingEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(LoadingHandler handler) { + handler.onLoading(this); + } + + public interface LoadingHandler extends EventHandler { + void onLoading(LoadingEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java b/src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java new file mode 100644 index 000000000..2e38c18d5 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java @@ -0,0 +1,57 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.async.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +//@formatter:off + +/** + * @author kevzlou7979 + */ +public class SuccessEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + public SuccessEvent() {} + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new SuccessEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SuccessHandler handler) { + handler.onSuccess(this); + } + + public interface SuccessHandler extends EventHandler { + void onSuccess(SuccessEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java b/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java index 799093b25..2cc3b5d07 100644 --- a/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java +++ b/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java @@ -23,6 +23,7 @@ public interface IncubatorCssName { String ALERT_CONTAINER = "alert-container"; String ASYNC_BUTTON = "async-button"; + String ASYNC_ICON = "async-icon"; String TIMER_PROGRESS = "timer-progress"; String LOADING_STATE = "loading-state"; String BOUNCING = "bouncing"; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java index 763fc4e7a..d60cacd0a 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java @@ -26,17 +26,11 @@ public class LoadResult { private final List data; private final int offset; private final int totalLength; - private final boolean cacheData; public LoadResult(List data, int offset, int totalLength) { - this(data, offset, totalLength, true); - } - - public LoadResult(List data, int offset, int totalLength, boolean cacheData) { this.data = data; this.offset = offset; this.totalLength = totalLength; - this.cacheData = cacheData; } /** diff --git a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css b/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css index c6440e6a2..aec967d9c 100644 --- a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css +++ b/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css @@ -4,18 +4,33 @@ padding-left: 60px; transition: 0.4s all; } -.async-button .spinner-layer { + +.async-button .spinner-layer, .async-icon .spinner-layer { display: none; position: absolute; width: 20px; height: 20px; - top: 8px; z-index: 1003; +} + +.async-button .spinner-layer { + top: 8px; left: 20px; } -.async-button.active .spinner-layer { + +.async-button.active .spinner-layer, .async-icon.active .spinner-layer { display: block; } + .async-button.active i, .async-button.active span { color: black !important; +} + +.async-icon.active { + position: relative; +} + +.async-icon .spinner-layer { + top: -8px; + left: 2px; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css b/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css index 6e4dd3507..6136bd315 100644 --- a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css @@ -1 +1,24 @@ -.async-button.active{background:#fff;position:relative;padding-left:60px;transition:.4s all}.async-button .spinner-layer{display:none;position:absolute;width:20px;height:20px;top:8px;z-index:1003;left:20px}.async-button.active .spinner-layer{display:block}.async-button.active i,.async-button.active span{color:#000!important} \ No newline at end of file +.async-icon.active i, .async-button.active i { + -webkit-animation: spin 400ms linear infinite; + -moz-animation: spin 400ms linear infinite; + animation: spin 400ms linear infinite; +} + +@-moz-keyframes spin { + 100% { + -moz-transform: rotate(360deg); + } +} + +@-webkit-keyframes spin { + 100% { + -webkit-transform: rotate(360deg); + } +} + +@keyframes spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} \ No newline at end of file From 51248a81064b3d17143c3a712489440c5aada1b1 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 26 Jul 2018 13:27:42 +0800 Subject: [PATCH 008/247] InfiniteScrollPanel - Visibility DOM Optimization --- .../client/async/AbstractAsyncButton.java | 22 ++++- .../infinitescroll/DefaultScrollRecycler.java | 83 +++++++++++++++++++ .../infinitescroll/InfiniteScrollPanel.java | 35 +++++++- ...lLoader.java => ScrollLoadingSpinner.java} | 4 +- .../client/infinitescroll/ScrollRecycler.java | 15 ++++ .../infinitescroll/constants/RecycleType.java | 7 ++ .../constants/RecycleViewPosition.java | 7 ++ .../infinitescroll/events/LoadedEvent.java | 1 + 8 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java rename src/main/java/gwt/material/design/incubator/client/infinitescroll/{ScrollLoader.java => ScrollLoadingSpinner.java} (94%) create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java diff --git a/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java b/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java index 98a90aec1..d8a771d2e 100644 --- a/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java +++ b/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java @@ -25,6 +25,7 @@ import gwt.material.design.client.base.mixin.ActiveMixin; import gwt.material.design.client.constants.IconPosition; import gwt.material.design.client.constants.IconType; +import gwt.material.design.client.ui.html.Icon; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.async.events.ErrorEvent; import gwt.material.design.incubator.client.async.events.HasAsyncHandlers; @@ -38,9 +39,9 @@ * Asynchronous buttons are components that is good ux for * calling the server side component and automatically updates * the states of the ui logic. - * + *

*

- * Note: This component is under the incubation process and subject to change. + * Note: This component is under the incubation process and subject to change. *

*

XML Namespace Declaration

* @@ -59,6 +60,8 @@ public abstract class AbstractAsyncButton extends AbstractIconButton } protected ActiveMixin activeMixin; + protected IconType initialIcon; + protected String initialMessage; protected IconType loadingIcon = IconType.AUTORENEW; protected IconType errorIcon = IconType.WARNING; protected IconType successIcon = IconType.CHECK; @@ -99,6 +102,21 @@ public void success(String message) { SuccessEvent.fire(this); } + public void reset(IconType iconType) { + reset(iconType, null); + } + + public void reset(String message) { + reset(null, message); + } + + public void reset(IconType iconType, String message) { + setActive(true); + + if (iconType != null) setIconType(iconType); + if (message != null) setText(message); + } + @Override public void setActive(boolean value) { getActiveMixin().setActive(value); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java new file mode 100644 index 000000000..94d5f7e25 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java @@ -0,0 +1,83 @@ +package gwt.material.design.incubator.client.infinitescroll; + +import com.google.gwt.dom.client.Style; +import com.google.gwt.user.client.ui.Widget; +import gwt.material.design.incubator.client.infinitescroll.constants.RecycleType; +import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DefaultScrollRecycler implements ScrollRecycler { + + private int loadIndex = 0; + private int currentIndex = -1; + private InfiniteScrollPanel parent; + private RecycleType type = RecycleType.VISIBILITY; + private Map> cachedWidgets = new HashMap<>(); + + public DefaultScrollRecycler(InfiniteScrollPanel parent) { + this.parent = parent; + } + + @Override + public void recycle(RecycleViewPosition position) { + if (position == RecycleViewPosition.BOTTOM) { + recycleBottom(); + } else { + recycleTop(); + } + } + + protected void recycleTop() { + if (currentIndex > 0) { + // Remove the current cached widgets + List currentWidgets = cachedWidgets.get(currentIndex); + if (currentWidgets != null) remove(currentWidgets); + + // Add the previous cached widgets + List previousWidgets = cachedWidgets.get(currentIndex - 1); + if (previousWidgets != null) add(previousWidgets); + + currentIndex--; + } + } + + protected void recycleBottom() { + // Remove the current cached widgets + List currentWidgets = cachedWidgets.get(currentIndex); + if (currentWidgets != null) remove(currentWidgets); + + // Add the previous cached widgets + if (hasCachedWidgets()) { + List nextWidgets = cachedWidgets.get(currentIndex + 1); + if (nextWidgets != null) add(nextWidgets); + } + + currentIndex++; + } + + protected void remove(List widgets) { + if (type == RecycleType.VISIBILITY) { + widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); + } + } + + protected void add(List widgets) { + if (type == RecycleType.VISIBILITY) { + widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); + } + } + + @Override + public void addWidgets(List widgets) { + cachedWidgets.put(loadIndex, widgets); // 0 + loadIndex++; + recycle(RecycleViewPosition.BOTTOM); + } + + public boolean hasCachedWidgets() { + return cachedWidgets.get(currentIndex + 1) != null; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index 0933a6652..0cc69819a 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -25,9 +25,13 @@ import gwt.material.design.client.ui.MaterialPanel; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; +import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; import gwt.material.design.incubator.client.infinitescroll.data.*; import gwt.material.design.incubator.client.infinitescroll.events.*; +import java.util.ArrayList; +import java.util.List; + import static gwt.material.design.client.js.JsMaterialElement.$; //@formatter:off @@ -55,10 +59,11 @@ public class InfiniteScrollPanel extends MaterialPanel implements HasInfinite } } - private ScrollLoader loader = new ScrollLoader(this); + private ScrollLoadingSpinner loader = new ScrollLoadingSpinner(this); private DataSource dataSource; private LoadConfig loadConfig; private Renderer renderer; + private ScrollRecycler scrollRecycler = new DefaultScrollRecycler(this); private int offset = 0; private int limit = 0; private int absoluteTotal; @@ -75,6 +80,14 @@ public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig) { this.loadConfig = loadConfig; } + public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig, ScrollRecycler viewrecycler) { + super(); + + this.dataSource = dataSource; + this.loadConfig = loadConfig; + this.scrollRecycler = viewrecycler; + } + @Override protected void onLoad() { super.onLoad(); @@ -90,8 +103,16 @@ public void load() { $(getElement()).scroll((e, param1) -> { if (!loader.isAttached()) { + if (getElement().getScrollTop() <= 0) { + scrollRecycler.recycle(RecycleViewPosition.TOP); + } + if (getElement().getScrollTop() == (getElement().getScrollHeight()) - getElement().getOffsetHeight()) { - load(offset, limit); + if (scrollRecycler.hasCachedWidgets()) { + scrollRecycler.recycle(RecycleViewPosition.BOTTOM); + } else { + load(offset, limit); + } } } return false; @@ -100,9 +121,15 @@ public void load() { addLoadedHandler(event -> { loading(false); + List widgets = new ArrayList<>(); for (T model : event.getData()) { Widget widget = renderer.render(model); add(widget); + widgets.add(widget); + } + + if (scrollRecycler != null) { + scrollRecycler.addWidgets(widgets); } }); addCompleteHandler(event -> loading(false)); @@ -140,6 +167,10 @@ public void loading(boolean show) { } } + public void setScrollRecycler(ScrollRecycler scrollRecycler) { + this.scrollRecycler = scrollRecycler; + } + public LoadConfig getLoadConfig() { return loadConfig; } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoader.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoadingSpinner.java similarity index 94% rename from src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoader.java rename to src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoadingSpinner.java index ec975fada..4f11906ea 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoadingSpinner.java @@ -30,12 +30,12 @@ import gwt.material.design.incubator.client.base.constants.IncubatorCssName; import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollDebugClientBundle; -public class ScrollLoader extends MaterialWidget { +public class ScrollLoadingSpinner extends MaterialWidget { private Span label = new Span(); private MaterialWidget container; - public ScrollLoader(MaterialWidget container) { + public ScrollLoadingSpinner(MaterialWidget container) { super(Document.get().createDivElement(), IncubatorCssName.INFINITE_SCROLL_LOADER); this.container = container; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java new file mode 100644 index 000000000..6ba8e49aa --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java @@ -0,0 +1,15 @@ +package gwt.material.design.incubator.client.infinitescroll; + +import com.google.gwt.user.client.ui.Widget; +import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; + +import java.util.List; + +public interface ScrollRecycler { + + void recycle(RecycleViewPosition position); + + void addWidgets(List widgets); + + boolean hasCachedWidgets(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java new file mode 100644 index 000000000..2dab2dd03 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java @@ -0,0 +1,7 @@ +package gwt.material.design.incubator.client.infinitescroll.constants; + +public enum RecycleType { + + VISIBILITY, + DETACH +} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java new file mode 100644 index 000000000..24c6743fb --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java @@ -0,0 +1,7 @@ +package gwt.material.design.incubator.client.infinitescroll.constants; + +public enum RecycleViewPosition { + + TOP, + BOTTOM +} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java index c44b400ea..443fdfb7f 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java @@ -22,6 +22,7 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; import java.util.List; //@formatter:off From 9b924b6719ba78531519b0eb0e6405351de7c011 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 26 Jul 2018 17:16:27 +0800 Subject: [PATCH 009/247] InfiniteScrollPanel - Initial POC --- .../infinitescroll/DefaultScrollRecycler.java | 20 +++++++++++++++++- .../infinitescroll/InfiniteScrollPanel.java | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java index 94d5f7e25..f386b05a9 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java @@ -4,17 +4,20 @@ import com.google.gwt.user.client.ui.Widget; import gwt.material.design.incubator.client.infinitescroll.constants.RecycleType; import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; +import gwt.material.design.jquery.client.api.JQueryElement; import java.util.HashMap; import java.util.List; import java.util.Map; +import static gwt.material.design.jquery.client.api.JQuery.$; + public class DefaultScrollRecycler implements ScrollRecycler { private int loadIndex = 0; private int currentIndex = -1; private InfiniteScrollPanel parent; - private RecycleType type = RecycleType.VISIBILITY; + private RecycleType type = RecycleType.DETACH; private Map> cachedWidgets = new HashMap<>(); public DefaultScrollRecycler(InfiniteScrollPanel parent) { @@ -40,6 +43,10 @@ protected void recycleTop() { List previousWidgets = cachedWidgets.get(currentIndex - 1); if (previousWidgets != null) add(previousWidgets); + // Will scroll to the way top for the widget + double val = parentElement().get(0).getScrollHeight() - (parent.getBufferTop() + parent.getBufferBottom() + parentElement().outerHeight()); + $(parent.getElement()).scrollTop((int) val); + currentIndex--; } } @@ -53,6 +60,9 @@ protected void recycleBottom() { if (hasCachedWidgets()) { List nextWidgets = cachedWidgets.get(currentIndex + 1); if (nextWidgets != null) add(nextWidgets); + + // Will scroll to the way top for the widget + $(parent.getElement()).scrollTop(parent.getBufferTop()); } currentIndex++; @@ -61,15 +71,23 @@ protected void recycleBottom() { protected void remove(List widgets) { if (type == RecycleType.VISIBILITY) { widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); + } else if (type == RecycleType.DETACH) { + widgets.forEach(widget -> widget.removeFromParent()); } } protected void add(List widgets) { if (type == RecycleType.VISIBILITY) { widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); + } else if (type == RecycleType.DETACH) { + widgets.forEach(widget -> parent.add(widget)); } } + protected JQueryElement parentElement() { + return $(parent.getElement()); + } + @Override public void addWidgets(List widgets) { cachedWidgets.put(loadIndex, widgets); // 0 diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index 0cc69819a..f63ee9651 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -68,6 +68,8 @@ public class InfiniteScrollPanel extends MaterialPanel implements HasInfinite private int limit = 0; private int absoluteTotal; private boolean completed; + private int bufferTop = 40; + private int bufferBottom = 40; public InfiniteScrollPanel() { super(); @@ -101,6 +103,9 @@ public void load() { load(offset, limit); + setPaddingTop(bufferTop); + setPaddingBottom(bufferBottom); + $(getElement()).scroll((e, param1) -> { if (!loader.isAttached()) { if (getElement().getScrollTop() <= 0) { @@ -195,6 +200,22 @@ public void setRenderer(Renderer renderer) { this.renderer = renderer; } + public int getBufferTop() { + return bufferTop; + } + + public void setBufferTop(int bufferTop) { + this.bufferTop = bufferTop; + } + + public int getBufferBottom() { + return bufferBottom; + } + + public void setBufferBottom(int bufferBottom) { + this.bufferBottom = bufferBottom; + } + @Override public HandlerRegistration addLoadingHandler(LoadingEvent.LoadingHandler handler) { return addHandler(handler, LoadingEvent.getType()); From adc1041fc48d7dabecb0edc56db3775e38d68826 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 26 Jul 2018 19:58:26 +0800 Subject: [PATCH 010/247] Infinite Scroll - ability to enable / disable recyle options --- ...Spinner.java => InfiniteScrollLoader.java} | 10 +-- .../infinitescroll/InfiniteScrollPanel.java | 81 +++++++++---------- .../client/infinitescroll/ScrollRecycler.java | 15 ---- .../infinitescroll/constants/RecycleType.java | 7 -- .../constants/RecycleViewPosition.java | 7 -- .../infinitescroll/events/LoadedEvent.java | 1 - .../RecycleManager.java} | 69 +++++++++------- .../recycle/RecycleOptions.java | 41 ++++++++++ .../recycle/RecyclePosition.java | 7 ++ .../infinitescroll/recycle/RecycleType.java | 7 ++ 10 files changed, 132 insertions(+), 113 deletions(-) rename src/main/java/gwt/material/design/incubator/client/infinitescroll/{ScrollLoadingSpinner.java => InfiniteScrollLoader.java} (80%) delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java rename src/main/java/gwt/material/design/incubator/client/infinitescroll/{DefaultScrollRecycler.java => recycle/RecycleManager.java} (53%) create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java create mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoadingSpinner.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java similarity index 80% rename from src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoadingSpinner.java rename to src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java index 4f11906ea..18086142a 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollLoadingSpinner.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java @@ -20,22 +20,18 @@ package gwt.material.design.incubator.client.infinitescroll; import com.google.gwt.dom.client.Document; -import gwt.material.design.client.MaterialDesign; import gwt.material.design.client.base.MaterialWidget; -import gwt.material.design.client.constants.SpinnerColor; import gwt.material.design.client.constants.TextAlign; import gwt.material.design.client.ui.MaterialLoader; -import gwt.material.design.client.ui.MaterialSpinner; import gwt.material.design.client.ui.html.Span; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; -import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollDebugClientBundle; -public class ScrollLoadingSpinner extends MaterialWidget { +public class InfiniteScrollLoader extends MaterialWidget { private Span label = new Span(); - private MaterialWidget container; + private InfiniteScrollPanel container; - public ScrollLoadingSpinner(MaterialWidget container) { + public InfiniteScrollLoader(InfiniteScrollPanel container) { super(Document.get().createDivElement(), IncubatorCssName.INFINITE_SCROLL_LOADER); this.container = container; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index f63ee9651..2298e931e 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -25,9 +25,10 @@ import gwt.material.design.client.ui.MaterialPanel; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; -import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; import gwt.material.design.incubator.client.infinitescroll.data.*; import gwt.material.design.incubator.client.infinitescroll.events.*; +import gwt.material.design.incubator.client.infinitescroll.recycle.RecycleManager; +import gwt.material.design.incubator.client.infinitescroll.recycle.RecyclePosition; import java.util.ArrayList; import java.util.List; @@ -59,17 +60,15 @@ public class InfiniteScrollPanel extends MaterialPanel implements HasInfinite } } - private ScrollLoadingSpinner loader = new ScrollLoadingSpinner(this); + private InfiniteScrollLoader loader; private DataSource dataSource; private LoadConfig loadConfig; private Renderer renderer; - private ScrollRecycler scrollRecycler = new DefaultScrollRecycler(this); + private RecycleManager recycleManager; private int offset = 0; private int limit = 0; private int absoluteTotal; private boolean completed; - private int bufferTop = 40; - private int bufferBottom = 40; public InfiniteScrollPanel() { super(); @@ -82,48 +81,31 @@ public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig) { this.loadConfig = loadConfig; } - public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig, ScrollRecycler viewrecycler) { - super(); - - this.dataSource = dataSource; - this.loadConfig = loadConfig; - this.scrollRecycler = viewrecycler; - } - @Override protected void onLoad() { super.onLoad(); - load(); - } - - public void load() { + loader = new InfiniteScrollLoader(this); offset = loadConfig.getOffset(); limit = loadConfig.getLimit(); + // Will first load the initial data load(offset, limit); - setPaddingTop(bufferTop); - setPaddingBottom(bufferBottom); - $(getElement()).scroll((e, param1) -> { - if (!loader.isAttached()) { + if (!isLoading()) { if (getElement().getScrollTop() <= 0) { - scrollRecycler.recycle(RecycleViewPosition.TOP); + onScrollTop(); } if (getElement().getScrollTop() == (getElement().getScrollHeight()) - getElement().getOffsetHeight()) { - if (scrollRecycler.hasCachedWidgets()) { - scrollRecycler.recycle(RecycleViewPosition.BOTTOM); - } else { - load(offset, limit); - } + onScrollBottom(); } } return false; }); - addLoadedHandler(event -> { + registerHandler(addLoadedHandler(event -> { loading(false); List widgets = new ArrayList<>(); @@ -133,11 +115,26 @@ public void load() { widgets.add(widget); } - if (scrollRecycler != null) { - scrollRecycler.addWidgets(widgets); + if (isEnableRecycling()) { + recycleManager.addWidgets(widgets); } - }); - addCompleteHandler(event -> loading(false)); + })); + + registerHandler(addCompleteHandler(event -> loading(false))); + } + + protected void onScrollBottom() { + if (isEnableRecycling() && recycleManager.hasCachedWidgets()) { + recycleManager.recycle(RecyclePosition.BOTTOM); + } else { + load(offset, limit); + } + } + + protected void onScrollTop() { + if (isEnableRecycling()) { + recycleManager.recycle(RecyclePosition.TOP); + } } protected void load(int offset, int limit) { @@ -172,8 +169,8 @@ public void loading(boolean show) { } } - public void setScrollRecycler(ScrollRecycler scrollRecycler) { - this.scrollRecycler = scrollRecycler; + public boolean isLoading() { + return loader.isAttached(); } public LoadConfig getLoadConfig() { @@ -200,20 +197,14 @@ public void setRenderer(Renderer renderer) { this.renderer = renderer; } - public int getBufferTop() { - return bufferTop; + public void setRecycleManager(RecycleManager recycleManager) { + this.recycleManager = recycleManager; + this.recycleManager.setParent(this); } - public void setBufferTop(int bufferTop) { - this.bufferTop = bufferTop; - } - - public int getBufferBottom() { - return bufferBottom; - } - public void setBufferBottom(int bufferBottom) { - this.bufferBottom = bufferBottom; + public boolean isEnableRecycling() { + return recycleManager != null; } @Override diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java deleted file mode 100644 index 6ba8e49aa..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/ScrollRecycler.java +++ /dev/null @@ -1,15 +0,0 @@ -package gwt.material.design.incubator.client.infinitescroll; - -import com.google.gwt.user.client.ui.Widget; -import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; - -import java.util.List; - -public interface ScrollRecycler { - - void recycle(RecycleViewPosition position); - - void addWidgets(List widgets); - - boolean hasCachedWidgets(); -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java deleted file mode 100644 index 2dab2dd03..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleType.java +++ /dev/null @@ -1,7 +0,0 @@ -package gwt.material.design.incubator.client.infinitescroll.constants; - -public enum RecycleType { - - VISIBILITY, - DETACH -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java deleted file mode 100644 index 24c6743fb..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/constants/RecycleViewPosition.java +++ /dev/null @@ -1,7 +0,0 @@ -package gwt.material.design.incubator.client.infinitescroll.constants; - -public enum RecycleViewPosition { - - TOP, - BOTTOM -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java index 443fdfb7f..c44b400ea 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java @@ -22,7 +22,6 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; -import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; import java.util.List; //@formatter:off diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java similarity index 53% rename from src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java rename to src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java index f386b05a9..ebd37aba9 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/DefaultScrollRecycler.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java @@ -1,9 +1,8 @@ -package gwt.material.design.incubator.client.infinitescroll; +package gwt.material.design.incubator.client.infinitescroll.recycle; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.ui.Widget; -import gwt.material.design.incubator.client.infinitescroll.constants.RecycleType; -import gwt.material.design.incubator.client.infinitescroll.constants.RecycleViewPosition; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; import gwt.material.design.jquery.client.api.JQueryElement; import java.util.HashMap; @@ -12,21 +11,24 @@ import static gwt.material.design.jquery.client.api.JQuery.$; -public class DefaultScrollRecycler implements ScrollRecycler { +public class RecycleManager { private int loadIndex = 0; private int currentIndex = -1; private InfiniteScrollPanel parent; - private RecycleType type = RecycleType.DETACH; private Map> cachedWidgets = new HashMap<>(); + private RecycleOptions options = new RecycleOptions(); - public DefaultScrollRecycler(InfiniteScrollPanel parent) { - this.parent = parent; + public RecycleManager() { + this(new RecycleOptions()); + } + + public RecycleManager(RecycleOptions options) { + this.options = options; } - @Override - public void recycle(RecycleViewPosition position) { - if (position == RecycleViewPosition.BOTTOM) { + public void recycle(RecyclePosition position) { + if (position == RecyclePosition.BOTTOM) { recycleBottom(); } else { recycleTop(); @@ -42,44 +44,43 @@ protected void recycleTop() { // Add the previous cached widgets List previousWidgets = cachedWidgets.get(currentIndex - 1); if (previousWidgets != null) add(previousWidgets); - - // Will scroll to the way top for the widget - double val = parentElement().get(0).getScrollHeight() - (parent.getBufferTop() + parent.getBufferBottom() + parentElement().outerHeight()); - $(parent.getElement()).scrollTop((int) val); - + scrollTo(parentElement().get(0).getScrollHeight() - (options.getBufferTop() + options.getBufferBottom() + parentElement().outerHeight())); currentIndex--; } } protected void recycleBottom() { // Remove the current cached widgets - List currentWidgets = cachedWidgets.get(currentIndex); - if (currentWidgets != null) remove(currentWidgets); - - // Add the previous cached widgets - if (hasCachedWidgets()) { - List nextWidgets = cachedWidgets.get(currentIndex + 1); - if (nextWidgets != null) add(nextWidgets); + if (currentIndex <= loadIndex) { + List currentWidgets = cachedWidgets.get(currentIndex); + if (currentWidgets != null) remove(currentWidgets); - // Will scroll to the way top for the widget - $(parent.getElement()).scrollTop(parent.getBufferTop()); + // Add the previous cached widgets + if (hasCachedWidgets()) { + List nextWidgets = cachedWidgets.get(currentIndex + 1); + if (nextWidgets != null) add(nextWidgets); + scrollTo(options.getBufferTop()); + } + currentIndex++; } + } - currentIndex++; + protected void scrollTo(int value) { + $(parent.getElement()).scrollTop(value); } protected void remove(List widgets) { - if (type == RecycleType.VISIBILITY) { + if (options.getType() == RecycleType.VISIBILITY) { widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); - } else if (type == RecycleType.DETACH) { + } else if (options.getType() == RecycleType.DETACH) { widgets.forEach(widget -> widget.removeFromParent()); } } protected void add(List widgets) { - if (type == RecycleType.VISIBILITY) { + if (options.getType() == RecycleType.VISIBILITY) { widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); - } else if (type == RecycleType.DETACH) { + } else if (options.getType() == RecycleType.DETACH) { widgets.forEach(widget -> parent.add(widget)); } } @@ -88,14 +89,20 @@ protected JQueryElement parentElement() { return $(parent.getElement()); } - @Override public void addWidgets(List widgets) { cachedWidgets.put(loadIndex, widgets); // 0 loadIndex++; - recycle(RecycleViewPosition.BOTTOM); + recycle(RecyclePosition.BOTTOM); } public boolean hasCachedWidgets() { return cachedWidgets.get(currentIndex + 1) != null; } + + public void setParent(InfiniteScrollPanel parent) { + this.parent = parent; + + parent.setPaddingBottom(options.getBufferBottom()); + parent.setPaddingTop(options.getBufferTop()); + } } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java new file mode 100644 index 000000000..5c6412d36 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java @@ -0,0 +1,41 @@ +package gwt.material.design.incubator.client.infinitescroll.recycle; + +public class RecycleOptions { + + private int bufferTop = 40; + private int bufferBottom = 40; + private RecycleType type = RecycleType.DETACH; + + public RecycleOptions() { + } + + public RecycleOptions(int bufferTop, int bufferBottom, RecycleType type) { + this.bufferTop = bufferTop; + this.bufferBottom = bufferBottom; + this.type = type; + } + + public int getBufferTop() { + return bufferTop; + } + + public void setBufferTop(int bufferTop) { + this.bufferTop = bufferTop; + } + + public int getBufferBottom() { + return bufferBottom; + } + + public void setBufferBottom(int bufferBottom) { + this.bufferBottom = bufferBottom; + } + + public RecycleType getType() { + return type; + } + + public void setType(RecycleType type) { + this.type = type; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java new file mode 100644 index 000000000..d0f76fe78 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java @@ -0,0 +1,7 @@ +package gwt.material.design.incubator.client.infinitescroll.recycle; + +public enum RecyclePosition { + + TOP, + BOTTOM +} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java new file mode 100644 index 000000000..30888bab0 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java @@ -0,0 +1,7 @@ +package gwt.material.design.incubator.client.infinitescroll.recycle; + +public enum RecycleType { + + VISIBILITY, + DETACH +} From afa0910fabbefb78f8582283a94fdc53d2429835 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 27 Jul 2018 10:34:41 +0800 Subject: [PATCH 011/247] InfiniteScrollPanel - Refactors --- .../infinitescroll/InfiniteScrollPanel.java | 26 ++++++---- .../infinitescroll/data/LoadResult.java | 5 -- .../infinitescroll/events/CompleteEvent.java | 14 ++++-- .../infinitescroll/events/LoadedEvent.java | 17 ++++--- .../infinitescroll/events/LoadingEvent.java | 20 ++++++-- .../recycle/RecycleManager.java | 48 +++++++++++-------- .../infinitescroll/recycle/RecycleType.java | 2 +- 7 files changed, 80 insertions(+), 52 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index 2298e931e..497a15fce 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -67,7 +67,6 @@ public class InfiniteScrollPanel extends MaterialPanel implements HasInfinite private RecycleManager recycleManager; private int offset = 0; private int limit = 0; - private int absoluteTotal; private boolean completed; public InfiniteScrollPanel() { @@ -89,7 +88,6 @@ protected void onLoad() { offset = loadConfig.getOffset(); limit = loadConfig.getLimit(); - // Will first load the initial data load(offset, limit); $(getElement()).scroll((e, param1) -> { @@ -109,7 +107,7 @@ protected void onLoad() { loading(false); List widgets = new ArrayList<>(); - for (T model : event.getData()) { + for (T model : event.getResult().getData()) { Widget widget = renderer.render(model); add(widget); widgets.add(widget); @@ -120,11 +118,14 @@ protected void onLoad() { } })); - registerHandler(addCompleteHandler(event -> loading(false))); + registerHandler(addCompleteHandler(event -> { + loading(false); + completed = true; + })); } protected void onScrollBottom() { - if (isEnableRecycling() && recycleManager.hasCachedWidgets()) { + if (isEnableRecycling() && recycleManager.hasRecycledWidgets()) { recycleManager.recycle(RecyclePosition.BOTTOM); } else { load(offset, limit); @@ -143,13 +144,11 @@ protected void load(int offset, int limit) { dataSource.load(new LoadConfig<>(offset, limit), new LoadCallback() { @Override public void onSuccess(LoadResult loadResult) { - LoadedEvent.fire(InfiniteScrollPanel.this, loadResult.getData()); + LoadedEvent.fire(InfiniteScrollPanel.this, loadResult); InfiniteScrollPanel.this.offset = InfiniteScrollPanel.this.offset + limit; - absoluteTotal = loadResult.getTotalLength(); - if (InfiniteScrollPanel.this.offset >= absoluteTotal) { - CompleteEvent.fire(InfiniteScrollPanel.this); - completed = true; + if (InfiniteScrollPanel.this.offset >= loadResult.getTotalLength()) { + CompleteEvent.fire(InfiniteScrollPanel.this, loadResult.getTotalLength()); } } @@ -202,6 +201,13 @@ public void setRecycleManager(RecycleManager recycleManager) { this.recycleManager.setParent(this); } + public InfiniteScrollLoader getLoader() { + return loader; + } + + public RecycleManager getRecycleManager() { + return recycleManager; + } public boolean isEnableRecycling() { return recycleManager != null; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java index d60cacd0a..5a5e0e419 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/data/LoadResult.java @@ -49,11 +49,6 @@ public int getOffset() { /** * Return total length of the data. - *
- *
    - *
  • For non-paging requests equals size of the data.
  • - *
  • For paging requests should equals total number of records
  • - *
*/ public int getTotalLength() { return totalLength; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java index 92ac28a70..eb2d57c74 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java @@ -31,14 +31,18 @@ public class CompleteEvent extends GwtEvent { public static final Type TYPE = new Type<>(); - public CompleteEvent() {} + private int total; + + public CompleteEvent(int total) { + this.total = total; + } public static Type getType() { return TYPE; } - public static void fire(HasHandlers source) { - source.fireEvent(new CompleteEvent()); + public static void fire(HasHandlers source, int total) { + source.fireEvent(new CompleteEvent(total)); } @Override @@ -51,6 +55,10 @@ protected void dispatch(CompleteHandler handler) { handler.onComplete(this); } + public int getTotal() { + return total; + } + public interface CompleteHandler extends EventHandler { void onComplete(CompleteEvent event); } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java index c44b400ea..1a0e68296 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java @@ -22,8 +22,7 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; - -import java.util.List; +import gwt.material.design.incubator.client.infinitescroll.data.LoadResult; //@formatter:off /** @@ -31,15 +30,15 @@ */ public class LoadedEvent extends GwtEvent> { - private List data; + private LoadResult result; private static Type> TYPE; - public LoadedEvent(List data) { - this.data = data; + public LoadedEvent(LoadResult result) { + this.result = result; } - public static void fire(HasHandlers source, List data) { - source.fireEvent(new LoadedEvent(data)); + public static void fire(HasHandlers source, LoadResult result) { + source.fireEvent(new LoadedEvent(result)); } @Override @@ -56,8 +55,8 @@ protected void dispatch(LoadHandler handler) { handler.onItemLoaded(this); } - public List getData() { - return data; + public LoadResult getResult() { + return result; } public interface LoadHandler extends EventHandler { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java index 795f318fc..bcfcf8e0c 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java @@ -31,14 +31,20 @@ public class LoadingEvent extends GwtEvent { public static final Type TYPE = new Type<>(); - public LoadingEvent() {} + private int startIndex; + private int lastIndex; + + public LoadingEvent(int startIndex, int lastIndex) { + this.startIndex = startIndex; + this.lastIndex = lastIndex; + } public static Type getType() { return TYPE; } - public static void fire(HasHandlers source) { - source.fireEvent(new LoadingEvent()); + public static void fire(HasHandlers source, int startIndex, int lastIndex) { + source.fireEvent(new LoadingEvent(startIndex, lastIndex)); } @Override @@ -51,6 +57,14 @@ protected void dispatch(LoadingHandler handler) { handler.onLoading(this); } + public int getStartIndex() { + return startIndex; + } + + public int getLastIndex() { + return lastIndex; + } + public interface LoadingHandler extends EventHandler { void onLoading(LoadingEvent event); } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java index ebd37aba9..d4e956e70 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java @@ -16,7 +16,7 @@ public class RecycleManager { private int loadIndex = 0; private int currentIndex = -1; private InfiniteScrollPanel parent; - private Map> cachedWidgets = new HashMap<>(); + private Map> recycledWidgets = new HashMap<>(); private RecycleOptions options = new RecycleOptions(); public RecycleManager() { @@ -37,12 +37,12 @@ public void recycle(RecyclePosition position) { protected void recycleTop() { if (currentIndex > 0) { - // Remove the current cached widgets - List currentWidgets = cachedWidgets.get(currentIndex); + // Remove the current recycled widgets + List currentWidgets = recycledWidgets.get(currentIndex); if (currentWidgets != null) remove(currentWidgets); - // Add the previous cached widgets - List previousWidgets = cachedWidgets.get(currentIndex - 1); + // Add the previous recycled widgets + List previousWidgets = recycledWidgets.get(currentIndex - 1); if (previousWidgets != null) add(previousWidgets); scrollTo(parentElement().get(0).getScrollHeight() - (options.getBufferTop() + options.getBufferBottom() + parentElement().outerHeight())); currentIndex--; @@ -50,14 +50,14 @@ protected void recycleTop() { } protected void recycleBottom() { - // Remove the current cached widgets + // Remove the current recycled widgets if (currentIndex <= loadIndex) { - List currentWidgets = cachedWidgets.get(currentIndex); + List currentWidgets = recycledWidgets.get(currentIndex); if (currentWidgets != null) remove(currentWidgets); - // Add the previous cached widgets - if (hasCachedWidgets()) { - List nextWidgets = cachedWidgets.get(currentIndex + 1); + // Add the previous recycled widgets + if (hasRecycledWidgets()) { + List nextWidgets = recycledWidgets.get(currentIndex + 1); if (nextWidgets != null) add(nextWidgets); scrollTo(options.getBufferTop()); } @@ -70,18 +70,24 @@ protected void scrollTo(int value) { } protected void remove(List widgets) { - if (options.getType() == RecycleType.VISIBILITY) { - widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); - } else if (options.getType() == RecycleType.DETACH) { - widgets.forEach(widget -> widget.removeFromParent()); + switch (options.getType()) { + case DETACH: + widgets.forEach(widget -> widget.removeFromParent()); + break; + case DISPLAY: + widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); + break; } } protected void add(List widgets) { - if (options.getType() == RecycleType.VISIBILITY) { - widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); - } else if (options.getType() == RecycleType.DETACH) { - widgets.forEach(widget -> parent.add(widget)); + switch (options.getType()) { + case DETACH: + widgets.forEach(widget -> parent.add(widget)); + break; + case DISPLAY: + widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); + break; } } @@ -90,13 +96,13 @@ protected JQueryElement parentElement() { } public void addWidgets(List widgets) { - cachedWidgets.put(loadIndex, widgets); // 0 + recycledWidgets.put(loadIndex, widgets); loadIndex++; recycle(RecyclePosition.BOTTOM); } - public boolean hasCachedWidgets() { - return cachedWidgets.get(currentIndex + 1) != null; + public boolean hasRecycledWidgets() { + return recycledWidgets.get(currentIndex + 1) != null; } public void setParent(InfiniteScrollPanel parent) { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java index 30888bab0..a42ac0981 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java @@ -2,6 +2,6 @@ public enum RecycleType { - VISIBILITY, + DISPLAY, DETACH } From 8fd0539fd1160525906c5e462111f6d914f37996 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 27 Jul 2018 11:19:36 +0800 Subject: [PATCH 012/247] Added support for Reloading the InfiniteScrollPanel --- .../infinitescroll/InfiniteScrollPanel.java | 36 ++++++++++++++----- .../recycle/RecycleManager.java | 15 ++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index 497a15fce..e691278cf 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -23,6 +23,7 @@ import com.google.gwt.user.client.ui.Widget; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.ui.MaterialPanel; +import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.infinitescroll.data.*; @@ -74,7 +75,7 @@ public InfiniteScrollPanel() { } public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig) { - super(); + this(); this.dataSource = dataSource; this.loadConfig = loadConfig; @@ -84,12 +85,6 @@ public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig) { protected void onLoad() { super.onLoad(); - loader = new InfiniteScrollLoader(this); - offset = loadConfig.getOffset(); - limit = loadConfig.getLimit(); - - load(offset, limit); - $(getElement()).scroll((e, param1) -> { if (!isLoading()) { if (getElement().getScrollTop() <= 0) { @@ -105,7 +100,7 @@ protected void onLoad() { registerHandler(addLoadedHandler(event -> { loading(false); - + MaterialToast.fireToast("TEST"); List widgets = new ArrayList<>(); for (T model : event.getResult().getData()) { Widget widget = renderer.render(model); @@ -122,6 +117,16 @@ protected void onLoad() { loading(false); completed = true; })); + + load(); + } + + protected void load() { + loader = new InfiniteScrollLoader(this); + offset = loadConfig.getOffset(); + limit = loadConfig.getLimit(); + + load(offset, limit); } protected void onScrollBottom() { @@ -160,6 +165,21 @@ public void onFailure(Throwable caught) { } } + public void unload() { + clear(); + offset = 0; + limit = 0; + completed = false; + if (isEnableRecycling()) { + recycleManager.unload(); + } + } + + public void reload() { + unload(); + load(); + } + public void loading(boolean show) { if (show) { loader.show(); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java index d4e956e70..ddbbb9751 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java @@ -5,6 +5,7 @@ import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; import gwt.material.design.jquery.client.api.JQueryElement; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -105,10 +106,24 @@ public boolean hasRecycledWidgets() { return recycledWidgets.get(currentIndex + 1) != null; } + public List getRecycledWidgets() { + List widgets = new ArrayList<>(); + for (Integer recycledIndex : recycledWidgets.keySet()) { + widgets.addAll(recycledWidgets.get(recycledIndex)); + } + return widgets; + } + public void setParent(InfiniteScrollPanel parent) { this.parent = parent; parent.setPaddingBottom(options.getBufferBottom()); parent.setPaddingTop(options.getBufferTop()); } + + public void unload() { + loadIndex = 0; + currentIndex = -1; + recycledWidgets = new HashMap<>(); + } } From 355af12ea97cb6abd66f6c6629c4be21ba169484 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 27 Jul 2018 13:42:27 +0800 Subject: [PATCH 013/247] Infinite Scroll - Standardization --- .../InfiniteScrollClientBundle.java | 7 + .../InfiniteScrollDebugClientBundle.java | 7 + .../infinitescroll/InfiniteScrollLoader.java | 20 ++ .../infinitescroll/InfiniteScrollPanel.java | 186 ++++++++++++--- .../infinitescroll/events/CompleteEvent.java | 3 + .../infinitescroll/events/ErrorEvent.java | 3 + .../events/HasInfiniteScrollHandlers.java | 7 + .../infinitescroll/events/LoadedEvent.java | 2 + .../infinitescroll/events/LoadingEvent.java | 2 + .../client/infinitescroll/js/Controller.java | 70 ------ .../client/infinitescroll/js/PinSettings.java | 45 ---- .../client/infinitescroll/js/Scene.java | 216 ------------------ .../infinitescroll/js/SceneOptions.java | 93 -------- .../recycle/RecycleManager.java | 115 ++++++---- .../recycle/RecycleOptions.java | 41 ---- .../recycle/RecyclePosition.java | 13 ++ .../infinitescroll/recycle/RecycleType.java | 12 + 17 files changed, 303 insertions(+), 539 deletions(-) delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Controller.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/js/PinSettings.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Scene.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/js/SceneOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollClientBundle.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollClientBundle.java index 0a0ba4dff..f9b8f7955 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollClientBundle.java @@ -23,6 +23,13 @@ import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.TextResource; +//@formatter:off + +/** + * Client Bundle for {@link InfiniteScrollPanel} + * + * @author kevzlou7979 + */ public interface InfiniteScrollClientBundle extends ClientBundle { InfiniteScrollClientBundle INSTANCE = GWT.create(InfiniteScrollClientBundle.class); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollDebugClientBundle.java index 0e6ad5f8e..6926863ec 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollDebugClientBundle.java @@ -23,6 +23,13 @@ import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.TextResource; +//@formatter:off + +/** + * Debug Client Bundle for {@link InfiniteScrollPanel} + * + * @author kevzlou7979 + */ public interface InfiniteScrollDebugClientBundle extends ClientBundle { InfiniteScrollDebugClientBundle INSTANCE = GWT.create(InfiniteScrollDebugClientBundle.class); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java index 18086142a..c1706b533 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java @@ -26,6 +26,13 @@ import gwt.material.design.client.ui.html.Span; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; +//@formatter:off + +/** + * Scroll Loader widget - shown when loading data thru {@link InfiniteScrollPanel#load(int, int)} + * + * @author kevzlou7979 + */ public class InfiniteScrollLoader extends MaterialWidget { private Span label = new Span(); @@ -50,13 +57,26 @@ protected void onLoad() { add(label); } + /** + * Will attach a loader to it's container + */ public void show() { MaterialLoader.loading(true, this); container.add(this); } + /** + * Will detach a loader to it's container + */ public void hide() { MaterialLoader.loading(false); removeFromParent(); } + + /** + * Will check if the loading indicator still attached to it's container + */ + public boolean isLoading() { + return isAttached(); + } } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index e691278cf..e9985c637 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -19,11 +19,11 @@ */ package gwt.material.design.incubator.client.infinitescroll; +import com.google.gwt.dom.client.Style; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Widget; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.ui.MaterialPanel; -import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.infinitescroll.data.*; @@ -68,6 +68,8 @@ public class InfiniteScrollPanel extends MaterialPanel implements HasInfinite private RecycleManager recycleManager; private int offset = 0; private int limit = 0; + private int bufferTop = 40; + private int bufferBottom = 40; private boolean completed; public InfiniteScrollPanel() { @@ -85,6 +87,7 @@ public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig) { protected void onLoad() { super.onLoad(); + // Will setup the scroll events to determin if scrolls top / bottom. $(getElement()).scroll((e, param1) -> { if (!isLoading()) { if (getElement().getScrollTop() <= 0) { @@ -98,21 +101,12 @@ protected void onLoad() { return false; }); + // Will register all initial event handlers + registerHandler(addLoadingHandler(event -> loading(true))); registerHandler(addLoadedHandler(event -> { loading(false); - MaterialToast.fireToast("TEST"); - List widgets = new ArrayList<>(); - for (T model : event.getResult().getData()) { - Widget widget = renderer.render(model); - add(widget); - widgets.add(widget); - } - - if (isEnableRecycling()) { - recycleManager.addWidgets(widgets); - } + render(event.getResult().getData()); })); - registerHandler(addCompleteHandler(event -> { loading(false); completed = true; @@ -121,31 +115,26 @@ protected void onLoad() { load(); } + /** + * Will load the initial data and initialize the buffer top and bottom + * of the scroll panel providing a target threshold on scrolling both top / bottom positions. + */ protected void load() { loader = new InfiniteScrollLoader(this); offset = loadConfig.getOffset(); limit = loadConfig.getLimit(); - + setPaddingTop(bufferTop); + setPaddingBottom(bufferBottom); load(offset, limit); } - protected void onScrollBottom() { - if (isEnableRecycling() && recycleManager.hasRecycledWidgets()) { - recycleManager.recycle(RecyclePosition.BOTTOM); - } else { - load(offset, limit); - } - } - - protected void onScrollTop() { - if (isEnableRecycling()) { - recycleManager.recycle(RecyclePosition.TOP); - } - } - + /** + * Will load the provided offset and limit with the datasource provided via + * {@link this#setDataSource(DataSource)} + */ protected void load(int offset, int limit) { if (!completed) { - loading(true); + LoadingEvent.fire(this, offset, offset + (limit - 1)); dataSource.load(new LoadConfig<>(offset, limit), new LoadCallback() { @Override public void onSuccess(LoadResult loadResult) { @@ -165,6 +154,58 @@ public void onFailure(Throwable caught) { } } + /** + * Will render the provided data result with the provided {@link Renderer}. + * This method will also check if recycling is enabled (You can turn on recycling by setting {@link this#setRecycleManager(RecycleManager)}. + */ + private void render(List data) { + List widgets = new ArrayList<>(); + for (T model : data) { + Widget widget = renderer.render(model); + add(widget); + widgets.add(widget); + } + + // Check if recycling is enabled + if (isEnableRecycling()) { + recycleManager.addWidgets(widgets); + } + + // Will force the scroll panel to have a scroll if it isn't visible + if (!hasScrollBar()) { + int height = $(widgets.get(0).getElement()).outerHeight(); + getElement().getStyle().setHeight(height, Style.Unit.PX); + } + } + + /** + * Will be called once the scroll bar reached at the bottom of the scroll panel. + * This will load the current {@link this#offset} and {@link this#limit} and will + * check if recycling is enabled. + */ + protected void onScrollBottom() { + if (isEnableRecycling() && recycleManager.hasRecycledWidgets()) { + recycleManager.recycle(RecyclePosition.BOTTOM); + } else { + load(offset, limit); + } + } + + /** + * Will be called once the scroll bar reached at the top of the scroll panel. + * This will load the current {@link this#offset} and {@link this#limit} and will + * check if recycling is enabled. + */ + protected void onScrollTop() { + if (isEnableRecycling()) { + recycleManager.recycle(RecyclePosition.TOP); + } + } + + /** + * Will clear the scroll panel children and reset it's initial properties. + * If Recycling is enabled will unload it via {@link RecycleManager#unload()} + */ public void unload() { clear(); offset = 0; @@ -175,11 +216,17 @@ public void unload() { } } + /** + * Will reload the entire ScrollPanel setup + */ public void reload() { unload(); load(); } + /** + * Will display or hide the loading indicator upon reaching the target threshold. + */ public void loading(boolean show) { if (show) { loader.show(); @@ -188,51 +235,120 @@ public void loading(boolean show) { } } + /** + * Determine if there's currently data that still loading. + */ public boolean isLoading() { - return loader.isAttached(); + return loader.isLoading(); + } + + /** + * Determine if scroll bar is present in the scroll panel + */ + public boolean hasScrollBar() { + return $(getElement()).get(0).getScrollHeight() > $(getElement()).outerHeight(); } + /** + * Get the load configuration + */ public LoadConfig getLoadConfig() { return loadConfig; } + /** + * Set the load configuration + */ public void setLoadConfig(LoadConfig loadConfig) { this.loadConfig = loadConfig; } + /** + * Get the datasource + */ public DataSource getDataSource() { return dataSource; } + /** + * Set the datasource + */ public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } + /** + * Get the widget renderer + */ public Renderer getRenderer() { return renderer; } + /** + * Set the widget renderer + */ public void setRenderer(Renderer renderer) { this.renderer = renderer; } - public void setRecycleManager(RecycleManager recycleManager) { - this.recycleManager = recycleManager; - this.recycleManager.setParent(this); - } - + /** + * Get the loader widget + */ public InfiniteScrollLoader getLoader() { return loader; } + /** + * Get the recycling manager + */ public RecycleManager getRecycleManager() { return recycleManager; } + /** + * If set then recycling mechanism will be enabled, Else will provide a default + * infinite scrolling logic. + */ + public void setRecycleManager(RecycleManager recycleManager) { + this.recycleManager = recycleManager; + this.recycleManager.setParent(this); + } + + /** + * Check if recyling is enabled + */ public boolean isEnableRecycling() { return recycleManager != null; } + /** + * Get the buffer top + */ + public int getBufferTop() { + return bufferTop; + } + + /** + * Set the buffer top + */ + public void setBufferTop(int bufferTop) { + this.bufferTop = bufferTop; + } + + /** + * Get the buffer bottom + */ + public int getBufferBottom() { + return bufferBottom; + } + + /** + * Set the buffer bottom + */ + public void setBufferBottom(int bufferBottom) { + this.bufferBottom = bufferBottom; + } + @Override public HandlerRegistration addLoadingHandler(LoadingEvent.LoadingHandler handler) { return addHandler(handler, LoadingEvent.getType()); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java index eb2d57c74..1e121fb4a 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/CompleteEvent.java @@ -22,9 +22,12 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.infinitescroll.data.DataSource; //@formatter:off /** + * Fired whenever we pulled all the data provided in datasource. + * * @author kevzlou7979 */ public class CompleteEvent extends GwtEvent { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/ErrorEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/ErrorEvent.java index 23749b85d..ecb5c52bf 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/ErrorEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/ErrorEvent.java @@ -22,9 +22,12 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; + //@formatter:off /** + * Fired when the Infinite Scroll failed to retrieve the data + * * @author kevzlou7979 */ public class ErrorEvent extends GwtEvent { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/HasInfiniteScrollHandlers.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/HasInfiniteScrollHandlers.java index d850bfc98..4ed25f84b 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/HasInfiniteScrollHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/HasInfiniteScrollHandlers.java @@ -21,6 +21,13 @@ import com.google.gwt.event.shared.HandlerRegistration; +//@formatter:off + +/** + * Set of Infinite Scroll handlers + * + * @author kevzlou7979 + */ public interface HasInfiniteScrollHandlers { HandlerRegistration addLoadingHandler(LoadingEvent.LoadingHandler handler); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java index 1a0e68296..b66f83213 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadedEvent.java @@ -26,6 +26,8 @@ //@formatter:off /** + * Fired whenever the data is loaded. + * * @author kevzlou7979 */ public class LoadedEvent extends GwtEvent> { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java index bcfcf8e0c..7454eadb2 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/events/LoadingEvent.java @@ -25,6 +25,8 @@ //@formatter:off /** + * Fire whenever the infinite scroll still loading the data from data source. + * * @author kevzlou7979 */ public class LoadingEvent extends GwtEvent { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Controller.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Controller.java deleted file mode 100644 index 5a4481703..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Controller.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.infinitescroll.js; - -import gwt.material.design.jquery.client.api.JQueryElement; -import jsinterop.annotations.JsMethod; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -/** - * JSInterop utils for ScrollMagic.Controller - * - * @author kevzlou7979 - */ -@JsType(isNative = true, namespace = "ScrollMagic") -public class Controller extends JQueryElement { - - @JsMethod - public native Controller addScene(Scene scene); - - @JsMethod - public native void destroy(boolean resetScenes); - - @JsMethod - public native Controller removeScene(Scene scene); - - @JsMethod - public native Controller scrollTo(Object scrollTarget, Object additionalParameter); - - @JsMethod - public native Controller update(boolean immediately); - - @JsMethod - public native Controller updateScene(Scene scene, boolean immediately); - - @JsMethod - public native Controller enabled(boolean enabled); - - @JsMethod - public native boolean enabled(); - - @JsMethod - public native Controller loglevel(int loglevel); - - @JsMethod - public native int loglevel(); - - @JsMethod - public native Controller scrollPos(int scrollPos); - - @JsMethod - public native int scrollPos(); -} \ No newline at end of file diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/PinSettings.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/PinSettings.java deleted file mode 100644 index 4938e1dc1..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/PinSettings.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.infinitescroll.js; - -import gwt.material.design.jscore.client.api.core.Element; -import jsinterop.annotations.JsProperty; - -/** - * Pin Settings set in {@link Scene#setPin(Element, PinSettings)} - * - * @author kevzlou7979@gmail.com - * @see Official Documentation - */ -public class PinSettings { - - /** - * If true following elements will be "pushed" down for the duration of the pin, if false the pinned element will - * just scroll past them. Ignored, when duration is 0. Default to true - */ - @JsProperty - public boolean pushFollowers; - - /** - * Classname of the pin spacer element, which is used to replace the element. Default to "scrollmagic-pin-spacer" - */ - @JsProperty - public String spacerClass; -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Scene.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Scene.java deleted file mode 100644 index d285d044e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/Scene.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.infinitescroll.js; - -import gwt.material.design.jquery.client.api.JQueryElement; -import gwt.material.design.jscore.client.api.core.Element; -import jsinterop.annotations.JsMethod; -import jsinterop.annotations.JsType; - -/** - * JSInterop utils for ScrollMagic.Scene - * - * @author kevzlou7979 - */ -@JsType(isNative = true, namespace = "ScrollMagic") -public class Scene extends JQueryElement { - - /** - * A Scene defines where the controller should react and how. - */ - public Scene(SceneOptions options) {} - - /** - * Add the scene to a controller. - * - * @param controller The controller to which the scene should be added. - */ - @JsMethod - public native Scene addTo(Controller controller); - - /** - * Get the associated controller. - * - * @return Parent controller or undefined - */ - @JsMethod - public native Controller controller(); - - /** - * Destroy the scene and everything. - * - * @param reset If true the pin and tween (if existent) will be reset. - */ - @JsMethod - public native void destroy(boolean reset); - - /** - * Get or Set the scene's progress. - * Usually it shouldn't be necessary to use this as a setter, as it is set automatically by scene.update(). - * The order in which the events are fired depends on the duration of the scene: - *

- * Scenes with duration == 0: - * Scenes that have no duration by definition have no ending. Thus the end event will never be fired. - * When the trigger position of the scene is passed the events are always fired in this order: - * enter, start, progress when scrolling forward - * and - * progress, start, leave when scrolling in reverse - * Scenes with duration > 0: - * Scenes with a set duration have a defined start and end point. - * When scrolling past the start position of the scene it will fire these events in this order: - * enter, start, progress - * When continuing to scroll and passing the end point it will fire these events: - * progress, end, leave - * When reversing through the end point these events are fired: - * enter, end, progress - * And when continuing to scroll past the start position in reverse it will fire: - * progress, start, leave - * In between start and end the progress event will be called constantly, whenever the progress changes. - * - * @return - */ - @JsMethod - public native int progress(); - - /** - * Updates dynamic scene variables like the trigger element position or the duration. This method is automatically - * called in regular intervals from the controller. See ScrollMagic.Controller option refreshInterval. You can call - * it to minimize lag, for example when you intentionally change the position of the triggerElement. If you don't it - * will simply be updated in the next refresh interval of the container, which is usually sufficient. - */ - @JsMethod - public native Scene refresh(); - - /** - * Remove the scene from the controller. This is the equivalent to Controller.removeScene(scene). The scene will not - * be updated anymore until you readd it to a controller. To remove the pin or the tween you need to call removeTween() - * or removePin() respectively. - * - * @return Parent object for chaining. - */ - @JsMethod - public native Scene remove(); - - /** - * Remove the class binding from the scene. - * - * @param reset If false and the classes are currently active, they will remain on the element. If true they will be removed. - */ - @JsMethod - public native Scene removeClassToggle(boolean reset); - - /** - * Remove the pin from the scene. - * - * @param reset If false the spacer will not be removed and the element's position will not be reset. - */ - @JsMethod - public native Scene removePin(boolean reset); - - /** - * Define a css class modification while the scene is active. When the scene triggers the classes will be added to - * the supplied element and removed, when the scene is over. If the scene duration is 0 the classes will only be - * removed if the user scrolls back past the start position. - * - * @param element A Selector targeting one or more elements or a DOM object that is supposed to be modified. - * @param classes One or more Classnames (separated by space) that should be added to the element during the scene. - * @return - */ - @JsMethod - public native Scene setClassToggle(Element element, String classes); - - /** - * Pin an element for the duration of the tween. If the scene duration is 0 the element will only be unpinned, if - * the user scrolls back past the start position. Make sure only one pin is applied to an element at the same time. - * An element can be pinned multiple times, but only successively. NOTE: The option pushFollowers has no effect, - * when the scene duration is 0. - * - * @param element A Selector targeting an element or a DOM object that is supposed to be pinned. - * @param settings Settings for the pin - */ - @JsMethod - public native Scene setPin(Element element, PinSettings settings); - - /** - * Updates the Scene to reflect the current state. This is the equivalent to Controller.updateScene(scene, immediately). - * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, - * duration and offset) and checks it against the current scroll position of the container. It then updates the - * current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their - * correct position and tweens will be updated to their correct progress. This means an update doesn't necessarily - * result in a progress change. The progress event will be fired if the progress has indeed changed between this - * update and the last. - *

- * NOTE: This method gets called constantly whenever ScrollMagic detects a change. The only application for - * you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters. - *

- * - * @param immediately If true the update will be instant, if false it will wait until next update cycle (better performance). - */ - @JsMethod - public native void update(boolean immediately); - - @JsMethod - public native void duration(int duration); - - @JsMethod - public native int duration(); - - @JsMethod - public native void enabled(boolean enabled); - - @JsMethod - public native boolean enabled(); - - @JsMethod - public native void loglevel(int loglevel); - - @JsMethod - public native int loglevel(); - - @JsMethod - public native void offset(double newOffset); - - @JsMethod - public native void reverse(boolean reverse); - - @JsMethod - public native boolean reverse(); - - @JsMethod - public native void triggerElement(Object triggerElement); - - @JsMethod - public native Object triggerElement(); - - @JsMethod - public native void triggerHook(int triggerHook); - - @JsMethod - public native int triggerHook(); - - @JsMethod - public native int scrollOffset(); - - @JsMethod - public native String state(); - - @JsMethod - public native int triggerPosition(); -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/SceneOptions.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/SceneOptions.java deleted file mode 100644 index 1d935c66e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/js/SceneOptions.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.infinitescroll.js; - -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -/** - * Options for the Scene. The options can be updated at any time. - * Instead of setting the options for each scene individually you can also set them globally in the controller as the - * controllers globalSceneOptions option. The object accepts the same properties as the ones below. When a scene is - * added to the controller the options defined using the Scene constructor will be overwritten by those set in - * globalSceneOptions. - * - * @author kevzlou7979@gmail.com - * @see Official Documentation - */ -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class SceneOptions { - - /** - * The duration of the scene. If 0 tweens will auto-play when reaching the scene start point, pins will be pinned - * indefinetly starting at the start position. A function retuning the duration value is also supported. - * Please see Scene.duration() for details. Default to 0 - */ - @JsProperty - public int duration; - /** - * Offset Value for the Trigger Position. If no triggerElement is defined this will be the scroll distance from the - * start of the page, after which the scene will start. Default to 0 - */ - @JsProperty - public int offset; - /** - * Selector or DOM object that defines the start of the scene. If undefined the scene will start right at the start - * of the page (unless an offset is set). Default tp null - */ - @JsProperty - public Object triggerElement; - /** - * Can be a number between 0 and 1 defining the position of the trigger Hook in relation to the viewport. - * Can also be defined using a string: - *

- * "onEnter" => 1
- * "onCenter" => 0.5
- * "onLeave" => 0
- */ - @JsProperty - public Object triggerHook; - /** - * Should the scene reverse, when scrolling up?. Default to true - */ - @JsProperty - public boolean reverse; - /** - * Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic. - *

- * 0 => silent
- * 1 => errors
- * 2 => errors, warnings
- * 3 => errors, warnings, debuginfo
- */ - @JsProperty - public int loglevel; - - private SceneOptions() {} - - @JsOverlay - public static final SceneOptions create() { - SceneOptions options = new SceneOptions(); - options.triggerHook = "onEnter"; - return options; - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java index ddbbb9751..a7aee7b20 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java @@ -10,68 +10,77 @@ import java.util.List; import java.util.Map; +import static gwt.material.design.incubator.client.infinitescroll.recycle.RecycleType.DETACH; import static gwt.material.design.jquery.client.api.JQuery.$; +//@formatter:off + +/** + * Manages all the recycling mechanism to improve scrolling performance. + * + * @author kevzlou7979 + */ public class RecycleManager { private int loadIndex = 0; private int currentIndex = -1; private InfiniteScrollPanel parent; private Map> recycledWidgets = new HashMap<>(); - private RecycleOptions options = new RecycleOptions(); + private RecycleType type; public RecycleManager() { - this(new RecycleOptions()); + this(DETACH); } - public RecycleManager(RecycleOptions options) { - this.options = options; + public RecycleManager(RecycleType type) { + this.type = type; } + /** + * Will recycle the provided widgets (@link widgets} with provided {@link RecyclePosition} + */ public void recycle(RecyclePosition position) { if (position == RecyclePosition.BOTTOM) { - recycleBottom(); - } else { - recycleTop(); - } - } - - protected void recycleTop() { - if (currentIndex > 0) { // Remove the current recycled widgets - List currentWidgets = recycledWidgets.get(currentIndex); - if (currentWidgets != null) remove(currentWidgets); - - // Add the previous recycled widgets - List previousWidgets = recycledWidgets.get(currentIndex - 1); - if (previousWidgets != null) add(previousWidgets); - scrollTo(parentElement().get(0).getScrollHeight() - (options.getBufferTop() + options.getBufferBottom() + parentElement().outerHeight())); - currentIndex--; - } - } - - protected void recycleBottom() { - // Remove the current recycled widgets - if (currentIndex <= loadIndex) { - List currentWidgets = recycledWidgets.get(currentIndex); - if (currentWidgets != null) remove(currentWidgets); - - // Add the previous recycled widgets - if (hasRecycledWidgets()) { - List nextWidgets = recycledWidgets.get(currentIndex + 1); - if (nextWidgets != null) add(nextWidgets); - scrollTo(options.getBufferTop()); + if (currentIndex <= loadIndex) { + List currentWidgets = recycledWidgets.get(currentIndex); + if (currentWidgets != null) remove(currentWidgets); + + // Add the previous recycled widgets + if (hasRecycledWidgets()) { + List nextWidgets = recycledWidgets.get(currentIndex + 1); + if (nextWidgets != null) add(nextWidgets); + scrollTo(parent.getBufferTop()); + } + currentIndex++; + } + } else { + if (currentIndex > 0) { + // Remove the current recycled widgets + List currentWidgets = recycledWidgets.get(currentIndex); + if (currentWidgets != null) remove(currentWidgets); + + // Add the previous recycled widgets + List previousWidgets = recycledWidgets.get(currentIndex - 1); + if (previousWidgets != null) add(previousWidgets); + scrollTo(parentElement().get(0).getScrollHeight() - (parent.getBufferTop() + parent.getBufferBottom() + parentElement().outerHeight())); + currentIndex--; } - currentIndex++; } } + /** + * Helper method to scroll to a given offset + */ protected void scrollTo(int value) { $(parent.getElement()).scrollTop(value); } + /** + * Helper method to remove the provided widgets with {@link RecycleType} defined + */ protected void remove(List widgets) { - switch (options.getType()) { + switch (type) { case DETACH: widgets.forEach(widget -> widget.removeFromParent()); break; @@ -81,8 +90,11 @@ protected void remove(List widgets) { } } + /** + * Helper method to add the provided widgets with {@link RecycleType} defined + */ protected void add(List widgets) { - switch (options.getType()) { + switch (type) { case DETACH: widgets.forEach(widget -> parent.add(widget)); break; @@ -92,20 +104,32 @@ protected void add(List widgets) { } } + /** + * The Parent Infinite scroll element. + */ protected JQueryElement parentElement() { return $(parent.getElement()); } + /** + * Will add the widgets in a map {@link this#recycledWidgets} + */ public void addWidgets(List widgets) { recycledWidgets.put(loadIndex, widgets); loadIndex++; recycle(RecyclePosition.BOTTOM); } + /** + * Determine if there are recycled widgets + */ public boolean hasRecycledWidgets() { return recycledWidgets.get(currentIndex + 1) != null; } + /** + * Get all recycled widgets + */ public List getRecycledWidgets() { List widgets = new ArrayList<>(); for (Integer recycledIndex : recycledWidgets.keySet()) { @@ -114,13 +138,26 @@ public List getRecycledWidgets() { return widgets; } + /** + * Get all recycled widgets with provided recycledIndex + */ + public List getRecycledWidgets(int index) { + return recycledWidgets.get(index); + } + + /** + * Will set the InfiniteScrollPanel and this will manage all the recycling mechanism + */ public void setParent(InfiniteScrollPanel parent) { this.parent = parent; - parent.setPaddingBottom(options.getBufferBottom()); - parent.setPaddingTop(options.getBufferTop()); + parent.setPaddingBottom(parent.getBufferBottom()); + parent.setPaddingTop(parent.getBufferTop()); } + /** + * Will reset and unload all the configs of this manager. + */ public void unload() { loadIndex = 0; currentIndex = -1; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java deleted file mode 100644 index 5c6412d36..000000000 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleOptions.java +++ /dev/null @@ -1,41 +0,0 @@ -package gwt.material.design.incubator.client.infinitescroll.recycle; - -public class RecycleOptions { - - private int bufferTop = 40; - private int bufferBottom = 40; - private RecycleType type = RecycleType.DETACH; - - public RecycleOptions() { - } - - public RecycleOptions(int bufferTop, int bufferBottom, RecycleType type) { - this.bufferTop = bufferTop; - this.bufferBottom = bufferBottom; - this.type = type; - } - - public int getBufferTop() { - return bufferTop; - } - - public void setBufferTop(int bufferTop) { - this.bufferTop = bufferTop; - } - - public int getBufferBottom() { - return bufferBottom; - } - - public void setBufferBottom(int bufferBottom) { - this.bufferBottom = bufferBottom; - } - - public RecycleType getType() { - return type; - } - - public void setType(RecycleType type) { - this.type = type; - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java index d0f76fe78..6d0970b4d 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java @@ -1,7 +1,20 @@ package gwt.material.design.incubator.client.infinitescroll.recycle; +//@formatter:off + +/** + * Recycling position of {@link RecycleManager} + * + * @author kevzlou7979 + */ public enum RecyclePosition { + /** + * Recycle all previous set of widgets + */ TOP, + /** + * Recycle all the next set of widgets + */ BOTTOM } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java index a42ac0981..bd9058f36 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java @@ -1,7 +1,19 @@ package gwt.material.design.incubator.client.infinitescroll.recycle; +/** + * Recycle Type - provide a recycling mechanism managed by {@link RecycleManager}. + * + * @author kevzlou7979 + */ public enum RecycleType { + /** + * Will recycle the widgets affecting only it's display by setting the + * css {@link com.google.gwt.dom.client.Style.Display} property to BLOCK or NONE + */ DISPLAY, + /** + * Will recycle the widgets on it's DOM structure by attaching or detaching the widgets + */ DETACH } From 01c13ff220a04c3944b56d63762c25c1193d2030 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 27 Jul 2018 13:57:17 +0800 Subject: [PATCH 014/247] InfiniteScrollLoader - ability to set custom message. --- .../infinitescroll/InfiniteScrollLoader.java | 26 +++++++++++++------ .../infinitescroll/InfiniteScrollPanel.java | 10 ++++++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java index c1706b533..765031baa 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollLoader.java @@ -35,22 +35,28 @@ */ public class InfiniteScrollLoader extends MaterialWidget { + private String message = "Loading"; private Span label = new Span(); - private InfiniteScrollPanel container; + private InfiniteScrollPanel parent; - public InfiniteScrollLoader(InfiniteScrollPanel container) { + public InfiniteScrollLoader() { super(Document.get().createDivElement(), IncubatorCssName.INFINITE_SCROLL_LOADER); + } + + public InfiniteScrollLoader(String message) { + this(); - this.container = container; + this.message = message; } + @Override protected void onLoad() { super.onLoad(); setTextAlign(TextAlign.CENTER); - label.setText("Loading"); + label.setText(message); label.setFontSize("1.2em"); label.setLineHeight(12); @@ -58,15 +64,15 @@ protected void onLoad() { } /** - * Will attach a loader to it's container + * Will attach a loader to it's parent */ public void show() { MaterialLoader.loading(true, this); - container.add(this); + parent.add(this); } /** - * Will detach a loader to it's container + * Will detach a loader to it's parent */ public void hide() { MaterialLoader.loading(false); @@ -74,9 +80,13 @@ public void hide() { } /** - * Will check if the loading indicator still attached to it's container + * Will check if the loading indicator still attached to it's parent */ public boolean isLoading() { return isAttached(); } + + public void setParent(InfiniteScrollPanel parent) { + this.parent = parent; + } } diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index e9985c637..62a806313 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -120,7 +120,10 @@ protected void onLoad() { * of the scroll panel providing a target threshold on scrolling both top / bottom positions. */ protected void load() { - loader = new InfiniteScrollLoader(this); + if (loader == null) { + setInfiniteScrollLoader(new InfiniteScrollLoader()); + } + offset = loadConfig.getOffset(); limit = loadConfig.getLimit(); setPaddingTop(bufferTop); @@ -298,6 +301,11 @@ public InfiniteScrollLoader getLoader() { return loader; } + public void setInfiniteScrollLoader(InfiniteScrollLoader loader) { + this.loader = loader; + this.loader.setParent(this); + } + /** * Get the recycling manager */ From 56e05fb75d5b9120b1a249f5d8429f9c9e02f0d4 Mon Sep 17 00:00:00 2001 From: BenDol Date: Fri, 3 Aug 2018 03:08:27 +1200 Subject: [PATCH 015/247] Added MaterialComboBox#getIndexByString Allows for generic String referencing using the KeyFactory --- .../client/combobox/MaterialComboBox.java | 28 ++++++++++++++++++- .../client/richeditor/MaterialRichEditor.java | 7 +---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 28534f1df..0ab34155c 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -532,7 +532,11 @@ public void setValue(List values, boolean fireEvents) { */ public void setSingleValue(T value, boolean fireEvents) { int index = this.values.indexOf(value); - if (index >= 0) { + if (index < 0 && value instanceof String) { + index = getIndexByString((String) value); + } + + if (index > -1) { List before = getValue(); setSelectedIndex(index); @@ -542,6 +546,28 @@ public void setSingleValue(T value, boolean fireEvents) { } } + // TODO: Optimize performance (maybe use a map) + public T getValueByString(String key) { + for (T value : values) { + if (keyFactory.generateKey(value).equals(key)) { + return value; + } + } + return null; + } + + // TODO: Optimize performance (maybe use a map) + public int getIndexByString(String key) { + int index = -1; + for (T value : values) { + index++; + if (keyFactory.generateKey(value).equals(key)) { + return index; + } + } + return index; + } + /** * Set directly all the values that will be stored into * combobox and build options into it. diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java index 723909fdf..86a33cb98 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java @@ -118,7 +118,6 @@ protected void onLoad() { @Override public void load() { - JsRichEditor jsRichEditor = $(getElement()); options.toolbar = manager.getToolbars(); @@ -264,11 +263,7 @@ protected void adjustNestedDialog(MaterialDialog dialog) { protected void adjustFullScreen(MaterialDialog dialog) { getEditor().find("div[data-event='fullscreen']").off("click").on("click", (e, param1) -> { dialog.setFullscreen(toggleFullScreen); - if (toggleFullScreen) { - toggleFullScreen = false; - } else { - toggleFullScreen = true; - } + toggleFullScreen = !toggleFullScreen; return true; }); } From ed252b7ed6d0eedac6f584beaf67450dbc0653ab Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 7 Aug 2018 17:21:36 +0800 Subject: [PATCH 016/247] ComboBox support for getIndexByString --- .../client/combobox/MaterialComboBox.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 28534f1df..36f5f1210 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -526,13 +526,19 @@ public void setValue(List values, boolean fireEvents) { } } + //TODO Just check the same approach + /** * Set the selected value using a single item, generally used * in single selection mode. */ public void setSingleValue(T value, boolean fireEvents) { int index = this.values.indexOf(value); - if (index >= 0) { + if (index < 0 && value instanceof String) { + index = getIndexByString((String) value); + } + + if (index > -1) { List before = getValue(); setSelectedIndex(index); @@ -542,6 +548,29 @@ public void setSingleValue(T value, boolean fireEvents) { } } + // TODO: Optimize performance (maybe use a map) + public T getValueByString(String key) { + for (T value : values) { + if (keyFactory.generateKey(value).equals(key)) { + return value; + } + } + return null; + } + + // TODO: Optimize performance (maybe use a map) + public int getIndexByString(String key) { + int index = -1; + + for (T value : values) { + ++index; + if (keyFactory.generateKey(value).equals(key)) { + return index; + } + } + return index; + } + /** * Set directly all the values that will be stored into * combobox and build options into it. From 845d0ea9e3ea28ac28cea1d3699b53492eb102c4 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 8 Aug 2018 11:33:28 +0800 Subject: [PATCH 017/247] Maintaining the Element position when scrolling using Stub Logic. --- .../infinitescroll/InfiniteScrollPanel.java | 26 ++-- .../recycle/RecycleManager.java | 119 +++++++++++------- 2 files changed, 92 insertions(+), 53 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index 62a806313..f1cd23109 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -7,9 +7,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. @@ -68,9 +68,10 @@ public class InfiniteScrollPanel extends MaterialPanel implements HasInfinite private RecycleManager recycleManager; private int offset = 0; private int limit = 0; - private int bufferTop = 40; - private int bufferBottom = 40; + private int bufferTop = 20; + private int bufferBottom = 20; private boolean completed; + private int itemCount = 1; public InfiniteScrollPanel() { super(); @@ -87,14 +88,14 @@ public InfiniteScrollPanel(DataSource dataSource, LoadConfig loadConfig) { protected void onLoad() { super.onLoad(); - // Will setup the scroll events to determin if scrolls top / bottom. + // Will setup the scroll events to determine if scrolls top / bottom. $(getElement()).scroll((e, param1) -> { if (!isLoading()) { - if (getElement().getScrollTop() <= 0) { + if (getElement().getScrollTop() <= bufferTop) { onScrollTop(); } - if (getElement().getScrollTop() == (getElement().getScrollHeight()) - getElement().getOffsetHeight()) { + if (getElement().getScrollTop() >= ((getElement().getScrollHeight()) - getElement().getOffsetHeight()) - bufferBottom) { onScrollBottom(); } } @@ -126,8 +127,6 @@ protected void load() { offset = loadConfig.getOffset(); limit = loadConfig.getLimit(); - setPaddingTop(bufferTop); - setPaddingBottom(bufferBottom); load(offset, limit); } @@ -165,13 +164,15 @@ private void render(List data) { List widgets = new ArrayList<>(); for (T model : data) { Widget widget = renderer.render(model); + widget.getElement().setId("item-" + itemCount); add(widget); widgets.add(widget); + itemCount++; } // Check if recycling is enabled if (isEnableRecycling()) { - recycleManager.addWidgets(widgets); + recycleManager.recycleWidgets(widgets); } // Will force the scroll panel to have a scroll if it isn't visible @@ -213,6 +214,7 @@ public void unload() { clear(); offset = 0; limit = 0; + itemCount = 1; completed = false; if (isEnableRecycling()) { recycleManager.unload(); @@ -357,6 +359,10 @@ public void setBufferBottom(int bufferBottom) { this.bufferBottom = bufferBottom; } + public int getLimit() { + return limit; + } + @Override public HandlerRegistration addLoadingHandler(LoadingEvent.LoadingHandler handler) { return addHandler(handler, LoadingEvent.getType()); diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java index a7aee7b20..eadeb4f37 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static gwt.material.design.incubator.client.infinitescroll.recycle.RecycleType.DETACH; import static gwt.material.design.jquery.client.api.JQuery.$; @@ -22,8 +23,9 @@ */ public class RecycleManager { + private int currentIndex = 0; + private int stubCount = 0; private int loadIndex = 0; - private int currentIndex = -1; private InfiniteScrollPanel parent; private Map> recycledWidgets = new HashMap<>(); private RecycleType type; @@ -40,52 +42,75 @@ public RecycleManager(RecycleType type) { * Will recycle the provided widgets (@link widgets} with provided {@link RecyclePosition} */ public void recycle(RecyclePosition position) { - if (position == RecyclePosition.BOTTOM) { - // Remove the current recycled widgets - if (currentIndex <= loadIndex) { - List currentWidgets = recycledWidgets.get(currentIndex); - if (currentWidgets != null) remove(currentWidgets); - // Add the previous recycled widgets + stubCount = determineStubCount(); + + switch (position) { + case BOTTOM: if (hasRecycledWidgets()) { - List nextWidgets = recycledWidgets.get(currentIndex + 1); - if (nextWidgets != null) add(nextWidgets); - scrollTo(parent.getBufferTop()); + // Will remove the current recycled widgets + remove(getRecycledWidgets().stream() + .skip(0) + .limit((parent.getLimit() * (currentIndex + 1)) - stubCount) + .collect(Collectors.toList())); + + currentIndex++; + + // Will determine if the current index is greater than the load index then we need to recycle the next + // set of recycled widgets + if (currentIndex < loadIndex) { + add(getRecycledWidgets(currentIndex)); + } } - currentIndex++; - } - } else { - if (currentIndex > 0) { - // Remove the current recycled widgets - List currentWidgets = recycledWidgets.get(currentIndex); - if (currentWidgets != null) remove(currentWidgets); - - // Add the previous recycled widgets - List previousWidgets = recycledWidgets.get(currentIndex - 1); - if (previousWidgets != null) add(previousWidgets); - scrollTo(parentElement().get(0).getScrollHeight() - (parent.getBufferTop() + parent.getBufferBottom() + parentElement().outerHeight())); - currentIndex--; - } + break; + case TOP: + if (currentIndex > 0) { + // Will remove the current recycled widgets + remove(getRecycledWidgets(currentIndex)); + + // Will add the previous recycled widgets + int skip = ((parent.getLimit() * currentIndex) - parent.getLimit()) - stubCount; + insert(getRecycledWidgets().stream() + .skip(skip < 0 ? 0 : skip) + .limit(parent.getLimit()) + .collect(Collectors.toList())); + + currentIndex--; + } + break; } } /** - * Helper method to scroll to a given offset + * Helper method to remove the provided widgets with {@link RecycleType} defined */ - protected void scrollTo(int value) { - $(parent.getElement()).scrollTop(value); + protected void remove(List widgets) { + if (widgets != null) { + switch (type) { + case DETACH: + widgets.forEach(widget -> widget.removeFromParent()); + break; + case DISPLAY: + widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); + break; + } + } } /** - * Helper method to remove the provided widgets with {@link RecycleType} defined + * Helper method to insert the provided widgets with {@link RecycleType} defined */ - protected void remove(List widgets) { + protected void insert(List widgets) { switch (type) { case DETACH: - widgets.forEach(widget -> widget.removeFromParent()); + for (Widget widget : widgets) { + int index = widgets.indexOf(widget); + parent.insert(widget, index); + } + break; case DISPLAY: - widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.NONE)); + widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); break; } } @@ -96,7 +121,10 @@ protected void remove(List widgets) { protected void add(List widgets) { switch (type) { case DETACH: - widgets.forEach(widget -> parent.add(widget)); + for (Widget widget : widgets) { + parent.add(widget); + } + break; case DISPLAY: widgets.forEach(widget -> widget.getElement().getStyle().setDisplay(Style.Display.BLOCK)); @@ -104,20 +132,20 @@ protected void add(List widgets) { } } - /** - * The Parent Infinite scroll element. - */ - protected JQueryElement parentElement() { - return $(parent.getElement()); + protected int determineStubCount() { + if (stubCount <= 0) { + stubCount = parent.getLimit() / 2; + } + return stubCount; } /** * Will add the widgets in a map {@link this#recycledWidgets} */ - public void addWidgets(List widgets) { + public void recycleWidgets(List widgets) { recycledWidgets.put(loadIndex, widgets); - loadIndex++; recycle(RecyclePosition.BOTTOM); + loadIndex++; } /** @@ -145,22 +173,27 @@ public List getRecycledWidgets(int index) { return recycledWidgets.get(index); } + public int getStubCount() { + return stubCount; + } + + public void setStubCount(int stubCount) { + this.stubCount = stubCount; + } + /** * Will set the InfiniteScrollPanel and this will manage all the recycling mechanism */ public void setParent(InfiniteScrollPanel parent) { this.parent = parent; - - parent.setPaddingBottom(parent.getBufferBottom()); - parent.setPaddingTop(parent.getBufferTop()); } /** * Will reset and unload all the configs of this manager. */ public void unload() { + currentIndex = 0; loadIndex = 0; - currentIndex = -1; recycledWidgets = new HashMap<>(); } } From bcceeedc0dd95a056ffc409e6b744db45d6a514e Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 16 Aug 2018 20:45:36 +0800 Subject: [PATCH 018/247] Fixed MaterialEmptyState iconSize #362 --- .../design/addins/client/emptystate/MaterialEmptyState.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java b/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java index 184dcbbc1..4ea9c189b 100644 --- a/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java +++ b/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java @@ -69,6 +69,8 @@ public class MaterialEmptyState extends MaterialWidget implements HasIcon, HasTi public MaterialEmptyState() { super(Document.get().createDivElement(), CssName.VALIGN_WRAPPER, AddinsCssName.EMPTY_STATE); + + setIconSize(IconSize.LARGE); } public MaterialEmptyState(Color bgColor, Color textColor, IconType iconType, String title, String description) { @@ -89,7 +91,6 @@ protected void onLoad() { container.setWidth("100%"); container.setStyleName(CssName.VALIGN + " " + CssName.CENTER); container.add(title); - icon.setIconSize(IconSize.LARGE); title.insert(icon, 0); } From b60a6f3bccc8aaea844ed14c1aa43efc46db5b07 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 30 Aug 2018 10:06:20 +0800 Subject: [PATCH 019/247] Style fixes and copyright headers. --- .../incubator/client/async/AsyncButton.java | 19 +++++++++++++++++++ .../incubator/client/async/AsyncIcon.java | 19 +++++++++++++++++++ .../client/async/events/HasAsyncHandlers.java | 19 +++++++++++++++++++ .../infinitescroll/InfiniteScrollPanel.java | 4 ++-- .../recycle/RecycleManager.java | 19 +++++++++++++++++++ .../recycle/RecyclePosition.java | 19 +++++++++++++++++++ .../infinitescroll/recycle/RecycleType.java | 19 +++++++++++++++++++ .../client/menubar/resources/css/menubar.css | 18 +++++++++++------- .../menubar/resources/css/menubar.min.css | 2 +- .../resources/css/language-selector.css | 16 +++++++++++----- 10 files changed, 139 insertions(+), 15 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java index 6f1e47ce9..f9dadf59d 100644 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java +++ b/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.async; import com.google.gwt.dom.client.Document; diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java index 782b41b18..551e33881 100644 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java +++ b/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.async; import com.google.gwt.dom.client.Document; diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java b/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java index 7a1a18cb3..92ef9fba5 100644 --- a/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.async.events; public interface HasAsyncHandlers { diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java index f1cd23109..1cfd15357 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/InfiniteScrollPanel.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java index eadeb4f37..8adae84cd 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleManager.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.infinitescroll.recycle; import com.google.gwt.dom.client.Style; diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java index 6d0970b4d..2890f1e8f 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecyclePosition.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.infinitescroll.recycle; //@formatter:off diff --git a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java index bd9058f36..2a9d91220 100644 --- a/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java +++ b/src/main/java/gwt/material/design/incubator/client/infinitescroll/recycle/RecycleType.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.infinitescroll.recycle; /** diff --git a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css index 06103a6e4..5a3e22260 100644 --- a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css +++ b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css @@ -20,7 +20,7 @@ height: 40px; } .menu-bar .dropdown-content li > a, .menu-bar .dropdown-content li > span { - font-size: 12px !important; + font-size: 1em !important; min-height: 0px; line-height: 16px; color: #000; @@ -35,21 +35,25 @@ border: 2px solid rgba(90, 90, 90, 0); } .menu-bar ul.dropdown-content [type="checkbox"]:checked + label:before { - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: 2px solid rgba(0,0,0,0.6); - border-bottom: 2px solid rgba(0,0,0,0.6); + border: 2px solid transparent; + border-right-color: rgba(0, 0, 0, 0.6); + border-bottom-color: rgba(0, 0, 0, 0.6); } .menu-bar ul.dropdown-content li > span.gwt-CheckBox { - padding: 4px; line-height: 0; - padding-left: 12px; + padding: 4px 4px 4px 12px; } .menu-bar ul.dropdown-content [type="checkbox"] + label{ height: initial; color: #000; width: 100%; } + +.menu-bar ul li img { + width: 20px !important; + height: 20px !important; +} + @media only screen and (max-width: 992px) { .menu-bar ul.dropdown-content, .menu-bar ul.dropdown-content ul.dropdown-content{ left: 0 !important; diff --git a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css index 1822b0502..6e60411c7 100644 --- a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css +++ b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css @@ -1 +1 @@ -.menu-bar ul.dropdown-content{overflow:visible!important;width:280px!important;padding:16px 0}.menu-bar ul.dropdown-content .dropdown-content{position:relative!important;margin-top:0;left:280px!important;top:-48px!important}.menu-bar .dropdown-content li{min-height:0;line-height:0;max-height:32px!important}.menu-bar .dropdown-content li>a,.menu-bar .dropdown-content li>span{font-size:12px!important;min-height:0;line-height:16px;color:#000;padding:8px 24px}.menu-bar ul.dropdown-content [type=checkbox]+label{font-size:12px;height:initial;color:#000;width:100%}.menu-bar ul.dropdown-content [type=checkbox]+label:before{border:2px solid rgba(90,90,90,0)}.menu-bar ul.dropdown-content [type=checkbox]:checked+label:before{border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid rgba(0,0,0,.6);border-bottom:2px solid rgba(0,0,0,.6)}.menu-bar ul.dropdown-content li>span.gwt-CheckBox{padding:4px 4px 4px 12px;line-height:0}@media only screen and (max-width:992px){.menu-bar ul.dropdown-content,.menu-bar ul.dropdown-content ul.dropdown-content{left:0!important;width:100%!important}} \ No newline at end of file +.menu-bar ul.dropdown-content{overflow:visible!important;width:280px!important;padding:16px 0}.menu-bar ul.dropdown-content .dropdown-content{position:relative!important;margin-top:0;left:280px!important;top:-48px!important}.menu-bar .dropdown-content li{display:inline-block;min-height:0;line-height:0;max-height:32px}.menu-bar li{height:40px}.menu-bar .dropdown-content li>a,.menu-bar .dropdown-content li>span{font-size:1em!important;min-height:0;line-height:16px;color:#000;padding:8px 24px;display:inline-block}.menu-bar ul.dropdown-content [type=checkbox]+label{font-size:12px;height:initial;color:#000;width:100%}.menu-bar ul.dropdown-content [type=checkbox]+label:before{border:2px solid rgba(90,90,90,0)}.menu-bar ul.dropdown-content [type=checkbox]:checked+label:before{border:2px solid transparent;border-right-color:rgba(0,0,0,.6);border-bottom-color:rgba(0,0,0,.6)}.menu-bar ul.dropdown-content li>span.gwt-CheckBox{line-height:0;padding:4px 4px 4px 12px}.menu-bar ul li img{width:20px!important;height:20px!important}@media only screen and (max-width:992px){.menu-bar ul.dropdown-content,.menu-bar ul.dropdown-content ul.dropdown-content{left:0!important;width:100%!important}} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css b/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css index 0b961122c..8d1ed98fb 100644 --- a/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css +++ b/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css @@ -2,16 +2,17 @@ padding: 0 15px; display: flex; align-items: center; - height: 64px + height: 64px; + position: relative } .language-selector.single-language ul.dropdown-content { - visibility: hidden; + visibility: hidden } .language-selector.single-language .language-activator { cursor: default !important; - margin-top: -12px; + margin-top: -12px } .language-selector .language-activator span:before { @@ -23,11 +24,11 @@ border-top: 8px solid #fff; position: absolute; top: 28px; - right: 0; + right: 24px } .language-selector.single-language .language-activator span:before { - display: none; + display: none } .language-selector img { @@ -35,6 +36,11 @@ height: 2rem } +nav .language-selector .language-activator { + padding-right: 36px; + padding-left: 16px +} + nav .language-selector .language-activator span { line-height: 64px } From 33ae8c31dc81fa554e9e475c99e860d3c7f88318 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 30 Aug 2018 10:39:31 +0800 Subject: [PATCH 020/247] Fixed MaterialAutoComplete: 2 chips removed on backspace #356 --- .../autocomplete/MaterialAutoComplete.java | 94 ++++++++++--------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java index 7d8717de1..609d76b8c 100644 --- a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java +++ b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java @@ -232,59 +232,65 @@ protected void onLoad() { protected void loadHandlers() { - itemBoxBlurHandler = itemBox.addBlurHandler(blurEvent -> { - if (getValue().size() > 0) { - label.addStyleName(CssName.ACTIVE); - } - }); + if (itemBoxBlurHandler == null) { + itemBoxBlurHandler = itemBox.addBlurHandler(blurEvent -> { + if (getValue().size() > 0) { + label.addStyleName(CssName.ACTIVE); + } + }); + } - itemBoxKeyDownHandler = itemBox.addKeyDownHandler(event -> { - switch (event.getNativeKeyCode()) { - case KeyCodes.KEY_ENTER: - if (directInputAllowed) { - String value = itemBox.getValue(); - if (value != null && !(value = value.trim()).isEmpty()) { - gwt.material.design.client.base.Suggestion directInput = new gwt.material.design.client.base.Suggestion(); - directInput.setDisplay(value); - directInput.setSuggestion(value); - addItem(directInput); - if (getType() == AutocompleteType.TEXT) { - itemBox.setText(value); - } else { - itemBox.setValue(""); + if (itemBoxKeyDownHandler == null) { + itemBoxKeyDownHandler = itemBox.addKeyDownHandler(event -> { + switch (event.getNativeKeyCode()) { + case KeyCodes.KEY_ENTER: + if (directInputAllowed) { + String value = itemBox.getValue(); + if (value != null && !(value = value.trim()).isEmpty()) { + gwt.material.design.client.base.Suggestion directInput = new gwt.material.design.client.base.Suggestion(); + directInput.setDisplay(value); + directInput.setSuggestion(value); + addItem(directInput); + if (getType() == AutocompleteType.TEXT) { + itemBox.setText(value); + } else { + itemBox.setValue(""); + } + itemBox.setFocus(true); } - itemBox.setFocus(true); } - } - break; - case KeyCodes.KEY_BACKSPACE: - if (itemBox.getValue().trim().isEmpty()) { - if (itemsHighlighted.isEmpty()) { - if (suggestionMap.size() > 0) { - ListItem li = (ListItem) list.getWidget(list.getWidgetCount() - 2); - - if (tryRemoveSuggestion(li.getWidget(0))) { - li.removeFromParent(); + break; + case KeyCodes.KEY_BACKSPACE: + if (itemBox.getValue().trim().isEmpty()) { + if (itemsHighlighted.isEmpty()) { + if (suggestionMap.size() > 0) { + ListItem li = (ListItem) list.getWidget(list.getWidgetCount() - 2); + + if (tryRemoveSuggestion(li.getWidget(0))) { + li.removeFromParent(); + } } } } - } - break; - case KeyCodes.KEY_DELETE: - if (itemBox.getValue().trim().isEmpty()) { - for (ListItem li : itemsHighlighted) { - if (tryRemoveSuggestion(li.getWidget(0))) { - li.removeFromParent(); + break; + case KeyCodes.KEY_DELETE: + if (itemBox.getValue().trim().isEmpty()) { + for (ListItem li : itemsHighlighted) { + if (tryRemoveSuggestion(li.getWidget(0))) { + li.removeFromParent(); + } } + itemsHighlighted.clear(); } - itemsHighlighted.clear(); - } - itemBox.setFocus(true); - break; - } - }); + itemBox.setFocus(true); + break; + } + }); + } - itemBoxClickHandler = itemBox.addClickHandler(event -> suggestBox.showSuggestionList()); + if (itemBoxClickHandler == null) { + itemBoxClickHandler = itemBox.addClickHandler(event -> suggestBox.showSuggestionList()); + } } @Override From c9a0e44d4f3cd6e72361e18188eb15f656968aad Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 30 Aug 2018 15:14:34 +0800 Subject: [PATCH 021/247] Preparation for 2.1.1 release --- README.md | 8 ++++---- pom.xml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a9bdaff0a..ac65a99af 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,21 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.1 +## Current Version 2.1.1 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.1 + 2.1.1 ``` -## Snapshot Version 2.1.1-SNAPSHOT +## Snapshot Version 2.2-SNAPSHOT ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.1.1-SNAPSHOT + 2.2-SNAPSHOT ``` diff --git a/pom.xml b/pom.xml index 6c84be51f..ab7508702 100644 --- a/pom.xml +++ b/pom.xml @@ -5,18 +5,18 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.1.1-SNAPSHOT + 2.1.1 gwt-material-addins gwt-lib Gwt Material Addins - 2.1.1-SNAPSHOT + 2.1.1 Extra Components of GWT Material Framework - 2.1.1-SNAPSHOT + 2.1.1 From efedc015062ea58f10c97aa96cf8e656c543d189 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 30 Aug 2018 19:24:44 +0800 Subject: [PATCH 022/247] Fixed typo --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ab7508702..39b33de14 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.1.1-SNAPSHOT + v2.1.1 From 9363432c5b7537cc6ad74ff53bde8f72e8bc2443 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Sun, 9 Sep 2018 05:53:23 +0800 Subject: [PATCH 023/247] Iteration to 2.2-SNAPSHOT --- README.md | 4 ++-- pom.xml | 8 ++++---- .../design/incubator/client/toggle/GroupToggleButton.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ac65a99af..1a0ecf6c7 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.1.1 +## Current Version 2.2 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.1.1 + 2.2 ``` diff --git a/pom.xml b/pom.xml index 39b33de14..1f7b05757 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.1.1 + 2.2-SNAPSHOT gwt-material-addins gwt-lib Gwt Material Addins - 2.1.1 + 2.2-SNAPSHOT Extra Components of GWT Material Framework - 2.1.1 + 2.2-SNAPSHOT scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.1.1 + v2.2-SNAPSHOT diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java index 639a469da..104acd9fb 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java @@ -60,7 +60,7 @@ * @author kevzlou7979 */ //@formatter:on -public class GroupToggleButton extends AbstractValueWidget> implements HasSelectionHandlers, +public class GroupToggleButton extends AbstractValueWidget> implements HasSelectionHandlers, HasStatusText { static { @@ -196,7 +196,7 @@ public void setMultiple(boolean multiple) { } public void fireSelectionEvent(ToggleButton toggleButton) { - SelectionEvent.fire(this, items.indexOf(toggleButton)); + SelectionEvent.fire(this, values.get(items.indexOf(toggleButton))); } public ToggleButton get(int index) { @@ -242,7 +242,7 @@ public MaterialLabel getErrorLabel() { } @Override - public HandlerRegistration addSelectionHandler(SelectionHandler selectionHandler) { + public HandlerRegistration addSelectionHandler(SelectionHandler selectionHandler) { return addHandler(selectionHandler, SelectionEvent.getType()); } From 79994f3a264608542fb902b3f20fbfa64c86b09c Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 12 Sep 2018 20:14:24 +0800 Subject: [PATCH 024/247] POC on transition on Stepper --- .../client/stepper/MaterialStepper.java | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index bc81835ae..eaa13fce2 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -21,6 +21,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Style; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.HandlerRegistration; @@ -43,12 +44,14 @@ import gwt.material.design.client.base.MaterialWidget; import gwt.material.design.client.base.mixin.CssNameMixin; import gwt.material.design.client.constants.Axis; +import gwt.material.design.client.constants.Color; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; import gwt.material.design.client.ui.html.Div; import gwt.material.design.client.ui.html.Span; +import org.apache.regexp.RE; //@formatter:off @@ -99,6 +102,8 @@ public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatu private Div divFeedback = new Div(); private Span feedbackSpan = new Span(); private HandlerRegistration orientationHandler; + private Transition nextTransition; + private Transition previousTransition; private CssNameMixin axisMixin; @@ -167,7 +172,13 @@ public void nextStep() { Widget w = getWidget(currentStepIndex); if (w instanceof MaterialStep) { MaterialStep step = (MaterialStep) w; - step.setActive(false); + + //TODO: Optimize as an API + step.getDivBody().setOverflow(Style.Overflow.HIDDEN); + new MaterialAnimation().transition(Transition.SLIDEOUTLEFT).animate(step.getConBody(), () -> { + step.setActive(false); + step.getDivBody().setOverflow(Style.Overflow.AUTO); + }); step.setSuccessText(step.getDescription()); @@ -181,7 +192,11 @@ public void nextStep() { } MaterialStep nextStep = (MaterialStep) w; if (nextStep.isEnabled() && nextStep.isVisible()) { + + //TODO: Optimize as an API nextStep.setActive(true); + new MaterialAnimation().transition(Transition.SLIDEINRIGHT).animate(nextStep.getConBody()); + setCurrentStepIndex(i); NextEvent.fire(MaterialStepper.this); break; @@ -200,7 +215,13 @@ public void prevStep() { Widget w = getWidget(currentStepIndex); if (w instanceof MaterialStep) { MaterialStep step = (MaterialStep) w; - step.setActive(false); + + //TODO: Optimize as an API + step.getDivBody().setOverflow(Style.Overflow.HIDDEN); + new MaterialAnimation().transition(Transition.SLIDEOUTRIGHT).animate(step.getConBody(), () -> { + step.setActive(false); + step.getDivBody().setOverflow(Style.Overflow.AUTO); + }); // prev step int prevStepIndex = getWidgetIndex(step) - 1; @@ -212,7 +233,14 @@ public void prevStep() { } MaterialStep prevStep = (MaterialStep) w; if (prevStep.isEnabled() && prevStep.isVisible()) { + + //TODO: Optimize as an API prevStep.setActive(true); + prevStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); + new MaterialAnimation().transition(Transition.SLIDEINLEFT).animate(prevStep.getConBody(), () -> { + prevStep.getDivBody().setOverflow(Style.Overflow.AUTO); + }); + setCurrentStepIndex(i); PreviousEvent.fire(MaterialStepper.this); break; @@ -303,6 +331,18 @@ public int getCurrentStepIndex() { return currentStepIndex; } + public MaterialStep getStep(int step) { + return getStep(step + 1); + } + + public MaterialStep getStepByIndex(int stepIndex) { + Widget widget = getWidget(stepIndex); + if (widget instanceof MaterialStep) { + return (MaterialStep) widget; + } + return null; + } + @Override public void setAxis(Axis axis) { getAxisMixin().setCssName(axis); @@ -440,6 +480,22 @@ public boolean isStepSkippingAllowed() { return stepSkippingAllowed; } + public Transition getNextTransition() { + return nextTransition; + } + + public void setNextTransition(Transition nextTransition) { + this.nextTransition = nextTransition; + } + + public Transition getPreviousTransition() { + return previousTransition; + } + + public void setPreviousTransition(Transition previousTransition) { + this.previousTransition = previousTransition; + } + public Span getFeedbackSpan() { return feedbackSpan; } From 3ca28cae1cea1e22c22e7195f0c5f92fa7f95ce6 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 14 Sep 2018 19:51:23 +0800 Subject: [PATCH 025/247] Stepper - support for insertion of step --- .../design/addins/client/stepper/MaterialStepper.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index eaa13fce2..cf9367b86 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -162,6 +162,13 @@ public void add(MaterialStep step) { totalSteps++; } + public void insert(MaterialStep step, int index) { + super.insert(step, index); + step.setAxis(getAxis()); + registerHandler(step.addSelectionHandler(this)); + totalSteps++; + } + /** * Go to next step, used by linear stepper. */ From 4c4839a92604f37c51fb549d5c64814e713708f0 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 14 Sep 2018 19:52:31 +0800 Subject: [PATCH 026/247] Enhancements on MaterialStepper --- .../design/addins/client/stepper/MaterialStepper.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index cf9367b86..846ce8f02 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -157,13 +157,17 @@ public boolean isDetectOrientation() { */ public void add(MaterialStep step) { this.add((Widget) step); - step.setAxis(getAxis()); - registerHandler(step.addSelectionHandler(this)); - totalSteps++; + + registerStep(step); } public void insert(MaterialStep step, int index) { super.insert(step, index); + + registerStep(step); + } + + protected void registerStep(MaterialStep step) { step.setAxis(getAxis()); registerHandler(step.addSelectionHandler(this)); totalSteps++; From 5265aa8687015c3aa3d591761e0acdcc72723b4a Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Mon, 17 Sep 2018 10:32:43 +0800 Subject: [PATCH 027/247] Fixed MaterialWindow has bug in setPaddingLeft() method. #366 --- .../material/design/addins/client/window/MaterialWindow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java b/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java index 200922761..df60277b6 100644 --- a/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java +++ b/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java @@ -419,7 +419,7 @@ public void setPaddingTop(double padding) { @Override public void setPaddingLeft(double padding) { - content.setPaddingTop(padding); + content.setPaddingLeft(padding); } @Override From 78dfdfbe5b85c902cc3b4407cbf35f64ed74b425 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 18 Sep 2018 10:00:56 +0800 Subject: [PATCH 028/247] New Incubator widget : Content_Placeholder --- .../base/constants/IncubatorCssName.java | 1 + .../placeholder/PlaceholderClientBundle.java | 31 ++++++++++++ .../PlaceholderDebugClientBundle.java | 31 ++++++++++++ .../client/placeholder/PlaceholderItem.java | 25 ++++++++++ .../client/placeholder/PlaceholderLoader.java | 47 +++++++++++++++++++ .../placeholder/PlaceholderRenderer.java | 8 ++++ .../resources/css/content-placeholder.css | 39 +++++++++++++++ .../resources/css/content-placeholder.min.css | 1 + 8 files changed, 183 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java create mode 100644 src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java create mode 100644 src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java b/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java index 2cc3b5d07..1d2c56ae3 100644 --- a/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java +++ b/src/main/java/gwt/material/design/incubator/client/base/constants/IncubatorCssName.java @@ -46,4 +46,5 @@ public interface IncubatorCssName { String LABEL_PANEL = "label-panel"; String JSON_TABLE = "json-table"; String SINGLE_LANGUAGE = "single-language"; + String CONTENT_PLACEHOLDER = "content-placeholder"; } diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java new file mode 100644 index 000000000..ac8126c0b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java @@ -0,0 +1,31 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.placeholder; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface PlaceholderClientBundle extends ClientBundle { + PlaceholderClientBundle INSTANCE = GWT.create(PlaceholderClientBundle.class); + + @Source("resources/css/content-placeholder.min.css") + TextResource contentPlaceholderCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java new file mode 100644 index 000000000..e3c63c337 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java @@ -0,0 +1,31 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.placeholder; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface PlaceholderDebugClientBundle extends ClientBundle { + PlaceholderDebugClientBundle INSTANCE = GWT.create(PlaceholderDebugClientBundle.class); + + @Source("resources/css/content-placeholder.css") + TextResource contentPlaceholder(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java new file mode 100644 index 000000000..08eef8535 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java @@ -0,0 +1,25 @@ +package gwt.material.design.incubator.client.placeholder; + +import com.google.gwt.dom.client.Document; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.base.IncubatorWidget; +import gwt.material.design.incubator.client.base.constants.IncubatorCssName; +import gwt.material.design.incubator.client.loadingstate.LoadingStatePanel; + +public class PlaceholderItem extends MaterialWidget { + + static { + IncubatorWidget.showWarning(LoadingStatePanel.class); + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(PlaceholderDebugClientBundle.INSTANCE.contentPlaceholder()); + } else { + MaterialDesignBase.injectCss(PlaceholderClientBundle.INSTANCE.contentPlaceholderCss()); + } + } + + public PlaceholderItem() { + super(Document.get().createDivElement(), IncubatorCssName.CONTENT_PLACEHOLDER); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java new file mode 100644 index 000000000..aeea38c79 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java @@ -0,0 +1,47 @@ +package gwt.material.design.incubator.client.placeholder; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; +import gwt.material.design.client.base.MaterialWidget; + +public class PlaceholderLoader { + + private int totalItems; + private MaterialWidget container; + private PlaceholderRenderer renderer; + + public PlaceholderLoader setContainer(MaterialWidget container) { + this.container = container; + return this; + } + + public PlaceholderLoader setRenderer(PlaceholderRenderer renderer) { + this.renderer = renderer; + return this; + } + + public PlaceholderLoader setTotalItems(int totalItems) { + this.totalItems = totalItems; + return this; + } + + public void load() { + if (container != null) { + if (renderer != null) { + container.clear(); + for (int i = 0; i < totalItems; i++) { + Widget widget = renderer.render(); + container.add(widget); + } + } else { + GWT.log("Widget renderer is not defined"); + } + } else { + GWT.log("Container is not defined.", new IllegalStateException()); + } + } + + public void unload(){ + container.clear(); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java new file mode 100644 index 000000000..da3e904e9 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java @@ -0,0 +1,8 @@ +package gwt.material.design.incubator.client.placeholder; + +import com.google.gwt.user.client.ui.Widget; + +public interface PlaceholderRenderer { + + Widget render(); +} diff --git a/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.css b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.css new file mode 100644 index 000000000..faae4fc94 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.css @@ -0,0 +1,39 @@ +@-webkit-keyframes placeHolderShimmer { + 0% { + background-position: -468px 0; + } + 100% { + background-position: 468px 0; + } +} + +@keyframes placeHolderShimmer { + 0% { + background-position: -468px 0; + } + 100% { + background-position: 468px 0; + } +} + +.content-placeholder { + display: inline-block; + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: forwards; + animation-fill-mode: forwards; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-name: placeHolderShimmer; + animation-name: placeHolderShimmer; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + background: #f6f7f8; + background: -webkit-gradient(linear, left top, right top, color-stop(8%, #eeeeee), color-stop(18%, #dddddd), color-stop(33%, #eeeeee)); + background: -webkit-linear-gradient(left, #eeeeee 8%, #dddddd 18%, #eeeeee 33%); + background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%); + -webkit-background-size: 800px 104px; + background-size: 800px 104px; + height: inherit; + position: relative; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.min.css b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.min.css new file mode 100644 index 000000000..62ab62641 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder.min.css @@ -0,0 +1 @@ +@-webkit-keyframes placeHolderShimmer{0%{background-position:-468px 0}100%{background-position:468px 0}}@keyframes placeHolderShimmer{0%{background-position:-468px 0}100%{background-position:468px 0}}.content-placeholder{display:inline-block;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:placeHolderShimmer;animation-name:placeHolderShimmer;-webkit-animation-timing-function:linear;animation-timing-function:linear;background:#f6f7f8;background:-webkit-gradient(linear,left top,right top,color-stop(8%,#eee),color-stop(18%,#ddd),color-stop(33%,#eee));background:-webkit-linear-gradient(left,#eee 8%,#ddd 18%,#eee 33%);background:linear-gradient(to right,#eee 8%,#ddd 18%,#eee 33%);-webkit-background-size:800px 104px;background-size:800px 104px;height:inherit;position:relative} \ No newline at end of file From df3cdcb74a1d036ca94f7c890c7adb6ebb331559 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 18 Sep 2018 13:06:58 +0800 Subject: [PATCH 029/247] Recent updates on status display type. --- .../addins/client/stepper/MaterialStep.java | 16 ++++++++++++++-- .../addins/client/stepper/MaterialStepper.java | 11 +++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index 68ddace38..aa32cedd7 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -7,9 +7,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. @@ -34,6 +34,7 @@ import gwt.material.design.client.constants.Axis; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.IconType; +import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.ui.MaterialIcon; import gwt.material.design.client.ui.html.Div; @@ -84,6 +85,7 @@ public class MaterialStep extends MaterialWidget implements HasActive, HasTitle, private ActiveMixin activeMixin; private Axis axis = Axis.HORIZONTAL; private State state; + private StatusDisplayType displayType; public MaterialStep() { super(Document.get().createDivElement(), AddinsCssName.STEP); @@ -237,6 +239,16 @@ public void clearSuccessText() { removeStyleName(AddinsCssName.SUCCESS); } + @Override + public void setStatusDisplayType(StatusDisplayType displayType) { + this.displayType = displayType; + } + + @Override + public StatusDisplayType getStatusDisplayType() { + return displayType; + } + protected void applyIconStatus(MaterialIcon icon, String description) { iconError.removeFromParent(); iconSuccess.removeFromParent(); diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 846ce8f02..1fac7b2d0 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -45,6 +45,7 @@ import gwt.material.design.client.base.mixin.CssNameMixin; import gwt.material.design.client.constants.Axis; import gwt.material.design.client.constants.Color; +import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; import gwt.material.design.client.ui.animate.MaterialAnimation; @@ -451,6 +452,16 @@ public void clearSuccessText() { getCurrentStep().clearSuccessText(); } + @Override + public void setStatusDisplayType(StatusDisplayType displayType) { + getCurrentStep().setStatusDisplayType(displayType); + } + + @Override + public StatusDisplayType getStatusDisplayType() { + return getCurrentStep().getStatusDisplayType(); + } + /** * Get feedback message. */ From 0d810dfc68682675cc25108b0912079330e6a908 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Sun, 23 Sep 2018 15:21:38 +0800 Subject: [PATCH 030/247] Vehicle Selection finalization --- .../client/combobox/MaterialComboBox.java | 2 +- .../client/countup/MaterialCountUp.java | 5 + .../inputmask/MaterialDateInputMask.java | 8 +- .../inputmask/base/DateInputParser.java | 5 +- .../client/combobox/resources/css/select2.css | 5 + .../combobox/resources/css/select2.min.css | 858 +++++++++++++++++- 6 files changed, 878 insertions(+), 5 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 13c57c133..5f60b1d11 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -104,7 +104,7 @@ public class MaterialComboBox extends AbstractValueWidget> implements private Label label = new Label(); private MaterialLabel errorLabel = new MaterialLabel(); protected MaterialWidget listbox = new MaterialWidget(Document.get().createSelectElement()); - private KeyFactory keyFactory = Object::toString; + private KeyFactory keyFactory = new AllowBlankKeyFactory<>(); private JsComboBoxOptions options = JsComboBoxOptions.create(); private StatusTextMixin statusTextMixin; diff --git a/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUp.java b/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUp.java index 4d13b18d7..4374d1487 100644 --- a/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUp.java +++ b/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUp.java @@ -124,6 +124,11 @@ public Double getValue() { return getEndValue(); } + @Override + public void setValue(Double value) { + setValue(value, false); + } + @Override public void setValue(Double value, boolean fireEvents) { setValue(value, fireEvents, true); diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java index c5bbf8fea..2372a4d9e 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java @@ -39,12 +39,18 @@ public Date getValue() { return dateInputParser.parseDate(format); } + @Override + public void setMask(String mask) { + this.format = mask; + parseFormatToMask(mask); + } + protected void parseFormatToMask(String format) { String dateFormatMask = format.toLowerCase() .replace("m", "0") .replace("d", "0") .replace("y", "0"); - setMask(dateFormatMask); + super.setMask(dateFormatMask); } public String getFormat() { diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java index 477a9993c..28b7e86a7 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java @@ -43,9 +43,10 @@ public Date parseDate(String format) { protected boolean isValid(String format) { if (valuebox.getText() != null && !valuebox.getText().isEmpty() && valuebox.getMask() != null && format != null) { + format = format.toLowerCase(); String dateString = valuebox.getText(); - String month = dateString.substring(format.indexOf("M"), format.indexOf("M/") + 1); - String day = dateString.substring(format.indexOf("d"), format.indexOf("d/") + 1); + String month = dateString.substring(format.indexOf("m"), format.indexOf("m") + 2); + String day = dateString.substring(format.indexOf("d"), format.indexOf("d") + 2); String year = dateString.substring(format.indexOf("y"), format.lastIndexOf("y") + 1); boolean validLeapYear = validateLeapYear(day, month, Integer.parseInt(year)); diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 2dcd63c45..380fa42ac 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -88,6 +88,11 @@ display: block } +.select2-results__option { + padding: 1rem; + min-height: 52px; +} + .select2-results__options { list-style: none; margin: 0; diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 508a1e96e..380fa42ac 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1 +1,857 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{top:24px;margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px} \ No newline at end of file +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle +} + +.select2 { + width: 100% !important +} + +.select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none +} + +.select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.select2-container .select2-selection--single .select2-selection__clear { + position: relative +} + +.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px +} + +.select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none +} + +.select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap +} + +.select2-container .select2-search--inline { + float: left +} + +.select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; + width: inherit !important; + padding-left: 0 !important +} + +.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none +} + +.select2-dropdown { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051 +} + +.select2-results { + display: block +} + +.select2-results__option { + padding: 1rem; + min-height: 52px; +} + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0 +} + +.select2-results__option { + user-select: none; + -webkit-user-select: none +} + +.select2-results__option[aria-selected] { + cursor: pointer +} + +.select2-container--open .select2-dropdown { + left: 0 +} + +.select2-container--open .select2-dropdown--above { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.select2-container--open .select2-dropdown--below { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.select2-search--dropdown { + display: block; + padding: 0 +} + +.select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; + margin-bottom: 0 +} + +.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none +} + +.select2-search--dropdown.select2-search--hide { + display: none +} + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0) +} + +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear, .select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none +} + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important +} + +.select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444 +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-size: 2em; + font-weight: 400; + color: #b5b5b5 +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #ccc +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + color: rgba(0, 0, 0, .3); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + border-bottom: 1px solid rgba(0, 0, 0, .14) +} + +.select2-container--disabled .select2-selection__rendered { + color: rgba(0, 0, 0, .4) !important +} + +.select2-container--default .select2-selection--multiple { + cursor: text +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0px; + width: 100% +} + +.select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #ccc; + margin-top: 5px; + float: left +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + margin-top: 0; + margin-right: 10px; + font-size: 2em; + margin-bottom: -4px; + color: #9e9e9e !important +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + font-size: 20px; + font-weight: 300; + float: right; + color: rgba(0, 0, 0, .6); + line-height: 28px; + padding-left: 8px; + cursor: pointer +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder { + float: right +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + color: rgba(0, 0, 0, .3); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + border-bottom: 1px solid rgba(0, 0, 0, .14) +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--below .select2-selection--single { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa +} + +.select2-container--default .select2-search--inline .select2-search__field { + background: 0 0; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield +} + +.select2-container--default .select2-results__option[role=group] { + padding: 0 +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999 +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd +} + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0 +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px +} + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, #fff 50%, #eee 100%); + background-image: -o-linear-gradient(top, #fff 50%, #eee 100%); + background-image: linear-gradient(to bottom, #fff 50%, #eee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0) +} + +.select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb +} + +.select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px +} + +.select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: 700; + margin-right: 10px +} + +.select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #ccc +} + +/** Arrow **/ +/** Header **/ +header nav .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent rgba(255,255,255,0.5) !important; +} + +/** Default **/ +.combobox .select2-container--open .select2-selection__arrow b, +.combobox .select2-selection__arrow b { + content: ""; + position: absolute; + right: 8px; + bottom: 12px; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 12px 12px; + border-color: transparent transparent #9c9c9c transparent !important; +} + +.combobox.outlined .select2-container--open .select2-selection__arrow b, +.combobox.outlined .select2-selection__arrow b { + bottom: 17px; +} + +.combobox .select2-container--disabled .select2-selection__arrow b { + border-color: transparent transparent #c7c7c7 transparent !important; +} + +.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 4px 0 0 4px; + left: 1px; + right: auto +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 46px +} + +.read-only.combobox .select2-selection__arrow { + display: none !important +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + position: absolute; + top: 1px; + right: 1px; + width: 20px +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eee 50%, #ccc 100%); + background-image: -o-linear-gradient(top, #eee 50%, #ccc 100%); + background-image: linear-gradient(to bottom, #eee 50%, #ccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0) +} + +/** Clear **/ +.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left +} + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, #fff 0, #eee 50%); + background-image: -o-linear-gradient(top, #fff 0, #eee 50%); + background-image: linear-gradient(to bottom, #fff 0, #eee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0) +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eee 50%, #fff 100%); + background-image: -o-linear-gradient(top, #eee 50%, #fff 100%); + background-image: linear-gradient(to bottom, #eee 50%, #fff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0) +} + +.select2-container--classic .select2-selection--multiple { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0 +} + +.select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb +} + +.select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px +} + +.select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: 700; + margin-right: 2px +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555 +} + +.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto +} + +.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto +} + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0 +} + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none +} + +.select2-container--classic .select2-dropdown { + background-color: #fff; + border: 1px solid transparent +} + +.select2-container--classic .select2-dropdown--above { + border-bottom: none +} + +.select2-container--classic .select2-dropdown--below { + border-top: none +} + +.select2-container--classic .select2-results__option[role=group] { + padding: 0 +} + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey +} + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: #fff +} + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px +} + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb +} + +.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single, .select2-container--default.select2-container--focus .select2-selection--multiple { + height: 46px; + border: none; + border-bottom: 1px solid #9e9e9e; + border-radius: 0; + outline: 0 +} + +.select2-container--default .select2-selection--multiple, .select2-container--default.select2-container--focus .select2-selection--multiple { + height: auto +} + +.select2-container--default .select2-search--inline .select2-search__field { + height: 30px +} + +.select2-container--default .select2-selection--multiple input { + margin: 0 +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, .6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4 +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 46px; + padding-left: 0 +} + +.select2-container--open .select2-dropdown--above, .select2-container--open .select2-dropdown--below { + border: none; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12) +} + +.select2-results__option { + padding: 1rem +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border-top: none; + border-right: none; + border-left: none +} + +.field-error.combobox, +.field-success.combobox { + border: none !important; + box-shadow: none !important; +} + +.field-error.combobox .select2-selection { + border-bottom: 1px solid #F44336; + box-shadow: 0 1px 0 0 #F44336; +} + +.field-success.combobox .select2-selection { + border-bottom: 1px solid #4CAF50; + box-shadow: 0 1px 0 0 #4CAF50; +} + +.read-only.combobox .select2-selection { + border: none !important +} + +.select2-container--default .select2-results__option--highlighted[aria-selected], div.tagsinput span.tag { + background-color: #eee; + transition: .3s ease +} + +.select2label { + left: 0 !important; + font-size: .8rem !important; + transform: translateY(-140%) +} + +.combobox { + margin-bottom: 15px +} + +.select2-container--default { + font-size: 1rem +} + +.field-success .select2label { + color: #4caf50 !important +} + +.field-error .select2label { + color: #f44336 !important +} + +.col.combobox .select2label { + left: 12px !important +} + +.read-only .select2-selection__rendered { + color: #000 !important +} + +header nav .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #fff !important +} + +header nav .select2-container--default .select2-selection--multiple, header nav .select2-container--default .select2-selection--single, header nav .select2-container--default.select2-container--focus .select2-selection--multiple { + border-bottom: none +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]) { + position: relative; + padding-left: 3rem !important +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before { + content: ''; + position: absolute; + z-index: 0; + border-radius: 1px; + transition: .2s; + margin: 1rem; + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 20% 40%; + transform-origin: 100% 100% +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0; + content: ''; + left: 0; + position: absolute; + transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s; + z-index: 1; + border-radius: 2px; + margin: 1rem +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid #26a69a; + background-color: #26a69a; + z-index: 0 +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before { + top: 2px; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + z-index: 1 +} + +/** Aligned Label **/ +.input-field.aligned-label.combobox .select2-container { + width: 70% !important; + display: inline-block; + position: relative; + vertical-align: middle +} + +.input-field.aligned-label.combobox label.select2label { + font-size: 1em !important +} + +/** Outlined **/ +.input-field.outlined.combobox .select2-selection { + border: 1px solid #e9e9e9; + border-radius: 4px; + height: 3em +} + +.input-field.outlined.combobox label.select2label { + top: 16px; + margin-left: 8px; + padding-left: 4px; + padding-right: 4px; + background: #fff +} + +.modal .input-field.outlined.combobox label.select2label { + background-color: #fafafa; +} + +.input-field.outlined.combobox .select2-container--open .select2-selection { + border: 2px solid #42a5f5; + box-shadow: none +} + +.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { + padding-left: 12px +} + +.input-field.outlined.field-error.combobox .select2-selection, +.input-field.outlined.field-error.combobox .select2-container--open .select2-selection { + border: 2px solid #F44336; + box-shadow: none; +} + +.input-field.outlined.field-success.combobox .select2-selection, +.input-field.outlined.field-success.combobox .select2-container--open .select2-selection { + border: 2px solid #4caf50; + box-shadow: none; +} + +/** Filled **/ +.input-field.filled.combobox .select2-container { + background: rgba(0, 0, 0, .04); + border-radius: 4px 4px 0 0 +} + +.input-field.filled.combobox label.select2label { + top: 24px; + margin-left: 12px +} + +.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { + padding-left: 12px; + padding-top: 4px +} \ No newline at end of file From 8805724e1c2738f8fe4aa92e4d3c1a3558769a90 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 27 Sep 2018 10:20:45 +0800 Subject: [PATCH 031/247] Bug changing divider color on MaterialSplitPanel #365 --- .../client/splitpanel/MaterialSplitPanel.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java index 4b67426b1..ced9b1057 100644 --- a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java +++ b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java @@ -102,6 +102,7 @@ public void load() { options.dock = getDock().getCssName(); options.orientation = getAxis().getCssName(); touchSplitter = $(getElement()).touchSplit(options); + applySplitterLineColor(splitterLineColor); } public TouchSplitter getTouchSplitter() { @@ -315,21 +316,14 @@ public Color getSplitterLineColor() { */ public void setSplitterLineColor(Color splitterLineColor) { this.splitterLineColor = splitterLineColor; - - if (isAttached()) { - applySplitterLineColor(splitterLineColor); - } else { - registerHandler(addAttachHandler(attachEvent -> applySplitterLineColor(splitterLineColor))); - } } protected void applySplitterLineColor(Color splitterLineColor) { - JQueryElement splitterBar = $(getElement()).find(".splitter-bar"); - if (splitterBar != null) { - if (splitterLineColor != null) { - splitterBar.addClass(splitterLineColor.getCssName()); - } else { - splitterBar.removeClass(splitterLineColor.getCssName()); + if (splitterLineColor != null) { + JQueryElement splitterBar = $(getElement()).find(".splitter-bar"); + if (splitterBar != null) { + MaterialWidget widget = new MaterialWidget(splitterBar); + widget.setBackgroundColor(splitterLineColor); } } } From 371eff0cd058e1799abaeba4e0b77cdd008c3f33 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Thu, 27 Sep 2018 20:44:59 +0800 Subject: [PATCH 032/247] Standardization - Field Display Type and Focus state --- .../client/combobox/MaterialComboBox.java | 18 +- .../addins/client/stepper/MaterialStep.java | 6 + .../client/stepper/MaterialStepper.java | 8 +- .../client/combobox/resources/css/select2.css | 16 + .../combobox/resources/css/select2.min.css | 858 +----------------- .../timepicker/resources/css/timepicker.css | 6 + .../resources/css/timepicker.min.css | 2 +- 7 files changed, 47 insertions(+), 867 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 5f60b1d11..d2fbdb41f 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -39,13 +39,11 @@ import gwt.material.design.addins.client.combobox.js.options.Params; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.*; -import gwt.material.design.client.base.mixin.EnabledMixin; -import gwt.material.design.client.base.mixin.FieldTypeMixin; -import gwt.material.design.client.base.mixin.ReadOnlyMixin; -import gwt.material.design.client.base.mixin.StatusTextMixin; +import gwt.material.design.client.base.mixin.*; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.FieldType; import gwt.material.design.client.ui.MaterialLabel; +import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.client.ui.html.Label; import gwt.material.design.client.ui.html.OptGroup; import gwt.material.design.client.ui.html.Option; @@ -119,9 +117,9 @@ public MaterialComboBox() { @Override protected void onLoad() { label.setInitialClasses(AddinsCssName.SELECT2LABEL); - super.add(listbox); - super.add(label); - super.add(errorLabel); + addWidget(listbox); + addWidget(label); + addWidget(errorLabel); errorLabel.setMarginTop(8); listbox.setGwtDisplay(Style.Display.BLOCK); @@ -171,6 +169,8 @@ public void load() { if (getTextColor() != null) { $(getElement()).find(".select2-selection__rendered").css("color", getTextColor().getCssName()); } + + getStatusTextMixin().getStatusDisplayMixin().setContainer(new MaterialWidget($(getElement()))); } @Override @@ -218,6 +218,10 @@ public void add(Widget child) { listbox.add(child); } + public void addWidget(Widget widget) { + super.add(widget); + } + /** * Add OptionGroup directly to combobox component * diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index aa32cedd7..336a7c7c5 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -31,6 +31,7 @@ import gwt.material.design.addins.client.stepper.constants.State; import gwt.material.design.client.base.*; import gwt.material.design.client.base.mixin.ActiveMixin; +import gwt.material.design.client.base.mixin.StatusDisplayMixin; import gwt.material.design.client.constants.Axis; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.IconType; @@ -249,6 +250,11 @@ public StatusDisplayType getStatusDisplayType() { return displayType; } + @Override + public void updateStatusDisplay(StatusDisplayMixin.StatusType statusType) { + // Nothing for now + } + protected void applyIconStatus(MaterialIcon icon, String description) { iconError.removeFromParent(); iconSuccess.removeFromParent(); diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 1fac7b2d0..311b330a8 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -43,8 +43,8 @@ import gwt.material.design.client.base.HasStatusText; import gwt.material.design.client.base.MaterialWidget; import gwt.material.design.client.base.mixin.CssNameMixin; +import gwt.material.design.client.base.mixin.StatusDisplayMixin; import gwt.material.design.client.constants.Axis; -import gwt.material.design.client.constants.Color; import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; @@ -52,7 +52,6 @@ import gwt.material.design.client.ui.animate.Transition; import gwt.material.design.client.ui.html.Div; import gwt.material.design.client.ui.html.Span; -import org.apache.regexp.RE; //@formatter:off @@ -462,6 +461,11 @@ public StatusDisplayType getStatusDisplayType() { return getCurrentStep().getStatusDisplayType(); } + @Override + public void updateStatusDisplay(StatusDisplayMixin.StatusType statusType) { + getCurrentStep().updateStatusDisplay(statusType); + } + /** * Get feedback message. */ diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 380fa42ac..3761ba10e 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -854,4 +854,20 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio .input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { padding-left: 12px; padding-top: 4px +} + +/** Focus **/ +.input-field.combobox .select2-container--focus .select2-selection { + border-bottom: 1px solid #42a5f5; + box-shadow: 0 1px 0 0 #42a5f5; +} + +.input-field.outlined.combobox .select2-container--focus .select2-selection { + border: 2px solid #42a5f5; + box-shadow: none; +} + +/** Hoverable Status **/ +.input-field.hoverable-status .select2-container--default .select2-selection--single .select2-selection__arrow { + display: none; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 380fa42ac..707f2b4de 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1,857 +1 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle -} - -.select2 { - width: 100% !important -} - -.select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none -} - -.select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap -} - -.select2-container .select2-selection--single .select2-selection__clear { - position: relative -} - -.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px -} - -.select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none -} - -.select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap -} - -.select2-container .select2-search--inline { - float: left -} - -.select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; - width: inherit !important; - padding-left: 0 !important -} - -.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none -} - -.select2-dropdown { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051 -} - -.select2-results { - display: block -} - -.select2-results__option { - padding: 1rem; - min-height: 52px; -} - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0 -} - -.select2-results__option { - user-select: none; - -webkit-user-select: none -} - -.select2-results__option[aria-selected] { - cursor: pointer -} - -.select2-container--open .select2-dropdown { - left: 0 -} - -.select2-container--open .select2-dropdown--above { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0 -} - -.select2-container--open .select2-dropdown--below { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.select2-search--dropdown { - display: block; - padding: 0 -} - -.select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; - margin-bottom: 0 -} - -.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none -} - -.select2-search--dropdown.select2-search--hide { - display: none -} - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0) -} - -.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear, .select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none -} - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - height: 1px !important; - margin: -1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important -} - -.select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto -} - -.select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444 -} - -.select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-size: 2em; - font-weight: 400; - color: #b5b5b5 -} - -.select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #ccc -} - -.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { - float: left -} - -.select2-container--default.select2-container--disabled .select2-selection--single { - color: rgba(0, 0, 0, .3); - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - border-bottom: 1px solid rgba(0, 0, 0, .14) -} - -.select2-container--disabled .select2-selection__rendered { - color: rgba(0, 0, 0, .4) !important -} - -.select2-container--default .select2-selection--multiple { - cursor: text -} - -.select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0px; - width: 100% -} - -.select2-container--default .select2-selection--multiple .select2-selection__placeholder { - color: #ccc; - margin-top: 5px; - float: left -} - -.select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - margin-top: 0; - margin-right: 10px; - font-size: 2em; - margin-bottom: -4px; - color: #9e9e9e !important -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice { - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - font-size: 20px; - font-weight: 300; - float: right; - color: rgba(0, 0, 0, .6); - line-height: 28px; - padding-left: 8px; - cursor: pointer -} - -.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder { - float: right -} - -.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto -} - -.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto -} - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - color: rgba(0, 0, 0, .3); - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - border-bottom: 1px solid rgba(0, 0, 0, .14) -} - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--below .select2-selection--single { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0 -} - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa -} - -.select2-container--default .select2-search--inline .select2-search__field { - background: 0 0; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield -} - -.select2-container--default .select2-results__option[role=group] { - padding: 0 -} - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999 -} - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd -} - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0 -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em -} - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px -} - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, #fff 50%, #eee 100%); - background-image: -o-linear-gradient(top, #fff 50%, #eee 100%); - background-image: linear-gradient(to bottom, #fff 50%, #eee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0) -} - -.select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb -} - -.select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px -} - -.select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: 700; - margin-right: 10px -} - -.select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #ccc -} - -/** Arrow **/ -/** Header **/ -header nav .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent rgba(255,255,255,0.5) !important; -} - -/** Default **/ -.combobox .select2-container--open .select2-selection__arrow b, -.combobox .select2-selection__arrow b { - content: ""; - position: absolute; - right: 8px; - bottom: 12px; - width: 0; - height: 0; - border-style: solid; - border-width: 0 0 12px 12px; - border-color: transparent transparent #9c9c9c transparent !important; -} - -.combobox.outlined .select2-container--open .select2-selection__arrow b, -.combobox.outlined .select2-selection__arrow b { - bottom: 17px; -} - -.combobox .select2-container--disabled .select2-selection__arrow b { - border-color: transparent transparent #c7c7c7 transparent !important; -} - -.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 4px 0 0 4px; - left: 1px; - right: auto -} - -.select2-container--default .select2-selection--single .select2-selection__arrow { - height: 46px -} - -.read-only.combobox .select2-selection__arrow { - display: none !important -} - -.select2-container--default .select2-selection--single .select2-selection__arrow { - position: absolute; - top: 1px; - right: 1px; - width: 20px -} - -.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto -} - -.select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eee 50%, #ccc 100%); - background-image: -o-linear-gradient(top, #eee 50%, #ccc 100%); - background-image: linear-gradient(to bottom, #eee 50%, #ccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0) -} - -/** Clear **/ -.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear { - float: left -} - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb -} - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, #fff 0, #eee 50%); - background-image: -o-linear-gradient(top, #fff 0, #eee 50%); - background-image: linear-gradient(to bottom, #fff 0, #eee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0) -} - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eee 50%, #fff 100%); - background-image: -o-linear-gradient(top, #eee 50%, #fff 100%); - background-image: linear-gradient(to bottom, #eee 50%, #fff 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0) -} - -.select2-container--classic .select2-selection--multiple { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0 -} - -.select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb -} - -.select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px -} - -.select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none -} - -.select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px -} - -.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: 700; - margin-right: 2px -} - -.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555 -} - -.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto -} - -.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto -} - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb -} - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0 -} - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0 -} - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none -} - -.select2-container--classic .select2-dropdown { - background-color: #fff; - border: 1px solid transparent -} - -.select2-container--classic .select2-dropdown--above { - border-bottom: none -} - -.select2-container--classic .select2-dropdown--below { - border-top: none -} - -.select2-container--classic .select2-results__option[role=group] { - padding: 0 -} - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey -} - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: #fff -} - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px -} - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb -} - -.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single, .select2-container--default.select2-container--focus .select2-selection--multiple { - height: 46px; - border: none; - border-bottom: 1px solid #9e9e9e; - border-radius: 0; - outline: 0 -} - -.select2-container--default .select2-selection--multiple, .select2-container--default.select2-container--focus .select2-selection--multiple { - height: auto -} - -.select2-container--default .select2-search--inline .select2-search__field { - height: 30px -} - -.select2-container--default .select2-selection--multiple input { - margin: 0 -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice { - display: inline-block; - height: 32px; - font-size: 13px; - font-weight: 500; - color: rgba(0, 0, 0, .6); - line-height: 32px; - padding: 0 12px; - border-radius: 16px; - background-color: #e4e4e4 -} - -.select2-container--default .select2-selection--single .select2-selection__rendered { - line-height: 46px; - padding-left: 0 -} - -.select2-container--open .select2-dropdown--above, .select2-container--open .select2-dropdown--below { - border: none; - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12) -} - -.select2-results__option { - padding: 1rem -} - -.select2-container--default .select2-search--dropdown .select2-search__field { - border-top: none; - border-right: none; - border-left: none -} - -.field-error.combobox, -.field-success.combobox { - border: none !important; - box-shadow: none !important; -} - -.field-error.combobox .select2-selection { - border-bottom: 1px solid #F44336; - box-shadow: 0 1px 0 0 #F44336; -} - -.field-success.combobox .select2-selection { - border-bottom: 1px solid #4CAF50; - box-shadow: 0 1px 0 0 #4CAF50; -} - -.read-only.combobox .select2-selection { - border: none !important -} - -.select2-container--default .select2-results__option--highlighted[aria-selected], div.tagsinput span.tag { - background-color: #eee; - transition: .3s ease -} - -.select2label { - left: 0 !important; - font-size: .8rem !important; - transform: translateY(-140%) -} - -.combobox { - margin-bottom: 15px -} - -.select2-container--default { - font-size: 1rem -} - -.field-success .select2label { - color: #4caf50 !important -} - -.field-error .select2label { - color: #f44336 !important -} - -.col.combobox .select2label { - left: 12px !important -} - -.read-only .select2-selection__rendered { - color: #000 !important -} - -header nav .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #fff !important -} - -header nav .select2-container--default .select2-selection--multiple, header nav .select2-container--default .select2-selection--single, header nav .select2-container--default.select2-container--focus .select2-selection--multiple { - border-bottom: none -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]) { - position: relative; - padding-left: 3rem !important -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before { - content: ''; - position: absolute; - z-index: 0; - border-radius: 1px; - transition: .2s; - margin: 1rem; - width: 0; - height: 0; - border: 3px solid transparent; - left: 6px; - top: 10px; - -webkit-transform: rotateZ(37deg); - transform: rotateZ(37deg); - -webkit-transform-origin: 20% 40%; - transform-origin: 100% 100% -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after { - height: 20px; - width: 20px; - background-color: transparent; - border: 2px solid #5a5a5a; - top: 0; - content: ''; - left: 0; - position: absolute; - transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s; - z-index: 1; - border-radius: 2px; - margin: 1rem -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after { - top: 0; - width: 20px; - height: 20px; - border: 2px solid #26a69a; - background-color: #26a69a; - z-index: 0 -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before { - top: 2px; - left: 1px; - width: 8px; - height: 13px; - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: 2px solid #fff; - border-bottom: 2px solid #fff; - -webkit-transform: rotateZ(37deg); - transform: rotateZ(37deg); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - z-index: 1 -} - -/** Aligned Label **/ -.input-field.aligned-label.combobox .select2-container { - width: 70% !important; - display: inline-block; - position: relative; - vertical-align: middle -} - -.input-field.aligned-label.combobox label.select2label { - font-size: 1em !important -} - -/** Outlined **/ -.input-field.outlined.combobox .select2-selection { - border: 1px solid #e9e9e9; - border-radius: 4px; - height: 3em -} - -.input-field.outlined.combobox label.select2label { - top: 16px; - margin-left: 8px; - padding-left: 4px; - padding-right: 4px; - background: #fff -} - -.modal .input-field.outlined.combobox label.select2label { - background-color: #fafafa; -} - -.input-field.outlined.combobox .select2-container--open .select2-selection { - border: 2px solid #42a5f5; - box-shadow: none -} - -.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { - padding-left: 12px -} - -.input-field.outlined.field-error.combobox .select2-selection, -.input-field.outlined.field-error.combobox .select2-container--open .select2-selection { - border: 2px solid #F44336; - box-shadow: none; -} - -.input-field.outlined.field-success.combobox .select2-selection, -.input-field.outlined.field-success.combobox .select2-container--open .select2-selection { - border: 2px solid #4caf50; - box-shadow: none; -} - -/** Filled **/ -.input-field.filled.combobox .select2-container { - background: rgba(0, 0, 0, .04); - border-radius: 4px 4px 0 0 -} - -.input-field.filled.combobox label.select2label { - top: 24px; - margin-left: 12px -} - -.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { - padding-left: 12px; - padding-top: 4px -} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{top:24px;margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.hoverable-status .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css index 215dad2de..e3bfb736e 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css @@ -633,4 +633,10 @@ border: 2px solid #4caf50 !important; box-shadow: none !important; margin-bottom: 8px; +} + +/** Focus **/ +.input-field.timepicker input.valid { + border-bottom: 1px solid #42a5f5; + box-shadow: 0 1px 0 0 #42a5f5; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css index 7cd20f58e..be0ce3a59 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css @@ -1 +1 @@ -.lolliclock-popover{border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26),0 2px 10px 0 rgba(0,0,0,.16);font-family:Roboto,'Helvetica Neue, Helvetica, Arial',sans-serif;background-color:#fff;font-size:20px;user-select:none;margin:10% auto auto;width:250px;height:380px;z-index:999;position:relative}.landscape .lolliclock-popover{width:450px;height:250px}.landscape .lolliclock-header{display:inline-block!important;vertical-align:middle!important;width:140px!important;height:100%!important;padding-top:20%!important;padding-left:10px!important;animation:none!important;-webkit-animation:none!important;-moa-animation:none!important}.landscape .popover-content{display:inline-block!important;vertical-align:top!important;width:310px!important}.landscape .lolliclock-buttons{margin-top:-40px!important}.landscape .lolliclock-am-pm{padding-left:50px!important;font-size:20px!important}.landscape .lolliclock-ampm-block{display:none!important}.clock-overlay{position:fixed!important;width:100%!important;top:0!important;left:0!important;bottom:0!important;right:0!important;height:100%!important;background:rgba(0,0,0,.3);z-index:10000}.lolliclock-popover.animate{max-height:0;animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-popover.animate-out{animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-header{background:#03a9f4;height:85px;width:250px;display:flex;color:#fff;font-size:2.3em;font-weight:400;align-items:center;justify-content:center;overflow:hidden}.lolliclock-hours,.lolliclock-minutes{width:51px;overflow:hidden;opacity:.6}.lolliclock-header.animate{height:0;animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-header.animate-out{animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time{display:flex;align-self:center}.lolliclock-hours{text-align:right;cursor:pointer;height:54px}.lolliclock-colon{opacity:.6;cursor:default}.lolliclock-minutes{cursor:pointer;height:54px}.lolliclock-am-pm{cursor:pointer;font-size:10px;top:47px;left:157px;opacity:.6;padding:3px}.lolliclock-primary-text{color:#fff;opacity:1}.lolliclock-time-old{opacity:1;height:54px}.lolliclock-time-new{opacity:0}.lolliclock-time .old-up{animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-up{animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .old-down{animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-down{animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-old.animate{animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-old.animate{animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.popover-content{padding:18px 14px;width:250px;height:203px}.lolliclock-canvas,.lolliclock-dial,.lolliclock-plate{width:168px;height:168px}.lolliclock-dial{transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s}.lolliclock-dial-out{transform:scale(1.25,1.25);-webkit-transform:scale(1.25,1.25);-moz-transform:scale(1.25,1.25);opacity:0}.lolliclock-plate{background:#f0f0f0;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;position:relative;margin:auto}.lolliclock-ampm-btn,.lolliclock-tick{border-radius:100%;font-weight:600;cursor:pointer}.lolliclock-canvas,.lolliclock-dial,.lolliclock-tick{position:absolute}.lolliclock-plate.animate{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0);animation:open-clock 150ms 150ms forwards;-webkit-animation:open-clock 150ms 150ms forwards;-moz-animation:open-clock 150ms 150ms forwards}.lolliclock-plate.animate-out{animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-dial-minutes{visibility:hidden}.lolliclock-bearing{fill:#000;stroke-width:1}.lolliclock-canvas line{stroke:#b3e5fc;stroke-width:1;stroke-linecap:round}.lolliclock-canvas-fg{stroke:none;fill:#0288d1}.lolliclock-canvas-bg{fill:rgba(3,169,244,.25)}.lolliclock-tick{-webkit-border-radius:100%;-moz-border-radius:100%;color:#666;line-height:24px;text-align:center;width:24px;height:24px;font-size:.55em}.lolliclock-tick.active,.lolliclock-tick:hover{background:#b3e5fc}.lolliclock-ampm-block{display:flex;justify-content:space-around;margin-top:20px}.lolliclock-ampm-btn{position:relative;height:35px;width:35px;-webkit-border-radius:100%;-moz-border-radius:100%;font-size:10px}.lolliclock-ampm-btn.animate{opacity:0;animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-ampm-btn.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate{opacity:0;animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-btn-background{position:absolute;height:35px;width:35px;opacity:0;transform:scale(0);-moz-transform:scale(0);-webkit-transform:scale(0)}.lolliclock-btn-text{position:absolute;width:100%;text-align:center;line-height:35px;vertical-align:middle;color:#212121}.lolliclock-active-button-background{background-color:#03a9f4;border-radius:100%;transition:transform 175ms;-webkit-transition:transform 175ms;-moz-transition:transform 175ms;transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1}.lolliclock-active-button-text{color:#fff}.lolliclock-ampm-btn:focus{outline:0}.lolliclock-clickable{cursor:pointer}.lolliclock-moving{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.lolliclock-export{display:hidden}.lolliclock-buttons{font-size:11px;display:flex;justify-content:flex-end;margin-top:50px;margin-right:8px}.lolliclock-button{font-weight:500;color:#03a9f4;cursor:pointer;padding:8px;min-width:32px;margin:0 4px;background:0 0;text-align:center;text-transform:uppercase;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}@-moz-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-webkit-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-o-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-moz-keyframes slide-header{0%{height:0}100%{height:85px}}@-webkit-keyframes slide-header{0%{height:0}100%{height:85px}}@-o-keyframes slide-header{0%{height:0}100%{height:85px}}@keyframes slide-header{0%{height:0}100%{height:85px}}@-moz-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-webkit-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-o-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-moz-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-o-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-moz-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-webkit-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-o-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-moz-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@-o-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}.timepicker input{position:relative}.input-field.outlined.timepicker input.valid,.input-field.outlined.timepicker input:focus{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.timepicker input.field-error,.input-field.outlined.timepicker input.field-error:focus{border:2px solid #f44336!important;box-shadow:none!important;margin-bottom:8px}.input-field.outlined.timepicker input.field-success,.input-field.outlined.timepicker input.field-success:focus{border:2px solid #4caf50!important;box-shadow:none!important;margin-bottom:8px} \ No newline at end of file +.lolliclock-popover{border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26),0 2px 10px 0 rgba(0,0,0,.16);font-family:Roboto,'Helvetica Neue, Helvetica, Arial',sans-serif;background-color:#fff;font-size:20px;user-select:none;margin:10% auto auto;width:250px;height:380px;z-index:999;position:relative}.landscape .lolliclock-popover{width:450px;height:250px}.landscape .lolliclock-header{display:inline-block!important;vertical-align:middle!important;width:140px!important;height:100%!important;padding-top:20%!important;padding-left:10px!important;animation:none!important;-webkit-animation:none!important;-moa-animation:none!important}.landscape .popover-content{display:inline-block!important;vertical-align:top!important;width:310px!important}.landscape .lolliclock-buttons{margin-top:-40px!important}.landscape .lolliclock-am-pm{padding-left:50px!important;font-size:20px!important}.landscape .lolliclock-ampm-block{display:none!important}.clock-overlay{position:fixed!important;width:100%!important;top:0!important;left:0!important;bottom:0!important;right:0!important;height:100%!important;background:rgba(0,0,0,.3);z-index:10000}.lolliclock-popover.animate{max-height:0;animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-popover.animate-out{animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-header{background:#03a9f4;height:85px;width:250px;display:flex;color:#fff;font-size:2.3em;font-weight:400;align-items:center;justify-content:center;overflow:hidden}.lolliclock-hours,.lolliclock-minutes{width:51px;overflow:hidden;opacity:.6}.lolliclock-header.animate{height:0;animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-header.animate-out{animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time{display:flex;align-self:center}.lolliclock-hours{text-align:right;cursor:pointer;height:54px}.lolliclock-colon{opacity:.6;cursor:default}.lolliclock-minutes{cursor:pointer;height:54px}.lolliclock-am-pm{cursor:pointer;font-size:10px;top:47px;left:157px;opacity:.6;padding:3px}.lolliclock-primary-text{color:#fff;opacity:1}.lolliclock-time-old{opacity:1;height:54px}.lolliclock-time-new{opacity:0}.lolliclock-time .old-up{animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-up{animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .old-down{animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-down{animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-old.animate{animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-old.animate{animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.popover-content{padding:18px 14px;width:250px;height:203px}.lolliclock-canvas,.lolliclock-dial,.lolliclock-plate{width:168px;height:168px}.lolliclock-dial{transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s}.lolliclock-dial-out{transform:scale(1.25,1.25);-webkit-transform:scale(1.25,1.25);-moz-transform:scale(1.25,1.25);opacity:0}.lolliclock-plate{background:#f0f0f0;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;position:relative;margin:auto}.lolliclock-ampm-btn,.lolliclock-tick{border-radius:100%;font-weight:600;cursor:pointer}.lolliclock-canvas,.lolliclock-dial,.lolliclock-tick{position:absolute}.lolliclock-plate.animate{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0);animation:open-clock 150ms 150ms forwards;-webkit-animation:open-clock 150ms 150ms forwards;-moz-animation:open-clock 150ms 150ms forwards}.lolliclock-plate.animate-out{animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-dial-minutes{visibility:hidden}.lolliclock-bearing{fill:#000;stroke-width:1}.lolliclock-canvas line{stroke:#b3e5fc;stroke-width:1;stroke-linecap:round}.lolliclock-canvas-fg{stroke:none;fill:#0288d1}.lolliclock-canvas-bg{fill:rgba(3,169,244,.25)}.lolliclock-tick{-webkit-border-radius:100%;-moz-border-radius:100%;color:#666;line-height:24px;text-align:center;width:24px;height:24px;font-size:.55em}.lolliclock-tick.active,.lolliclock-tick:hover{background:#b3e5fc}.lolliclock-ampm-block{display:flex;justify-content:space-around;margin-top:20px}.lolliclock-ampm-btn{position:relative;height:35px;width:35px;-webkit-border-radius:100%;-moz-border-radius:100%;font-size:10px}.lolliclock-ampm-btn.animate{opacity:0;animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-ampm-btn.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate{opacity:0;animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-btn-background{position:absolute;height:35px;width:35px;opacity:0;transform:scale(0);-moz-transform:scale(0);-webkit-transform:scale(0)}.lolliclock-btn-text{position:absolute;width:100%;text-align:center;line-height:35px;vertical-align:middle;color:#212121}.lolliclock-active-button-background{background-color:#03a9f4;border-radius:100%;transition:transform 175ms;-webkit-transition:transform 175ms;-moz-transition:transform 175ms;transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1}.lolliclock-active-button-text{color:#fff}.lolliclock-ampm-btn:focus{outline:0}.lolliclock-clickable{cursor:pointer}.lolliclock-moving{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.lolliclock-export{display:hidden}.lolliclock-buttons{font-size:11px;display:flex;justify-content:flex-end;margin-top:50px;margin-right:8px}.lolliclock-button{font-weight:500;color:#03a9f4;cursor:pointer;padding:8px;min-width:32px;margin:0 4px;background:0 0;text-align:center;text-transform:uppercase;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}@-moz-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-webkit-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-o-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-moz-keyframes slide-header{0%{height:0}100%{height:85px}}@-webkit-keyframes slide-header{0%{height:0}100%{height:85px}}@-o-keyframes slide-header{0%{height:0}100%{height:85px}}@keyframes slide-header{0%{height:0}100%{height:85px}}@-moz-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-webkit-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-o-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-moz-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-o-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-moz-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-webkit-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-o-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-moz-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@-o-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}.timepicker input{position:relative}.input-field.outlined.timepicker input.valid,.input-field.outlined.timepicker input:focus{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.timepicker input.field-error,.input-field.outlined.timepicker input.field-error:focus{border:2px solid #f44336!important;box-shadow:none!important;margin-bottom:8px}.input-field.outlined.timepicker input.field-success,.input-field.outlined.timepicker input.field-success:focus{border:2px solid #4caf50!important;box-shadow:none!important;margin-bottom:8px}.input-field.timepicker input.valid{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5} \ No newline at end of file From 612fdc9288d4db76fafaabc64652db7923df6a20 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 28 Sep 2018 19:56:51 +0800 Subject: [PATCH 033/247] Recaptcha provided getResponse() method --- .../incubator/client/google/recaptcha/ReCaptcha.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java index 42e7d235c..3782de83d 100644 --- a/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java @@ -152,4 +152,12 @@ public void setType(RecaptchaType type) { public RecaptchaType getType() { return type; } + + /** + * Will get the response + * @return + */ + public String getResponse() { + return $this().find("#g-recaptcha-response").val().toString(); + } } From f1ae25cbe65d1bdcbd1f08b3e86d0627db775247 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Fri, 28 Sep 2018 19:59:14 +0800 Subject: [PATCH 034/247] ComboBox support for required field --- .../design/addins/client/combobox/MaterialComboBox.java | 2 +- .../design/addins/client/combobox/resources/css/select2.css | 1 - .../design/addins/client/combobox/resources/css/select2.min.css | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index d2fbdb41f..3ba703065 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -822,7 +822,7 @@ protected EnabledMixin getEnabledMixin() { @Override public StatusTextMixin getStatusTextMixin() { if (statusTextMixin == null) { - statusTextMixin = new StatusTextMixin<>(this, errorLabel, this.asWidget()); + statusTextMixin = new StatusTextMixin<>(this, errorLabel, this.asWidget(), label); } return statusTextMixin; } diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 3761ba10e..9ba759f0b 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -847,7 +847,6 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio } .input-field.filled.combobox label.select2label { - top: 24px; margin-left: 12px } diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 707f2b4de..054bc9c47 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1 +1 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{top:24px;margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.hoverable-status .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.hoverable-status .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file From cb4b55e91727b5c34b95641d5a4d8be653f7ecbd Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Sat, 29 Sep 2018 06:08:33 +0800 Subject: [PATCH 035/247] ReCaptcha updates - added getResponse(), expiredCallback errorCallback, refactored callback to dataCallback --- .../client/google/recaptcha/ReCaptcha.java | 41 +++++++++++++++---- .../google/recaptcha/js/JsReCaptcha.java | 6 ++- .../recaptcha/resources/js/recaptcha.js | 36 ++++++++++++++-- .../recaptcha/resources/js/recaptcha.min.js | 2 +- .../incubator/client/ui/ReCaptchaTest.java | 6 +-- 5 files changed, 75 insertions(+), 16 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java index 3782de83d..35461fd57 100644 --- a/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha/ReCaptcha.java @@ -91,14 +91,16 @@ public ReCaptcha() { private RecaptchaTheme theme = RecaptchaTheme.LIGHT; private RecaptchaType type = RecaptchaType.IMAGE; - private Functions.Func callback; + private Functions.Func1 dataCallback; + private Functions.Func expiredCallback; + private Functions.Func errorCallback; private JsReCaptcha reCaptcha; public void load(RecaptchaApi recaptchaApi) { String uid = DOM.createUniqueId(); setId(uid); - reCaptcha = JsReCaptcha.initReCaptcha(uid, recaptchaApi.getApiKey(), callback, theme.getTheme(), type.getType()); + reCaptcha = JsReCaptcha.initReCaptcha(uid, recaptchaApi.getApiKey(), dataCallback, expiredCallback, errorCallback, theme.getTheme(), type.getType()); } @Override @@ -123,12 +125,37 @@ public void reload() { /** * Set a callback method once reCaptcha is confirmed and validated */ - public void setCallback(Functions.Func callback) { - this.callback = callback; + public void setDataCallback(Functions.Func1 callback) { + this.dataCallback = callback; } - public Functions.Func getCallback() { - return callback; + public Functions.Func1 getDataCallback() { + return dataCallback; + } + + public Functions.Func getExpiredCallback() { + return expiredCallback; + } + + /** + * Optional. The name of your callback function, executed when the reCAPTCHA response expires and the user needs to + * re-verify. + */ + public void setExpiredCallback(Functions.Func expiredCallback) { + this.expiredCallback = expiredCallback; + } + + public Functions.Func getErrorCallback() { + return errorCallback; + } + + /** + * Optional. The name of your callback function, executed when reCAPTCHA encounters an error (usually network + * connectivity) and cannot continue until connectivity is restored. If you specify a function here, you are + * responsible for informing the user that they should retry. + */ + public void setErrorCallback(Functions.Func errorCallback) { + this.errorCallback = errorCallback; } /** @@ -158,6 +185,6 @@ public RecaptchaType getType() { * @return */ public String getResponse() { - return $this().find("#g-recaptcha-response").val().toString(); + return reCaptcha.getResponse(); } } diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha/js/JsReCaptcha.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha/js/JsReCaptcha.java index e4f19fbdb..380a95954 100644 --- a/src/main/java/gwt/material/design/incubator/client/google/recaptcha/js/JsReCaptcha.java +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha/js/JsReCaptcha.java @@ -29,8 +29,12 @@ public class JsReCaptcha extends JQueryElement { @JsMethod(namespace = JsPackage.GLOBAL) - public static native JsReCaptcha initReCaptcha(String element, String siteKey, Functions.Func callback, String theme, String type); + public static native JsReCaptcha initReCaptcha(String element, String siteKey, Functions.Func1 callback, + Functions.Func expiredCallback, Functions.Func errorCallback, String theme, String type); @JsMethod(namespace = JsPackage.GLOBAL) public static native void reset(); + + @JsMethod(namespace = JsPackage.GLOBAL) + public static native String getResponse(); } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js index a2e390722..975ae3ab2 100644 --- a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js +++ b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js @@ -1,28 +1,56 @@ var _element; var _siteKey; var _callback; +var _expiredCallback; +var _errorCallback; var _theme; var _validation_type; var _callbacks = $.Callbacks(); +var _errorCallbacks = $.Callbacks(); +var _expiredCallbacks = $.Callbacks(); -function initReCaptcha(element, siteKey, callback, theme, type) { +function initReCaptcha(element, siteKey, callback, expiredCallback, errorCallback, theme, type) { _element = element; _siteKey = siteKey; - _callback = callback; - _callbacks.add(callback); _theme = theme; _validation_type = type; + + // Data Callback + _callback = callback; + _callbacks.add(callback); + + // Data Expired Callback + _expiredCallback = expiredCallback; + _expiredCallbacks.add(expiredCallback); + + // Data Error Callback + _errorCallback = errorCallback; + _errorCallbacks.add(errorCallback); } var recaptchaCallback = function() { grecaptcha.render(_element, { 'sitekey' : _siteKey, 'callback' : recaptchaVerifyCallback, + 'expired-callback' : recaptchaExpiredCallback, + 'error-callback' : recaptchaErrorCallback, 'theme' : _theme, 'type' : _validation_type }); }; +function getResponse() { + return grecaptcha.getResponse(); +} + var recaptchaVerifyCallback = function(response) { - _callbacks.fire(); + _callbacks.fire(response); +} + +var recaptchaExpiredCallback = function() { + _expiredCallbacks.fire(); +} + +var recaptchaErrorCallback = function() { + _errorCallbacks.fire(); } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js index 4ab6ef9e4..2f1498078 100644 --- a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js @@ -1 +1 @@ -var _element,_siteKey,_callback,_theme,_validation_type,_callbacks=$.Callbacks();function initReCaptcha(a,e,c,t,l){_element=a,_siteKey=e,_callback=c,_callbacks.add(c),_theme=t,_validation_type=l}var recaptchaCallback=function(){grecaptcha.render(_element,{sitekey:_siteKey,callback:recaptchaVerifyCallback,theme:_theme,type:_validation_type})},recaptchaVerifyCallback=function(a){_callbacks.fire()}; \ No newline at end of file +var _element,_siteKey,_callback,_expiredCallback,_errorCallback,_theme,_validation_type,_callbacks=$.Callbacks(),_errorCallbacks=$.Callbacks(),_expiredCallbacks=$.Callbacks();function initReCaptcha(a,e,l,c,r,t,i){_element=a,_siteKey=e,_theme=t,_validation_type=i,_callback=l,_callbacks.add(l),_expiredCallback=c,_expiredCallbacks.add(c),_errorCallback=r,_errorCallbacks.add(r)}var recaptchaCallback=function(){grecaptcha.render(_element,{sitekey:_siteKey,callback:recaptchaVerifyCallback,"expired-callback":recaptchaExpiredCallback,"error-callback":recaptchaErrorCallback,theme:_theme,type:_validation_type})};function getResponse(){return grecaptcha.getResponse()}var recaptchaVerifyCallback=function(a){_callbacks.fire(a)},recaptchaExpiredCallback=function(){_expiredCallbacks.fire()},recaptchaErrorCallback=function(){_errorCallbacks.fire()}; \ No newline at end of file diff --git a/src/test/java/gwt/material/design/incubator/client/ui/ReCaptchaTest.java b/src/test/java/gwt/material/design/incubator/client/ui/ReCaptchaTest.java index 293453597..911ba4363 100644 --- a/src/test/java/gwt/material/design/incubator/client/ui/ReCaptchaTest.java +++ b/src/test/java/gwt/material/design/incubator/client/ui/ReCaptchaTest.java @@ -47,9 +47,9 @@ public void testProperties() { assertEquals(reCaptcha.getTheme(), RecaptchaTheme.DARK); // Check Callback - final Functions.Func callback = () -> {}; - reCaptcha.setCallback(callback); - assertEquals(reCaptcha.getCallback(), callback); + final Functions.Func1 callback = (response) -> {}; + reCaptcha.setDataCallback(callback); + assertEquals(reCaptcha.getDataCallback(), callback); // Check Type // Expected by default - IMAGE From 778a239895a3f4f14335cb79b90dcc3ed120f4a9 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Sat, 29 Sep 2018 07:40:50 +0800 Subject: [PATCH 036/247] Wrap recaptcha reset function. --- .../client/google/recaptcha/resources/js/recaptcha.js | 4 ++++ .../client/google/recaptcha/resources/js/recaptcha.min.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js index 975ae3ab2..d2263caa5 100644 --- a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js +++ b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.js @@ -43,6 +43,10 @@ function getResponse() { return grecaptcha.getResponse(); } +function reset() { + grecaptcha.reset(); +} + var recaptchaVerifyCallback = function(response) { _callbacks.fire(response); } diff --git a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js index 2f1498078..4f84dfd51 100644 --- a/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/google/recaptcha/resources/js/recaptcha.min.js @@ -1 +1 @@ -var _element,_siteKey,_callback,_expiredCallback,_errorCallback,_theme,_validation_type,_callbacks=$.Callbacks(),_errorCallbacks=$.Callbacks(),_expiredCallbacks=$.Callbacks();function initReCaptcha(a,e,l,c,r,t,i){_element=a,_siteKey=e,_theme=t,_validation_type=i,_callback=l,_callbacks.add(l),_expiredCallback=c,_expiredCallbacks.add(c),_errorCallback=r,_errorCallbacks.add(r)}var recaptchaCallback=function(){grecaptcha.render(_element,{sitekey:_siteKey,callback:recaptchaVerifyCallback,"expired-callback":recaptchaExpiredCallback,"error-callback":recaptchaErrorCallback,theme:_theme,type:_validation_type})};function getResponse(){return grecaptcha.getResponse()}var recaptchaVerifyCallback=function(a){_callbacks.fire(a)},recaptchaExpiredCallback=function(){_expiredCallbacks.fire()},recaptchaErrorCallback=function(){_errorCallbacks.fire()}; \ No newline at end of file +var _element,_siteKey,_callback,_expiredCallback,_errorCallback,_theme,_validation_type,_callbacks=$.Callbacks(),_errorCallbacks=$.Callbacks(),_expiredCallbacks=$.Callbacks();function initReCaptcha(a,e,c,l,r,t,i){_element=a,_siteKey=e,_theme=t,_validation_type=i,_callback=c,_callbacks.add(c),_expiredCallback=l,_expiredCallbacks.add(l),_errorCallback=r,_errorCallbacks.add(r)}var recaptchaCallback=function(){grecaptcha.render(_element,{sitekey:_siteKey,callback:recaptchaVerifyCallback,"expired-callback":recaptchaExpiredCallback,"error-callback":recaptchaErrorCallback,theme:_theme,type:_validation_type})};function getResponse(){return grecaptcha.getResponse()}function reset(){grecaptcha.reset()}var recaptchaVerifyCallback=function(a){_callbacks.fire(a)},recaptchaExpiredCallback=function(){_expiredCallbacks.fire()},recaptchaErrorCallback=function(){_errorCallbacks.fire()}; \ No newline at end of file From e7d9b5ac7b4cd70e0291749abd2dafdc5c8378ca Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Mon, 1 Oct 2018 07:57:02 +0800 Subject: [PATCH 037/247] Additional style fixes on Status Display for MaterialComboBox. --- .../design/addins/client/combobox/resources/css/select2.css | 3 ++- .../addins/client/combobox/resources/css/select2.min.css | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 9ba759f0b..cd2d6ac3e 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -867,6 +867,7 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio } /** Hoverable Status **/ -.input-field.hoverable-status .select2-container--default .select2-selection--single .select2-selection__arrow { +.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow, +.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{ display: none; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 054bc9c47..4fda323d0 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1 +1 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.hoverable-status .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file From 6a3a5b2c3aa62dbc9e0f40ba705ca6e21acd5a2c Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Mon, 1 Oct 2018 13:49:05 +0800 Subject: [PATCH 038/247] Recent style updates --- .../client/timepicker/MaterialTimePicker.java | 2 +- .../client/combobox/resources/css/select2.css | 13 +++++++++++++ .../client/combobox/resources/css/select2.min.css | 2 +- .../client/timepicker/resources/css/timepicker.css | 10 ++++++++++ .../timepicker/resources/css/timepicker.min.css | 2 +- .../addins/client/ui/MaterialTimePickerTest.java | 4 ++-- 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java index 76cf3ecde..04ad80edc 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java @@ -118,8 +118,8 @@ protected void onLoad() { setUniqueId(DOM.createUniqueId()); timeInput.setType(InputType.TEXT); - container.add(label); container.add(timeInput); + container.add(label); container.add(errorLabel); add(container); timeInput.getElement().setAttribute("type", "text"); diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index cd2d6ac3e..1e3f837e6 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -846,6 +846,10 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio border-radius: 4px 4px 0 0 } +.input-field.filled.combobox .select2-container.select2-container--disabled { + background: transparent; +} + .input-field.filled.combobox label.select2label { margin-left: 12px } @@ -866,8 +870,17 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio box-shadow: none; } +.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection { + border: none; +} + /** Hoverable Status **/ .input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow, .input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{ display: none; +} + +/** Mandatory Field **/ +.input-field.combobox select.disabled + span + label.required:before { + display: none; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 4fda323d0..2013eee84 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1 +1 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox .select2-container.select2-container--disabled{background:0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection{border:none}.input-field.combobox select.disabled+span+label.required:before,.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css index e3bfb736e..dbdb4cbda 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.css @@ -614,6 +614,11 @@ position: relative; } +/** Filled **/ +.input-field.filled input.disabled { + background: transparent; +} + /** Outlined **/ .input-field.outlined.timepicker input:focus, .input-field.outlined.timepicker input.valid{ @@ -639,4 +644,9 @@ .input-field.timepicker input.valid { border-bottom: 1px solid #42a5f5; box-shadow: 0 1px 0 0 #42a5f5; +} + +/** Mandatory Field **/ +.input-field.timepicker input.disabled + label.required:before { + display: none; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css index be0ce3a59..5c2513e23 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css @@ -1 +1 @@ -.lolliclock-popover{border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26),0 2px 10px 0 rgba(0,0,0,.16);font-family:Roboto,'Helvetica Neue, Helvetica, Arial',sans-serif;background-color:#fff;font-size:20px;user-select:none;margin:10% auto auto;width:250px;height:380px;z-index:999;position:relative}.landscape .lolliclock-popover{width:450px;height:250px}.landscape .lolliclock-header{display:inline-block!important;vertical-align:middle!important;width:140px!important;height:100%!important;padding-top:20%!important;padding-left:10px!important;animation:none!important;-webkit-animation:none!important;-moa-animation:none!important}.landscape .popover-content{display:inline-block!important;vertical-align:top!important;width:310px!important}.landscape .lolliclock-buttons{margin-top:-40px!important}.landscape .lolliclock-am-pm{padding-left:50px!important;font-size:20px!important}.landscape .lolliclock-ampm-block{display:none!important}.clock-overlay{position:fixed!important;width:100%!important;top:0!important;left:0!important;bottom:0!important;right:0!important;height:100%!important;background:rgba(0,0,0,.3);z-index:10000}.lolliclock-popover.animate{max-height:0;animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-popover.animate-out{animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-header{background:#03a9f4;height:85px;width:250px;display:flex;color:#fff;font-size:2.3em;font-weight:400;align-items:center;justify-content:center;overflow:hidden}.lolliclock-hours,.lolliclock-minutes{width:51px;overflow:hidden;opacity:.6}.lolliclock-header.animate{height:0;animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-header.animate-out{animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time{display:flex;align-self:center}.lolliclock-hours{text-align:right;cursor:pointer;height:54px}.lolliclock-colon{opacity:.6;cursor:default}.lolliclock-minutes{cursor:pointer;height:54px}.lolliclock-am-pm{cursor:pointer;font-size:10px;top:47px;left:157px;opacity:.6;padding:3px}.lolliclock-primary-text{color:#fff;opacity:1}.lolliclock-time-old{opacity:1;height:54px}.lolliclock-time-new{opacity:0}.lolliclock-time .old-up{animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-up{animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .old-down{animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-down{animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-old.animate{animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-old.animate{animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.popover-content{padding:18px 14px;width:250px;height:203px}.lolliclock-canvas,.lolliclock-dial,.lolliclock-plate{width:168px;height:168px}.lolliclock-dial{transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s}.lolliclock-dial-out{transform:scale(1.25,1.25);-webkit-transform:scale(1.25,1.25);-moz-transform:scale(1.25,1.25);opacity:0}.lolliclock-plate{background:#f0f0f0;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;position:relative;margin:auto}.lolliclock-ampm-btn,.lolliclock-tick{border-radius:100%;font-weight:600;cursor:pointer}.lolliclock-canvas,.lolliclock-dial,.lolliclock-tick{position:absolute}.lolliclock-plate.animate{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0);animation:open-clock 150ms 150ms forwards;-webkit-animation:open-clock 150ms 150ms forwards;-moz-animation:open-clock 150ms 150ms forwards}.lolliclock-plate.animate-out{animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-dial-minutes{visibility:hidden}.lolliclock-bearing{fill:#000;stroke-width:1}.lolliclock-canvas line{stroke:#b3e5fc;stroke-width:1;stroke-linecap:round}.lolliclock-canvas-fg{stroke:none;fill:#0288d1}.lolliclock-canvas-bg{fill:rgba(3,169,244,.25)}.lolliclock-tick{-webkit-border-radius:100%;-moz-border-radius:100%;color:#666;line-height:24px;text-align:center;width:24px;height:24px;font-size:.55em}.lolliclock-tick.active,.lolliclock-tick:hover{background:#b3e5fc}.lolliclock-ampm-block{display:flex;justify-content:space-around;margin-top:20px}.lolliclock-ampm-btn{position:relative;height:35px;width:35px;-webkit-border-radius:100%;-moz-border-radius:100%;font-size:10px}.lolliclock-ampm-btn.animate{opacity:0;animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-ampm-btn.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate{opacity:0;animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-btn-background{position:absolute;height:35px;width:35px;opacity:0;transform:scale(0);-moz-transform:scale(0);-webkit-transform:scale(0)}.lolliclock-btn-text{position:absolute;width:100%;text-align:center;line-height:35px;vertical-align:middle;color:#212121}.lolliclock-active-button-background{background-color:#03a9f4;border-radius:100%;transition:transform 175ms;-webkit-transition:transform 175ms;-moz-transition:transform 175ms;transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1}.lolliclock-active-button-text{color:#fff}.lolliclock-ampm-btn:focus{outline:0}.lolliclock-clickable{cursor:pointer}.lolliclock-moving{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.lolliclock-export{display:hidden}.lolliclock-buttons{font-size:11px;display:flex;justify-content:flex-end;margin-top:50px;margin-right:8px}.lolliclock-button{font-weight:500;color:#03a9f4;cursor:pointer;padding:8px;min-width:32px;margin:0 4px;background:0 0;text-align:center;text-transform:uppercase;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}@-moz-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-webkit-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-o-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-moz-keyframes slide-header{0%{height:0}100%{height:85px}}@-webkit-keyframes slide-header{0%{height:0}100%{height:85px}}@-o-keyframes slide-header{0%{height:0}100%{height:85px}}@keyframes slide-header{0%{height:0}100%{height:85px}}@-moz-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-webkit-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-o-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-moz-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-o-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-moz-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-webkit-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-o-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-moz-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@-o-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}.timepicker input{position:relative}.input-field.outlined.timepicker input.valid,.input-field.outlined.timepicker input:focus{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.timepicker input.field-error,.input-field.outlined.timepicker input.field-error:focus{border:2px solid #f44336!important;box-shadow:none!important;margin-bottom:8px}.input-field.outlined.timepicker input.field-success,.input-field.outlined.timepicker input.field-success:focus{border:2px solid #4caf50!important;box-shadow:none!important;margin-bottom:8px}.input-field.timepicker input.valid{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5} \ No newline at end of file +.lolliclock-popover{border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26),0 2px 10px 0 rgba(0,0,0,.16);font-family:Roboto,'Helvetica Neue, Helvetica, Arial',sans-serif;background-color:#fff;font-size:20px;user-select:none;margin:10% auto auto;width:250px;height:380px;z-index:999;position:relative}.landscape .lolliclock-popover{width:450px;height:250px}.landscape .lolliclock-header{display:inline-block!important;vertical-align:middle!important;width:140px!important;height:100%!important;padding-top:20%!important;padding-left:10px!important;animation:none!important;-webkit-animation:none!important;-moa-animation:none!important}.landscape .popover-content{display:inline-block!important;vertical-align:top!important;width:310px!important}.landscape .lolliclock-buttons{margin-top:-40px!important}.landscape .lolliclock-am-pm{padding-left:50px!important;font-size:20px!important}.landscape .lolliclock-ampm-block{display:none!important}.clock-overlay{position:fixed!important;width:100%!important;top:0!important;left:0!important;bottom:0!important;right:0!important;height:100%!important;background:rgba(0,0,0,.3);z-index:10000}.lolliclock-popover.animate{max-height:0;animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-popover.animate-out{animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-header{background:#03a9f4;height:85px;width:250px;display:flex;color:#fff;font-size:2.3em;font-weight:400;align-items:center;justify-content:center;overflow:hidden}.lolliclock-hours,.lolliclock-minutes{width:51px;overflow:hidden;opacity:.6}.lolliclock-header.animate{height:0;animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-header.animate-out{animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time{display:flex;align-self:center}.lolliclock-hours{text-align:right;cursor:pointer;height:54px}.lolliclock-colon{opacity:.6;cursor:default}.lolliclock-minutes{cursor:pointer;height:54px}.lolliclock-am-pm{cursor:pointer;font-size:10px;top:47px;left:157px;opacity:.6;padding:3px}.lolliclock-primary-text{color:#fff;opacity:1}.lolliclock-time-old{opacity:1;height:54px}.lolliclock-time-new{opacity:0}.lolliclock-time .old-up{animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-up{animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .old-down{animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-down{animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-old.animate{animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-old.animate{animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.popover-content{padding:18px 14px;width:250px;height:203px}.lolliclock-canvas,.lolliclock-dial,.lolliclock-plate{width:168px;height:168px}.lolliclock-dial{transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s}.lolliclock-dial-out{transform:scale(1.25,1.25);-webkit-transform:scale(1.25,1.25);-moz-transform:scale(1.25,1.25);opacity:0}.lolliclock-plate{background:#f0f0f0;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;position:relative;margin:auto}.lolliclock-ampm-btn,.lolliclock-tick{border-radius:100%;font-weight:600;cursor:pointer}.lolliclock-canvas,.lolliclock-dial,.lolliclock-tick{position:absolute}.lolliclock-plate.animate{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0);animation:open-clock 150ms 150ms forwards;-webkit-animation:open-clock 150ms 150ms forwards;-moz-animation:open-clock 150ms 150ms forwards}.lolliclock-plate.animate-out{animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-dial-minutes{visibility:hidden}.lolliclock-bearing{fill:#000;stroke-width:1}.lolliclock-canvas line{stroke:#b3e5fc;stroke-width:1;stroke-linecap:round}.lolliclock-canvas-fg{stroke:none;fill:#0288d1}.lolliclock-canvas-bg{fill:rgba(3,169,244,.25)}.lolliclock-tick{-webkit-border-radius:100%;-moz-border-radius:100%;color:#666;line-height:24px;text-align:center;width:24px;height:24px;font-size:.55em}.lolliclock-tick.active,.lolliclock-tick:hover{background:#b3e5fc}.lolliclock-ampm-block{display:flex;justify-content:space-around;margin-top:20px}.lolliclock-ampm-btn{position:relative;height:35px;width:35px;-webkit-border-radius:100%;-moz-border-radius:100%;font-size:10px}.lolliclock-ampm-btn.animate{opacity:0;animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-ampm-btn.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate{opacity:0;animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-btn-background{position:absolute;height:35px;width:35px;opacity:0;transform:scale(0);-moz-transform:scale(0);-webkit-transform:scale(0)}.lolliclock-btn-text{position:absolute;width:100%;text-align:center;line-height:35px;vertical-align:middle;color:#212121}.lolliclock-active-button-background{background-color:#03a9f4;border-radius:100%;transition:transform 175ms;-webkit-transition:transform 175ms;-moz-transition:transform 175ms;transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1}.lolliclock-active-button-text{color:#fff}.lolliclock-ampm-btn:focus{outline:0}.lolliclock-clickable{cursor:pointer}.lolliclock-moving{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.lolliclock-export{display:hidden}.lolliclock-buttons{font-size:11px;display:flex;justify-content:flex-end;margin-top:50px;margin-right:8px}.lolliclock-button{font-weight:500;color:#03a9f4;cursor:pointer;padding:8px;min-width:32px;margin:0 4px;background:0 0;text-align:center;text-transform:uppercase;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}@-moz-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-webkit-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-o-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-moz-keyframes slide-header{0%{height:0}100%{height:85px}}@-webkit-keyframes slide-header{0%{height:0}100%{height:85px}}@-o-keyframes slide-header{0%{height:0}100%{height:85px}}@keyframes slide-header{0%{height:0}100%{height:85px}}@-moz-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-webkit-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-o-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-moz-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-o-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-moz-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-webkit-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-o-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-moz-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@-o-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}.timepicker input{position:relative}.input-field.filled input.disabled{background:0 0}.input-field.outlined.timepicker input.valid,.input-field.outlined.timepicker input:focus{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.timepicker input.field-error,.input-field.outlined.timepicker input.field-error:focus{border:2px solid #f44336!important;box-shadow:none!important;margin-bottom:8px}.input-field.outlined.timepicker input.field-success,.input-field.outlined.timepicker input.field-success:focus{border:2px solid #4caf50!important;box-shadow:none!important;margin-bottom:8px}.input-field.timepicker input.valid{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.timepicker input.disabled+label.required:before{display:none} \ No newline at end of file diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialTimePickerTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialTimePickerTest.java index b63909cfb..5001761c9 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialTimePickerTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialTimePickerTest.java @@ -173,8 +173,8 @@ public void testChildren() { assertTrue(timePicker.getWidget(0) instanceof MaterialPanel); MaterialPanel panel = (MaterialPanel) timePicker.getWidget(0); assertEquals(3, panel.getWidgetCount()); - assertTrue(panel.getWidget(0) instanceof Label); - assertTrue(panel.getWidget(1) instanceof MaterialInput); + assertTrue(panel.getWidget(0) instanceof MaterialInput); + assertTrue(panel.getWidget(1) instanceof Label); assertTrue(panel.getWidget(2) instanceof MaterialLabel); } From 2f83abf248ac91c939a06e98d1fa26331b1c7fd9 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 14:48:04 +0800 Subject: [PATCH 039/247] Fixed Travis Build --- .travis.yml | 4 ++-- .utility/deploy.sh | 2 +- .../client/placeholder/PlaceholderItem.java | 19 +++++++++++++++++++ .../client/placeholder/PlaceholderLoader.java | 19 +++++++++++++++++++ .../placeholder/PlaceholderRenderer.java | 19 +++++++++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2f4ac0913..87e20877d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,12 +7,12 @@ cache: - $HOME/.m2 before_install: # install the gwt-material-jquery library before we build the demo -- git clone -b release_2.1.1 https://github.com/GwtMaterialDesign/gwt-material-jquery.git +- git clone -b release_2.2 https://github.com/GwtMaterialDesign/gwt-material-jquery.git - cd gwt-material-jquery - mvn install -DskipTests=true -DdryRun=true - cd .. # install the gwt-material library before we build the demo -- git clone -b release_2.1.1 https://github.com/GwtMaterialDesign/gwt-material.git +- git clone -b release_2.2 https://github.com/GwtMaterialDesign/gwt-material.git - cd gwt-material - mvn install -DskipTests=true -DdryRun=true - cd .. diff --git a/.utility/deploy.sh b/.utility/deploy.sh index f56a6e2ef..31d4a12b0 100644 --- a/.utility/deploy.sh +++ b/.utility/deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash set -ev -if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.1.1" ]; then +if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.2" ]; then echo "ossrh\${env.OSSRH_USER}\${env.OSSRH_PASS}" > ~/settings.xml mvn deploy --settings ~/settings.xml fi \ No newline at end of file diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java index 08eef8535..40e678519 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.placeholder; import com.google.gwt.dom.client.Document; diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java index aeea38c79..6715bebb4 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderLoader.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.placeholder; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java index da3e904e9..7748ab8a1 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderRenderer.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.placeholder; import com.google.gwt.user.client.ui.Widget; From 1d5fb25f0b7d806e7778df4b4b7504a10d574d58 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 14:58:06 +0800 Subject: [PATCH 040/247] MaterialStepper - equalStepWidth property --- .../addins/client/stepper/MaterialStep.java | 6 ++--- .../client/stepper/MaterialStepper.java | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index 336a7c7c5..17b930d69 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -7,9 +7,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. @@ -356,4 +356,4 @@ public void onSelection(SelectionEvent event) { } }, SelectionEvent.getType()); } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 311b330a8..1678ee9c6 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -48,6 +48,7 @@ import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; +import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; import gwt.material.design.client.ui.html.Div; @@ -98,6 +99,7 @@ public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatu private int currentStepIndex = 0; private int totalSteps; private boolean stepSkippingAllowed = true; + private boolean equalStepWidth = false; private boolean detectOrientation = true; private Div divFeedback = new Div(); private Span feedbackSpan = new Span(); @@ -124,6 +126,20 @@ protected void onLoad() { } setDetectOrientation(detectOrientation); + updateStepWidth(); + } + + public void updateStepWidth() { + if (equalStepWidth) { + for (Widget child : getChildren()) { + if (child instanceof MaterialStep) { + double stepWidth = 100 / getChildren().size(); + child.setWidth(stepWidth + "%"); + } + } + } else { + MaterialToast.fireToast("asd"); + } } public void setDetectOrientation(boolean detectOrientation) { @@ -506,6 +522,14 @@ public boolean isStepSkippingAllowed() { return stepSkippingAllowed; } + public boolean isEqualStepWidth() { + return equalStepWidth; + } + + public void setEqualStepWidth(boolean equalStepWidth) { + this.equalStepWidth = equalStepWidth; + } + public Transition getNextTransition() { return nextTransition; } From 1b1343a37c994b6b634e80461f6b69b035075c59 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 16:30:41 +0800 Subject: [PATCH 041/247] Follow up fixes for combobox#getIndexByString --- .../design/addins/client/combobox/MaterialComboBox.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 3ba703065..a7d0e712e 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -565,9 +565,8 @@ public int getIndexByString(String key) { int index = -1; for (T value : values) { - ++index; if (keyFactory.generateKey(value).equals(key)) { - return index; + return values.indexOf(value); } } return index; From a0d436ff8325060faca7bba5e3a4ae433b1f962e Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 19:03:11 +0800 Subject: [PATCH 042/247] Standardization for MaterialStepper - Transition support --- .../client/stepper/MaterialStepper.java | 103 +++++++++--------- .../stepper/mixin/HasStepperTransition.java | 46 ++++++++ .../stepper/mixin/StepperTransitionMixin.java | 100 +++++++++++++++++ 3 files changed, 200 insertions(+), 49 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java create mode 100644 src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 1678ee9c6..ca12c45a0 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -21,7 +21,6 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; -import com.google.gwt.dom.client.Style; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.HandlerRegistration; @@ -38,6 +37,8 @@ import gwt.material.design.addins.client.stepper.events.NextEvent; import gwt.material.design.addins.client.stepper.events.PreviousEvent; import gwt.material.design.addins.client.stepper.events.StartEvent; +import gwt.material.design.addins.client.stepper.mixin.HasStepperTransition; +import gwt.material.design.addins.client.stepper.mixin.StepperTransitionMixin; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.HasAxis; import gwt.material.design.client.base.HasStatusText; @@ -86,7 +87,7 @@ */ // @formatter:on public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatusText, SelectionHandler, - HasSelectionChangedHandlers, HasStepsHandler { + HasSelectionChangedHandlers, HasStepsHandler, HasStepperTransition { static { if (MaterialAddins.isDebug()) { @@ -104,10 +105,9 @@ public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatu private Div divFeedback = new Div(); private Span feedbackSpan = new Span(); private HandlerRegistration orientationHandler; - private Transition nextTransition; - private Transition previousTransition; private CssNameMixin axisMixin; + private StepperTransitionMixin stepperTransitionMixin; public MaterialStepper() { super(Document.get().createDivElement(), AddinsCssName.STEPPER); @@ -199,14 +199,6 @@ public void nextStep() { Widget w = getWidget(currentStepIndex); if (w instanceof MaterialStep) { MaterialStep step = (MaterialStep) w; - - //TODO: Optimize as an API - step.getDivBody().setOverflow(Style.Overflow.HIDDEN); - new MaterialAnimation().transition(Transition.SLIDEOUTLEFT).animate(step.getConBody(), () -> { - step.setActive(false); - step.getDivBody().setOverflow(Style.Overflow.AUTO); - }); - step.setSuccessText(step.getDescription()); // next step @@ -219,11 +211,7 @@ public void nextStep() { } MaterialStep nextStep = (MaterialStep) w; if (nextStep.isEnabled() && nextStep.isVisible()) { - - //TODO: Optimize as an API - nextStep.setActive(true); - new MaterialAnimation().transition(Transition.SLIDEINRIGHT).animate(nextStep.getConBody()); - + animateNext(); setCurrentStepIndex(i); NextEvent.fire(MaterialStepper.this); break; @@ -243,13 +231,6 @@ public void prevStep() { if (w instanceof MaterialStep) { MaterialStep step = (MaterialStep) w; - //TODO: Optimize as an API - step.getDivBody().setOverflow(Style.Overflow.HIDDEN); - new MaterialAnimation().transition(Transition.SLIDEOUTRIGHT).animate(step.getConBody(), () -> { - step.setActive(false); - step.getDivBody().setOverflow(Style.Overflow.AUTO); - }); - // prev step int prevStepIndex = getWidgetIndex(step) - 1; if (prevStepIndex >= 0) { @@ -260,14 +241,7 @@ public void prevStep() { } MaterialStep prevStep = (MaterialStep) w; if (prevStep.isEnabled() && prevStep.isVisible()) { - - //TODO: Optimize as an API - prevStep.setActive(true); - prevStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); - new MaterialAnimation().transition(Transition.SLIDEINLEFT).animate(prevStep.getConBody(), () -> { - prevStep.getDivBody().setOverflow(Style.Overflow.AUTO); - }); - + animatePrevious(); setCurrentStepIndex(i); PreviousEvent.fire(MaterialStepper.this); break; @@ -359,7 +333,7 @@ public int getCurrentStepIndex() { } public MaterialStep getStep(int step) { - return getStep(step + 1); + return getStepByIndex(step - 1); } public MaterialStep getStepByIndex(int stepIndex) { @@ -530,22 +504,6 @@ public void setEqualStepWidth(boolean equalStepWidth) { this.equalStepWidth = equalStepWidth; } - public Transition getNextTransition() { - return nextTransition; - } - - public void setNextTransition(Transition nextTransition) { - this.nextTransition = nextTransition; - } - - public Transition getPreviousTransition() { - return previousTransition; - } - - public void setPreviousTransition(Transition previousTransition) { - this.previousTransition = previousTransition; - } - public Span getFeedbackSpan() { return feedbackSpan; } @@ -562,6 +520,46 @@ public void onSelection(SelectionEvent event) { } } + @Override + public void setNextInTransition(Transition transition) { + getStepperTransitionMixin().setNextInTransition(transition); + } + + @Override + public void setNextOutTransition(Transition transition) { + getStepperTransitionMixin().setNextOutTransition(transition); + } + + @Override + public void setPreviousInTransition(Transition transition) { + getStepperTransitionMixin().setPreviousInTransition(transition); + } + + @Override + public void setPreviousOutTransition(Transition transition) { + getStepperTransitionMixin().setPreviousOutTransition(transition); + } + + @Override + public void animateNext() { + getStepperTransitionMixin().animateNext(); + } + + @Override + public void animatePrevious() { + getStepperTransitionMixin().animatePrevious(); + } + + @Override + public void setEnableTransition(boolean enableTransition) { + getStepperTransitionMixin().setEnableTransition(enableTransition); + } + + @Override + public boolean isEnableTransition() { + return getStepperTransitionMixin().isEnableTransition(); + } + @Override public HandlerRegistration addSelectionChangeHandler(final Handler handler) { return addHandler(handler, SelectionChangeEvent.getType()); @@ -593,4 +591,11 @@ protected CssNameMixin getAxisMixin() { } return axisMixin; } + + protected StepperTransitionMixin getStepperTransitionMixin() { + if (stepperTransitionMixin == null) { + stepperTransitionMixin = new StepperTransitionMixin<>(this); + } + return stepperTransitionMixin; + } } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java new file mode 100644 index 000000000..4372aebe2 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java @@ -0,0 +1,46 @@ +package gwt.material.design.addins.client.stepper.mixin; + +import gwt.material.design.client.ui.animate.Transition; + +public interface HasStepperTransition { + + /** + * Will set the next incoming transition of {@link gwt.material.design.addins.client.stepper.MaterialStepper} + */ + void setNextInTransition(Transition transition); + + /** + * Will set the next out coming transition of {@link gwt.material.design.addins.client.stepper.MaterialStepper} + */ + void setNextOutTransition(Transition transition); + + /** + * Will set the previous incoming transition of {@link gwt.material.design.addins.client.stepper.MaterialStepper} + */ + void setPreviousInTransition(Transition transition); + + /** + * Will set the previous out coming transition of {@link gwt.material.design.addins.client.stepper.MaterialStepper} + */ + void setPreviousOutTransition(Transition transition); + + /** + * Performs animation when {@link gwt.material.design.addins.client.stepper.MaterialStepper} proceeds to next step + */ + void animateNext(); + + /** + * Performs animation when {@link gwt.material.design.addins.client.stepper.MaterialStepper} proceeds to previous step + */ + void animatePrevious(); + + /** + * Will enable the {@link gwt.material.design.addins.client.stepper.MaterialStepper} transition. True by Default + */ + void setEnableTransition(boolean enableTransition); + + /** + * Check if transition is enabled by the {@link gwt.material.design.addins.client.stepper.MaterialStepper} + */ + boolean isEnableTransition(); +} diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java new file mode 100644 index 000000000..24bcab8e0 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java @@ -0,0 +1,100 @@ +package gwt.material.design.addins.client.stepper.mixin; + +import com.google.gwt.dom.client.Style; +import gwt.material.design.addins.client.stepper.MaterialStep; +import gwt.material.design.addins.client.stepper.MaterialStepper; +import gwt.material.design.client.ui.animate.MaterialAnimation; +import gwt.material.design.client.ui.animate.Transition; + +/** + * A mixin that provides the ability to set the {@link Transition} for {@link MaterialStepper} + */ +public class StepperTransitionMixin implements HasStepperTransition { + + private T stepper; + private Transition nextInTransition = Transition.SLIDEINRIGHT; + private Transition nextOutTransition = Transition.SLIDEOUTLEFT; + private Transition previousInTransition = Transition.SLIDEINLEFT; + private Transition previousOutTransition = Transition.SLIDEOUTRIGHT; + private boolean enableTransition = true; + + public StepperTransitionMixin(T stepper) { + this.stepper = stepper; + } + + @Override + public void setNextInTransition(Transition nextInTransition) { + this.nextInTransition = nextInTransition; + } + + @Override + public void setNextOutTransition(Transition nextOutTransition) { + this.nextOutTransition = nextOutTransition; + } + + @Override + public void setPreviousInTransition(Transition previousInTransition) { + this.previousInTransition = previousInTransition; + } + + @Override + public void setPreviousOutTransition(Transition previousOutTransition) { + this.previousOutTransition = previousOutTransition; + } + + @Override + public void animateNext() { + MaterialStep currentStep = stepper.getCurrentStep(); + MaterialStep nextStep = stepper.getStep(currentStep.getStep() + 1); + if (currentStep != null && nextStep != null) { + + if (enableTransition) { + currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); + new MaterialAnimation().transition(nextOutTransition).animate(currentStep.getConBody(), () -> { + currentStep.setActive(false); + currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); + }); + + nextStep.setActive(true); + new MaterialAnimation().transition(nextInTransition).animate(nextStep.getConBody()); + } else { + currentStep.setActive(false); + nextStep.setActive(true); + } + } + } + + @Override + public void animatePrevious() { + MaterialStep currentStep = stepper.getCurrentStep(); + MaterialStep previousStep = stepper.getStep(currentStep.getStep() - 1); + if (currentStep != null && previousStep != null) { + if (enableTransition) { + currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); + new MaterialAnimation().transition(previousOutTransition).animate(currentStep.getConBody(), () -> { + currentStep.setActive(false); + currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); + }); + + previousStep.setActive(true); + previousStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); + new MaterialAnimation().transition(previousInTransition).animate(previousStep.getConBody(), () -> { + previousStep.getDivBody().setOverflow(Style.Overflow.AUTO); + }); + } else { + currentStep.setActive(false); + previousStep.setActive(true); + } + } + } + + @Override + public void setEnableTransition(boolean enableTransition) { + this.enableTransition = enableTransition; + } + + @Override + public boolean isEnableTransition() { + return enableTransition; + } +} From c12390cd2cf7d10c42999290dde881757ed79959 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 20:48:00 +0800 Subject: [PATCH 043/247] Stepper - cleanups --- .../addins/client/stepper/MaterialStepper.java | 15 ++++++++++----- .../stepper/mixin/StepperTransitionMixin.java | 4 ++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index ca12c45a0..1ad84fe06 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -130,16 +130,17 @@ protected void onLoad() { } public void updateStepWidth() { - if (equalStepWidth) { - for (Widget child : getChildren()) { - if (child instanceof MaterialStep) { + for (Widget child : getChildren()) { + if (child instanceof MaterialStep) { + if (equalStepWidth) { double stepWidth = 100 / getChildren().size(); child.setWidth(stepWidth + "%"); + } else { + child.getElement().getStyle().clearWidth(); } } - } else { - MaterialToast.fireToast("asd"); } + } public void setDetectOrientation(boolean detectOrientation) { @@ -502,6 +503,10 @@ public boolean isEqualStepWidth() { public void setEqualStepWidth(boolean equalStepWidth) { this.equalStepWidth = equalStepWidth; + + if (isAttached()) { + updateStepWidth(); + } } public Span getFeedbackSpan() { diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java index 24bcab8e0..e58709b6b 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java @@ -49,10 +49,12 @@ public void animateNext() { if (currentStep != null && nextStep != null) { if (enableTransition) { + stepper.setOverflow(Style.Overflow.HIDDEN); currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(nextOutTransition).animate(currentStep.getConBody(), () -> { currentStep.setActive(false); currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); + stepper.setOverflow(Style.Overflow.AUTO); }); nextStep.setActive(true); @@ -70,10 +72,12 @@ public void animatePrevious() { MaterialStep previousStep = stepper.getStep(currentStep.getStep() - 1); if (currentStep != null && previousStep != null) { if (enableTransition) { + stepper.setOverflow(Style.Overflow.HIDDEN); currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(previousOutTransition).animate(currentStep.getConBody(), () -> { currentStep.setActive(false); currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); + currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); }); previousStep.setActive(true); From 82b9e1368dfcb67b56105f3ef1cccd9303b6b82a Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 21:11:08 +0800 Subject: [PATCH 044/247] Fixed stepper width + support for truncation --- .../client/base/constants/AddinsCssName.java | 1 + .../addins/client/stepper/MaterialStep.java | 3 +- .../stepper/mixin/StepperTransitionMixin.java | 6 ++-- .../stepper/resources/css/stepper.min.css | 34 +++++++++++++------ 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java index f08464239..55f9162b6 100644 --- a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java +++ b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java @@ -75,6 +75,7 @@ public interface AddinsCssName { String SUCCESS = "success"; String ERROR = "error"; String STEPPER = "stepper"; + String CON_CIRCLE = "con-circle"; String FEEDBACK = "feedback"; String SUBHEADER = "subheader"; String CONTAINER1 = "container1"; diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index 17b930d69..60cc91e25 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -91,6 +91,7 @@ public class MaterialStep extends MaterialWidget implements HasActive, HasTitle, public MaterialStep() { super(Document.get().createDivElement(), AddinsCssName.STEP); + conCircle.addStyleName(AddinsCssName.CON_CIRCLE); super.add(conCircle); conCircle.add(divCircle); conCircle.add(divLine); @@ -313,8 +314,8 @@ public void setAxis(Axis axis) { switch (axis) { case HORIZONTAL: conCircle.add(divTitle); - conCircle.add(divLine); conCircle.add(divDescription); + super.insert(divLine, 1); break; case VERTICAL: conBody.insert(divTitle, 0); diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java index e58709b6b..da21b7539 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java @@ -3,6 +3,8 @@ import com.google.gwt.dom.client.Style; import gwt.material.design.addins.client.stepper.MaterialStep; import gwt.material.design.addins.client.stepper.MaterialStepper; +import gwt.material.design.client.constants.Axis; +import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; @@ -48,7 +50,7 @@ public void animateNext() { MaterialStep nextStep = stepper.getStep(currentStep.getStep() + 1); if (currentStep != null && nextStep != null) { - if (enableTransition) { + if (enableTransition && stepper.getAxis() == Axis.HORIZONTAL) { stepper.setOverflow(Style.Overflow.HIDDEN); currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(nextOutTransition).animate(currentStep.getConBody(), () -> { @@ -71,7 +73,7 @@ public void animatePrevious() { MaterialStep currentStep = stepper.getCurrentStep(); MaterialStep previousStep = stepper.getStep(currentStep.getStep() - 1); if (currentStep != null && previousStep != null) { - if (enableTransition) { + if (enableTransition && stepper.getAxis() == Axis.HORIZONTAL) { stepper.setOverflow(Style.Overflow.HIDDEN); currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(previousOutTransition).animate(currentStep.getConBody(), () -> { diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index d743214f5..d433af221 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -5,8 +5,8 @@ cursor: pointer } -.stepper .step:hover { - background: #F6F6F6 +.stepper .step:hover, .stepper .step:hover .con-circle { + background: #F6F6F6 !important; } .stepper .step > div:first-child { @@ -77,18 +77,33 @@ position: initial } +.stepper.horizontal .step .con-circle { + display: inherit; + height: 40px; + max-width: 80%; + background: white; + z-index: 2; + position: relative; + padding-right: 20px; + box-sizing: border-box; + min-width: 200px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + .stepper.horizontal .step .line, .stepper.horizontal .step .title, .stepper.horizontal .step > div:first-child .circle { display: inline-block } .stepper.horizontal .step .line { border-left: 0; + height: 1px; position: inherit; border-top: 1px solid #dcdcdc; - width: 100px; - margin-bottom: 5px; - margin-left: 8px; - margin-right: -36px + width: 100%; + float: right; + margin-top: -24px; } .stepper.horizontal .step .title { @@ -119,10 +134,6 @@ font-weight: 400 } -.stepper.horizontal .step.inactive > :nth-child(2) { - visibility: hidden -} - .stepper .step.inactive .body { opacity: 0; transition: .6s all; @@ -181,6 +192,9 @@ } /** Vertical steppers **/ +.stepper.vertical .step { + width: 100% !important; +} .stepper.vertical .step.active .body { padding-bottom: 0px; padding-right: 20px; From 103a1721d5c8b911e4a3d47240a410ba0bfbf1c3 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 21:28:25 +0800 Subject: [PATCH 045/247] Revert "Fixed stepper width + support for truncation" This reverts commit 82b9e1368dfcb67b56105f3ef1cccd9303b6b82a. --- .../client/base/constants/AddinsCssName.java | 1 - .../addins/client/stepper/MaterialStep.java | 3 +- .../stepper/mixin/StepperTransitionMixin.java | 10 ++---- .../stepper/resources/css/stepper.min.css | 34 ++++++------------- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java index 55f9162b6..f08464239 100644 --- a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java +++ b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java @@ -75,7 +75,6 @@ public interface AddinsCssName { String SUCCESS = "success"; String ERROR = "error"; String STEPPER = "stepper"; - String CON_CIRCLE = "con-circle"; String FEEDBACK = "feedback"; String SUBHEADER = "subheader"; String CONTAINER1 = "container1"; diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index 60cc91e25..17b930d69 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -91,7 +91,6 @@ public class MaterialStep extends MaterialWidget implements HasActive, HasTitle, public MaterialStep() { super(Document.get().createDivElement(), AddinsCssName.STEP); - conCircle.addStyleName(AddinsCssName.CON_CIRCLE); super.add(conCircle); conCircle.add(divCircle); conCircle.add(divLine); @@ -314,8 +313,8 @@ public void setAxis(Axis axis) { switch (axis) { case HORIZONTAL: conCircle.add(divTitle); + conCircle.add(divLine); conCircle.add(divDescription); - super.insert(divLine, 1); break; case VERTICAL: conBody.insert(divTitle, 0); diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java index da21b7539..24bcab8e0 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java @@ -3,8 +3,6 @@ import com.google.gwt.dom.client.Style; import gwt.material.design.addins.client.stepper.MaterialStep; import gwt.material.design.addins.client.stepper.MaterialStepper; -import gwt.material.design.client.constants.Axis; -import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; @@ -50,13 +48,11 @@ public void animateNext() { MaterialStep nextStep = stepper.getStep(currentStep.getStep() + 1); if (currentStep != null && nextStep != null) { - if (enableTransition && stepper.getAxis() == Axis.HORIZONTAL) { - stepper.setOverflow(Style.Overflow.HIDDEN); + if (enableTransition) { currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(nextOutTransition).animate(currentStep.getConBody(), () -> { currentStep.setActive(false); currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); - stepper.setOverflow(Style.Overflow.AUTO); }); nextStep.setActive(true); @@ -73,13 +69,11 @@ public void animatePrevious() { MaterialStep currentStep = stepper.getCurrentStep(); MaterialStep previousStep = stepper.getStep(currentStep.getStep() - 1); if (currentStep != null && previousStep != null) { - if (enableTransition && stepper.getAxis() == Axis.HORIZONTAL) { - stepper.setOverflow(Style.Overflow.HIDDEN); + if (enableTransition) { currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(previousOutTransition).animate(currentStep.getConBody(), () -> { currentStep.setActive(false); currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); - currentStep.getDivBody().setOverflow(Style.Overflow.AUTO); }); previousStep.setActive(true); diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index d433af221..d743214f5 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -5,8 +5,8 @@ cursor: pointer } -.stepper .step:hover, .stepper .step:hover .con-circle { - background: #F6F6F6 !important; +.stepper .step:hover { + background: #F6F6F6 } .stepper .step > div:first-child { @@ -77,33 +77,18 @@ position: initial } -.stepper.horizontal .step .con-circle { - display: inherit; - height: 40px; - max-width: 80%; - background: white; - z-index: 2; - position: relative; - padding-right: 20px; - box-sizing: border-box; - min-width: 200px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - .stepper.horizontal .step .line, .stepper.horizontal .step .title, .stepper.horizontal .step > div:first-child .circle { display: inline-block } .stepper.horizontal .step .line { border-left: 0; - height: 1px; position: inherit; border-top: 1px solid #dcdcdc; - width: 100%; - float: right; - margin-top: -24px; + width: 100px; + margin-bottom: 5px; + margin-left: 8px; + margin-right: -36px } .stepper.horizontal .step .title { @@ -134,6 +119,10 @@ font-weight: 400 } +.stepper.horizontal .step.inactive > :nth-child(2) { + visibility: hidden +} + .stepper .step.inactive .body { opacity: 0; transition: .6s all; @@ -192,9 +181,6 @@ } /** Vertical steppers **/ -.stepper.vertical .step { - width: 100% !important; -} .stepper.vertical .step.active .body { padding-bottom: 0px; padding-right: 20px; From 40c98ce76a76e3fce6d8195e63ef5fd38c0113df Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 3 Oct 2018 21:29:14 +0800 Subject: [PATCH 046/247] Minify css --- .../client/stepper/resources/css/stepper.css | 188 +++++++++++++++++- .../stepper/resources/css/stepper.min.css | 188 +----------------- 2 files changed, 188 insertions(+), 188 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css index e2c88ce4a..d743214f5 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css @@ -1 +1,187 @@ -.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper .step:hover{background:#F6F6F6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .line{border-left:0;position:inherit;border-top:1px solid #dcdcdc;width:100px;margin-bottom:5px;margin-left:8px;margin-right:-36px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#C9C9C9;font-weight:400}.stepper.horizontal .step.inactive>:nth-child(2){visibility:hidden}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file +.stepper .step { + position: relative; + min-height: 32px; + padding: 12px; + cursor: pointer +} + +.stepper .step:hover { + background: #F6F6F6 +} + +.stepper .step > div:first-child { + position: static; + height: 0 +} + +.stepper .step > div:last-child { + margin-left: 32px; + padding-left: 16px; + min-height: 24px +} + +.stepper .step > div:first-child .circle { + background: #4285f4; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 16px; + position: relative; + color: #fff; + text-align: center +} + +.stepper .line { + position: absolute; + border-left: 1px solid #dcdcdc; + left: 28px; + bottom: 0; + top: 56px; + z-index: 1 +} + +.stepper .step:last-child .line { + display: none !important +} + +.stepper .title { + line-height: 32px; + font-weight: 500; + margin-left: 0 +} + +.stepper .body { + padding-bottom: 28px; + padding-top: 8px; + opacity: 1; + padding: 20px; +} + +.stepper .description { + line-height: 1.2; + font-size: 1em; + padding-bottom: 24px; + color: #989898 +} + +.stepper.horizontal { + line-height: 0; + position: relative; + min-height: 600px; +} + +.stepper.horizontal .step { + display: inline-block; + height: 72px; + padding-top: 20px; + position: initial +} + +.stepper.horizontal .step .line, .stepper.horizontal .step .title, .stepper.horizontal .step > div:first-child .circle { + display: inline-block +} + +.stepper.horizontal .step .line { + border-left: 0; + position: inherit; + border-top: 1px solid #dcdcdc; + width: 100px; + margin-bottom: 5px; + margin-left: 8px; + margin-right: -36px +} + +.stepper.horizontal .step .title { + margin-left: 8px +} + +.stepper.horizontal .step .description { + margin-left: 40px; + font-size: .8em; + margin-top: -12px +} + +.stepper.horizontal .step .body { + line-height: initial +} + +.stepper.horizontal .step > div:last-child { + position: absolute; + width: 100%; + top: 93px; + padding-left: 0; + margin: auto; + left: 0 +} + +.stepper .step.inactive .title { + color: #C9C9C9; + font-weight: 400 +} + +.stepper.horizontal .step.inactive > :nth-child(2) { + visibility: hidden +} + +.stepper .step.inactive .body { + opacity: 0; + transition: .6s all; + -webkit-transition: .6s all; + max-height: 0; + z-index: -1; + position: relative; + display: none; +} + +.stepper .step.active .body { + opacity: 1; + transition-delay: .3s; + -webkit-transition-delay: .3s; + max-height: 1400px; + padding-bottom: 28px; + padding-top: 8px; + z-index: 1 !important; + display: block !important; +} + +.stepper .step.inactive > div:first-child .circle { + background-color: #9e9e9e !important; +} + +.stepper .step > div:first-child i { + font-size: 36px; + vertical-align: middle +} + +.stepper .step.success .description, .stepper .step.success .title, .stepper .step.success > div:first-child i { + color: #2196f3 +} + +.stepper .step.error .description, .stepper .step.error .title, .stepper .step.error > div:first-child i { + color: #f44336 +} + +.stepper .step.error > div:first-child .description, .stepper .step.success > div:first-child .description { + margin-left: 44px +} + +.stepper .step.error .title, .stepper .step.success .title { + font-weight: 600 +} + +.feedback { + position: absolute; + left: 0; + font-size: 1.1em; + top: 0; + background: #fff; + width: 100%; + height: 100%; + padding: 36px +} + +/** Vertical steppers **/ +.stepper.vertical .step.active .body { + padding-bottom: 0px; + padding-right: 20px; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index d743214f5..e2c88ce4a 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -1,187 +1 @@ -.stepper .step { - position: relative; - min-height: 32px; - padding: 12px; - cursor: pointer -} - -.stepper .step:hover { - background: #F6F6F6 -} - -.stepper .step > div:first-child { - position: static; - height: 0 -} - -.stepper .step > div:last-child { - margin-left: 32px; - padding-left: 16px; - min-height: 24px -} - -.stepper .step > div:first-child .circle { - background: #4285f4; - width: 32px; - height: 32px; - line-height: 32px; - border-radius: 16px; - position: relative; - color: #fff; - text-align: center -} - -.stepper .line { - position: absolute; - border-left: 1px solid #dcdcdc; - left: 28px; - bottom: 0; - top: 56px; - z-index: 1 -} - -.stepper .step:last-child .line { - display: none !important -} - -.stepper .title { - line-height: 32px; - font-weight: 500; - margin-left: 0 -} - -.stepper .body { - padding-bottom: 28px; - padding-top: 8px; - opacity: 1; - padding: 20px; -} - -.stepper .description { - line-height: 1.2; - font-size: 1em; - padding-bottom: 24px; - color: #989898 -} - -.stepper.horizontal { - line-height: 0; - position: relative; - min-height: 600px; -} - -.stepper.horizontal .step { - display: inline-block; - height: 72px; - padding-top: 20px; - position: initial -} - -.stepper.horizontal .step .line, .stepper.horizontal .step .title, .stepper.horizontal .step > div:first-child .circle { - display: inline-block -} - -.stepper.horizontal .step .line { - border-left: 0; - position: inherit; - border-top: 1px solid #dcdcdc; - width: 100px; - margin-bottom: 5px; - margin-left: 8px; - margin-right: -36px -} - -.stepper.horizontal .step .title { - margin-left: 8px -} - -.stepper.horizontal .step .description { - margin-left: 40px; - font-size: .8em; - margin-top: -12px -} - -.stepper.horizontal .step .body { - line-height: initial -} - -.stepper.horizontal .step > div:last-child { - position: absolute; - width: 100%; - top: 93px; - padding-left: 0; - margin: auto; - left: 0 -} - -.stepper .step.inactive .title { - color: #C9C9C9; - font-weight: 400 -} - -.stepper.horizontal .step.inactive > :nth-child(2) { - visibility: hidden -} - -.stepper .step.inactive .body { - opacity: 0; - transition: .6s all; - -webkit-transition: .6s all; - max-height: 0; - z-index: -1; - position: relative; - display: none; -} - -.stepper .step.active .body { - opacity: 1; - transition-delay: .3s; - -webkit-transition-delay: .3s; - max-height: 1400px; - padding-bottom: 28px; - padding-top: 8px; - z-index: 1 !important; - display: block !important; -} - -.stepper .step.inactive > div:first-child .circle { - background-color: #9e9e9e !important; -} - -.stepper .step > div:first-child i { - font-size: 36px; - vertical-align: middle -} - -.stepper .step.success .description, .stepper .step.success .title, .stepper .step.success > div:first-child i { - color: #2196f3 -} - -.stepper .step.error .description, .stepper .step.error .title, .stepper .step.error > div:first-child i { - color: #f44336 -} - -.stepper .step.error > div:first-child .description, .stepper .step.success > div:first-child .description { - margin-left: 44px -} - -.stepper .step.error .title, .stepper .step.success .title { - font-weight: 600 -} - -.feedback { - position: absolute; - left: 0; - font-size: 1.1em; - top: 0; - background: #fff; - width: 100%; - height: 100%; - padding: 36px -} - -/** Vertical steppers **/ -.stepper.vertical .step.active .body { - padding-bottom: 0px; - padding-right: 20px; -} \ No newline at end of file +.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper .step:hover{background:#F6F6F6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .line{border-left:0;position:inherit;border-top:1px solid #dcdcdc;width:100px;margin-bottom:5px;margin-left:8px;margin-right:-36px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#C9C9C9;font-weight:400}.stepper.horizontal .step.inactive>:nth-child(2){visibility:hidden}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file From 5f8c3b9871d5945322a5dd55003fe6508238fe37 Mon Sep 17 00:00:00 2001 From: BenDol Date: Fri, 5 Oct 2018 02:48:46 +1300 Subject: [PATCH 047/247] Add unselect to MaterialComboBox and reset when setValue processes a null value. --- .../client/combobox/MaterialComboBox.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index a7d0e712e..7c736700e 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -43,10 +43,10 @@ import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.FieldType; import gwt.material.design.client.ui.MaterialLabel; -import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.client.ui.html.Label; import gwt.material.design.client.ui.html.OptGroup; import gwt.material.design.client.ui.html.Option; +import gwt.material.design.jquery.client.api.Event; import gwt.material.design.jquery.client.api.Functions; import gwt.material.design.jquery.client.api.JQueryElement; @@ -201,7 +201,7 @@ public void reload() { public void reset() { super.reset(); displayArrowForAllowClearOption(false); - setSelectedIndex(0); + unselect(); } @Override @@ -521,7 +521,13 @@ public void setSingleValue(T value) { @Override public void setValue(List values, boolean fireEvents) { - if (!isMultiple()) { + if (values == null) { + reset(); + + if (fireEvents) { + ValueChangeEvent.fire(this, null); + } + } else if (!isMultiple()) { if (!values.isEmpty()) { setSingleValue(values.get(0), fireEvents); } @@ -637,6 +643,11 @@ public int getSelectedIndex() { return -1; } + public void unselect() { + $(listbox.getElement()).val("").change(); + $(listbox.getElement()).trigger(new Event(ComboBoxEvents.UNSELECT)); + } + /** * Get all the values sets on combobox */ From 3c1f898e8e6211046f2bace421a9d7081c231f44 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Sun, 7 Oct 2018 05:40:25 +0800 Subject: [PATCH 048/247] Missing copyright headers --- .../stepper/mixin/HasStepperTransition.java | 19 +++++++++++++++++++ .../stepper/mixin/StepperTransitionMixin.java | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java index 4372aebe2..a1412e076 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/HasStepperTransition.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.stepper.mixin; import gwt.material.design.client.ui.animate.Transition; diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java index 24bcab8e0..f045329f9 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.stepper.mixin; import com.google.gwt.dom.client.Style; From 39ea6aa8f4e5984e8accff808e7ee07cd799a496 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 10 Oct 2018 11:59:06 +0800 Subject: [PATCH 049/247] Standardized Stepper. --- .../client/base/constants/AddinsCssName.java | 2 + .../addins/client/stepper/MaterialStep.java | 28 ++++----- .../client/stepper/MaterialStepper.java | 28 +++++---- .../stepper/mixin/StepperTransitionMixin.java | 5 +- .../client/stepper/resources/css/stepper.css | 63 ++++++++++++------- .../stepper/resources/css/stepper.min.css | 2 +- .../addins/client/ui/MaterialStepperTest.java | 4 +- 7 files changed, 81 insertions(+), 51 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java index f08464239..f7f570d64 100644 --- a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java +++ b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java @@ -75,6 +75,7 @@ public interface AddinsCssName { String SUCCESS = "success"; String ERROR = "error"; String STEPPER = "stepper"; + String STEP_HEADER = "step-header"; String FEEDBACK = "feedback"; String SUBHEADER = "subheader"; String CONTAINER1 = "container1"; @@ -122,4 +123,5 @@ public interface AddinsCssName { String WIDE = "wide"; String BRIDGE_PATH = "bridge-path"; String INTERACT_IGNORED_CONTENT = "interact-ignored-content"; + String FIXED_STEP_WIDTH = "fixed-step-width"; } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index 17b930d69..a0884cf63 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -74,7 +74,7 @@ public class MaterialStep extends MaterialWidget implements HasActive, HasTitle, private int step; private String title; private String description = ""; - private Div conCircle = new Div(); + private Div header = new Div(); private Div conBody = new Div(); private Div divCircle = new Div(); private Div divLine = new Div(); @@ -91,9 +91,10 @@ public class MaterialStep extends MaterialWidget implements HasActive, HasTitle, public MaterialStep() { super(Document.get().createDivElement(), AddinsCssName.STEP); - super.add(conCircle); - conCircle.add(divCircle); - conCircle.add(divLine); + header.addStyleName(AddinsCssName.STEP_HEADER); + super.add(header); + header.add(divCircle); + header.add(divLine); super.add(conBody); conBody.add(divTitle); @@ -125,7 +126,7 @@ protected void onLoad() { SelectionEvent.fire(MaterialStep.this, MaterialStep.this); } }; - registerHandler(conCircle.addClickHandler(handler)); + registerHandler(header.addClickHandler(handler)); registerHandler(divTitle.addClickHandler(handler)); registerHandler(divDescription.addClickHandler(handler)); } @@ -205,7 +206,7 @@ public State getState() { public void clearStatusText() { clearErrorText(); clearSuccessText(); - conCircle.insert(divCircle, 0); + header.insert(divCircle, 0); } @Override @@ -259,7 +260,7 @@ protected void applyIconStatus(MaterialIcon icon, String description) { iconError.removeFromParent(); iconSuccess.removeFromParent(); divCircle.removeFromParent(); - conCircle.insert(icon, 0); + header.insert(icon, 0); if (description != null) { divDescription.getElement().setInnerSafeHtml(SafeHtmlUtils.fromString(description)); } @@ -276,8 +277,8 @@ public void setLineDistanceWidth(int lineDistanceWidth) { } } - public Div getConCircle() { - return conCircle; + public Div getHeader() { + return header; } public Div getConBody() { @@ -312,15 +313,14 @@ public void setAxis(Axis axis) { this.axis = axis; switch (axis) { case HORIZONTAL: - conCircle.add(divTitle); - conCircle.add(divLine); - conCircle.add(divDescription); + header.add(divTitle); + header.add(divDescription); + super.insert(divLine, 1); break; case VERTICAL: conBody.insert(divTitle, 0); conBody.insert(divDescription, 1); - conCircle.add(divLine); - + header.add(divLine); break; } } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 1ad84fe06..a80371def 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -45,11 +45,11 @@ import gwt.material.design.client.base.MaterialWidget; import gwt.material.design.client.base.mixin.CssNameMixin; import gwt.material.design.client.base.mixin.StatusDisplayMixin; +import gwt.material.design.client.base.mixin.ToggleStyleMixin; import gwt.material.design.client.constants.Axis; import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; -import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; import gwt.material.design.client.ui.html.Div; @@ -100,12 +100,13 @@ public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatu private int currentStepIndex = 0; private int totalSteps; private boolean stepSkippingAllowed = true; - private boolean equalStepWidth = false; + private boolean fixedStepWidth = false; private boolean detectOrientation = true; private Div divFeedback = new Div(); private Span feedbackSpan = new Span(); private HandlerRegistration orientationHandler; + private ToggleStyleMixin toggleFixedStepWidth; private CssNameMixin axisMixin; private StepperTransitionMixin stepperTransitionMixin; @@ -132,7 +133,7 @@ protected void onLoad() { public void updateStepWidth() { for (Widget child : getChildren()) { if (child instanceof MaterialStep) { - if (equalStepWidth) { + if (fixedStepWidth) { double stepWidth = 100 / getChildren().size(); child.setWidth(stepWidth + "%"); } else { @@ -497,16 +498,14 @@ public boolean isStepSkippingAllowed() { return stepSkippingAllowed; } - public boolean isEqualStepWidth() { - return equalStepWidth; + public boolean isFixedStepWidth() { + return fixedStepWidth; } - public void setEqualStepWidth(boolean equalStepWidth) { - this.equalStepWidth = equalStepWidth; - - if (isAttached()) { - updateStepWidth(); - } + public void setFixedStepWidth(boolean fixedStepWidth) { + this.fixedStepWidth = fixedStepWidth; + updateStepWidth(); + getToggleFixedStepWidth().setOn(fixedStepWidth); } public Span getFeedbackSpan() { @@ -603,4 +602,11 @@ protected StepperTransitionMixin getStepperTransitionMixin() { } return stepperTransitionMixin; } + + protected ToggleStyleMixin getToggleFixedStepWidth() { + if (toggleFixedStepWidth == null) { + toggleFixedStepWidth = new ToggleStyleMixin<>(this, AddinsCssName.FIXED_STEP_WIDTH); + } + return toggleFixedStepWidth; + } } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java index f045329f9..84eb6a231 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/mixin/StepperTransitionMixin.java @@ -22,6 +22,7 @@ import com.google.gwt.dom.client.Style; import gwt.material.design.addins.client.stepper.MaterialStep; import gwt.material.design.addins.client.stepper.MaterialStepper; +import gwt.material.design.client.constants.Axis; import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; @@ -67,7 +68,7 @@ public void animateNext() { MaterialStep nextStep = stepper.getStep(currentStep.getStep() + 1); if (currentStep != null && nextStep != null) { - if (enableTransition) { + if (enableTransition && stepper.getAxis() == Axis.HORIZONTAL) { currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(nextOutTransition).animate(currentStep.getConBody(), () -> { currentStep.setActive(false); @@ -88,7 +89,7 @@ public void animatePrevious() { MaterialStep currentStep = stepper.getCurrentStep(); MaterialStep previousStep = stepper.getStep(currentStep.getStep() - 1); if (currentStep != null && previousStep != null) { - if (enableTransition) { + if (enableTransition && stepper.getAxis() == Axis.HORIZONTAL) { currentStep.getDivBody().setOverflow(Style.Overflow.HIDDEN); new MaterialAnimation().transition(previousOutTransition).animate(currentStep.getConBody(), () -> { currentStep.setActive(false); diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css index d743214f5..78d00bb50 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css @@ -2,10 +2,19 @@ position: relative; min-height: 32px; padding: 12px; - cursor: pointer + cursor: pointer; } -.stepper .step:hover { +.stepper.horizontal .step { + min-width: 240px; +} + +.stepper.horizontal.fixed-step-width .step { + min-width: unset; +} + +.stepper .step:hover, +.stepper.horizontal .step:hover .step-header { background: #F6F6F6 } @@ -51,10 +60,8 @@ } .stepper .body { - padding-bottom: 28px; - padding-top: 8px; opacity: 1; - padding: 20px; + padding: 20px } .stepper .description { @@ -67,7 +74,7 @@ .stepper.horizontal { line-height: 0; position: relative; - min-height: 600px; + min-height: 600px } .stepper.horizontal .step { @@ -81,14 +88,28 @@ display: inline-block } +.stepper.horizontal .step .step-header { + display: inherit; + height: 40px; + max-width: 80%; + background: #FFFFFF; + z-index: 1; + position: relative; + padding-right: 20px; + box-sizing: border-box; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + .stepper.horizontal .step .line { border-left: 0; + height: 2px; position: inherit; - border-top: 1px solid #dcdcdc; - width: 100px; - margin-bottom: 5px; - margin-left: 8px; - margin-right: -36px + border-top: 2px solid #dcdcdc; + width: 100%; + float: right; + margin-top: -24px; } .stepper.horizontal .step .title { @@ -119,10 +140,6 @@ font-weight: 400 } -.stepper.horizontal .step.inactive > :nth-child(2) { - visibility: hidden -} - .stepper .step.inactive .body { opacity: 0; transition: .6s all; @@ -130,7 +147,7 @@ max-height: 0; z-index: -1; position: relative; - display: none; + display: none } .stepper .step.active .body { @@ -141,11 +158,11 @@ padding-bottom: 28px; padding-top: 8px; z-index: 1 !important; - display: block !important; + display: block !important } .stepper .step.inactive > div:first-child .circle { - background-color: #9e9e9e !important; + background-color: #9e9e9e !important } .stepper .step > div:first-child i { @@ -180,8 +197,12 @@ padding: 36px } -/** Vertical steppers **/ +/** Vertical Stepper **/ +.stepper.vertical .step { + width: 100% !important; +} + .stepper.vertical .step.active .body { - padding-bottom: 0px; - padding-right: 20px; + padding-bottom: 0; + padding-right: 20px } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index e2c88ce4a..d6daa71e2 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -1 +1 @@ -.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper .step:hover{background:#F6F6F6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .line{border-left:0;position:inherit;border-top:1px solid #dcdcdc;width:100px;margin-bottom:5px;margin-left:8px;margin-right:-36px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#C9C9C9;font-weight:400}.stepper.horizontal .step.inactive>:nth-child(2){visibility:hidden}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file +.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#F6F6F6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#FFF;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#C9C9C9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java index 9b7576643..55a7ffc62 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java @@ -70,8 +70,8 @@ public void testStructure() { int i = steps.indexOf(step) + 1; assertEquals(i, step.getStep()); - assertEquals(step.getWidget(0), step.getConCircle()); - Div conCircle = step.getConCircle(); + assertEquals(step.getWidget(0), step.getHeader()); + Div conCircle = step.getHeader(); assertEquals(step.getWidget(1), step.getConBody()); Div conBody = step.getConBody(); From c450ed89b162ecbb03a9db520c4a1785f49e642b Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Wed, 10 Oct 2018 13:12:53 +0800 Subject: [PATCH 050/247] Test Updates for Stepper component. --- .../addins/client/ui/MaterialStepperTest.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java index 55a7ffc62..d35549552 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java @@ -73,14 +73,13 @@ public void testStructure() { assertEquals(step.getWidget(0), step.getHeader()); Div conCircle = step.getHeader(); - assertEquals(step.getWidget(1), step.getConBody()); + assertEquals(step.getWidget(1), step.getDivLine()); Div conBody = step.getConBody(); assertEquals(step.getAxis(), Axis.HORIZONTAL); assertEquals(step.getDivCircle(), conCircle.getWidget(0)); assertEquals(step.getDivTitle(), conCircle.getWidget(1)); - assertEquals(step.getDivLine(), conCircle.getWidget(2)); - assertEquals(step.getDivDescription(), conCircle.getWidget(3)); + assertEquals(step.getDivDescription(), conCircle.getWidget(2)); step.setAxis(Axis.VERTICAL); assertEquals(step.getDivTitle(), conBody.getWidget(0)); @@ -170,26 +169,21 @@ public void testAxis() { protected void checkAxis(MaterialStepper stepper) { MaterialStep step = stepper.getCurrentStep(); - MaterialWidget conCircle = (MaterialWidget) step.getWidget(0); - MaterialWidget conBody = (MaterialWidget) step.getWidget(1); - // when / then - assertNotNull(stepper.getCurrentStep()); - stepper.setAxis(Axis.VERTICAL); - assertEquals(Axis.VERTICAL, stepper.getAxis()); - assertTrue(stepper.getElement().hasClassName(Axis.VERTICAL.getCssName())); - - assertTrue(conBody.getWidget(0).getElement().hasClassName(CssName.TITLE)); - assertTrue(conBody.getWidget(1).getElement().hasClassName(AddinsCssName.DESCRIPTION)); - assertTrue(conBody.getWidget(2).getElement().hasClassName(AddinsCssName.BODY)); - - stepper.setAxis(Axis.HORIZONTAL); - assertEquals(Axis.HORIZONTAL, stepper.getAxis()); - assertTrue(stepper.getElement().hasClassName(Axis.HORIZONTAL.getCssName())); - assertTrue(step.getWidget(0) instanceof MaterialWidget); - MaterialWidget horiCon = (MaterialWidget) step.getWidget(0); - assertTrue(horiCon.getWidget(1).getElement().hasClassName(CssName.TITLE)); - assertTrue(horiCon.getWidget(3).getElement().hasClassName(AddinsCssName.DESCRIPTION)); + step.setAxis(Axis.HORIZONTAL); + assertEquals(step.getAxis(), Axis.HORIZONTAL); + + assertEquals(step.getHeader().getWidget(0), step.getDivCircle()); + assertEquals(step.getHeader().getWidget(1), step.getDivTitle()); + assertEquals(step.getHeader().getWidget(2), step.getDivDescription()); + assertEquals(step.getWidget(1), step.getDivLine()); + + step.setAxis(Axis.VERTICAL); + assertEquals(step.getAxis(), Axis.VERTICAL); + + assertEquals(step.getConBody().getWidget(0), step.getDivTitle()); + assertEquals(step.getConBody().getWidget(1), step.getDivDescription()); + assertEquals(step.getHeader().getWidget(1), step.getDivLine()); } public void testStepNavigation() { From 3bf162d822ba4f7db0d323a930cd842d6210e6cd Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Sat, 20 Oct 2018 09:50:21 +0800 Subject: [PATCH 051/247] Added FontAwesome resources for custom icon support. --- .../client/emptystate/MaterialEmptyState.java | 10 + .../addins/client/note/MaterialNote.java | 10 + .../client/timepicker/MaterialTimePicker.java | 10 + .../incubator/FontAwesomeResources.gwt.xml | 34 + .../resources/css/fontawesome-all.css | 3932 ++++++++++++++++ .../resources/css/fontawesome-all.min.css | 3932 ++++++++++++++++ .../incubator/public/css/fontawesome-all.css | 3954 +++++++++++++++++ .../public/css/fontawesome-all.min.css | 4 + .../fontawesome-icons/fa-brands-400.eot | Bin 0 -> 123540 bytes .../fontawesome-icons/fa-brands-400.svg | 1175 +++++ .../fontawesome-icons/fa-brands-400.ttf | Bin 0 -> 123304 bytes .../fontawesome-icons/fa-brands-400.woff | Bin 0 -> 79752 bytes .../fontawesome-icons/fa-brands-400.woff2 | Bin 0 -> 68240 bytes .../fontawesome-icons/fa-regular-400.eot | Bin 0 -> 40576 bytes .../fontawesome-icons/fa-regular-400.svg | 467 ++ .../fontawesome-icons/fa-regular-400.ttf | Bin 0 -> 40348 bytes .../fontawesome-icons/fa-regular-400.woff | Bin 0 -> 18168 bytes .../fontawesome-icons/fa-regular-400.woff2 | Bin 0 -> 14880 bytes .../public/fontawesome-icons/fa-solid-900.eot | Bin 0 -> 191332 bytes .../public/fontawesome-icons/fa-solid-900.svg | 2564 +++++++++++ .../public/fontawesome-icons/fa-solid-900.ttf | Bin 0 -> 191112 bytes .../fontawesome-icons/fa-solid-900.woff | Bin 0 -> 92696 bytes .../fontawesome-icons/fa-solid-900.woff2 | Bin 0 -> 72000 bytes 23 files changed, 16092 insertions(+) create mode 100644 src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml create mode 100644 src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css create mode 100644 src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.eot create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.svg create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.ttf create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.woff create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.woff2 create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.eot create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.svg create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.ttf create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.woff create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.woff2 create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.eot create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.svg create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.ttf create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.woff create mode 100644 src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.woff2 diff --git a/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java b/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java index 4ea9c189b..d16874585 100644 --- a/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java +++ b/src/main/java/gwt/material/design/addins/client/emptystate/MaterialEmptyState.java @@ -154,6 +154,16 @@ public boolean isIconPrefix() { return icon.isIconPrefix(); } + @Override + public void setCustomIconType(String iconType) { + icon.setCustomIconType(iconType); + } + + @Override + public String getCustomIconType() { + return icon.getCustomIconType(); + } + public Div getContainer() { return container; } diff --git a/src/main/java/gwt/material/design/addins/client/note/MaterialNote.java b/src/main/java/gwt/material/design/addins/client/note/MaterialNote.java index 7eaf273cc..f8a0c904a 100644 --- a/src/main/java/gwt/material/design/addins/client/note/MaterialNote.java +++ b/src/main/java/gwt/material/design/addins/client/note/MaterialNote.java @@ -135,4 +135,14 @@ public void setIconPrefix(boolean b) { public boolean isIconPrefix() { return icon.isIconPrefix(); } + + @Override + public void setCustomIconType(String iconType) { + icon.setCustomIconType(iconType); + } + + @Override + public String getCustomIconType() { + return icon.getCustomIconType(); + } } diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java index 04ad80edc..5454677cf 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java @@ -384,6 +384,16 @@ public boolean isIconPrefix() { return icon.isIconPrefix(); } + @Override + public void setCustomIconType(String iconType) { + icon.setCustomIconType(iconType); + } + + @Override + public String getCustomIconType() { + return icon.getCustomIconType(); + } + @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); diff --git a/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml b/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml new file mode 100644 index 000000000..f4525af96 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff --git a/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css b/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css new file mode 100644 index 000000000..16b655e70 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css @@ -0,0 +1,3932 @@ +/*! + * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } +.fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-acquisitions-incorporated:before { + content: "\f6af"; } + +.fa-ad:before { + content: "\f641"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-air-freshener:before { + content: "\f5d0"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angry:before { + content: "\f556"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-ankh:before { + content: "\f644"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-alt:before { + content: "\f5d1"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-archway:before { + content: "\f557"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-atlas:before { + content: "\f558"; } + +.fa-atom:before { + content: "\f5d2"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-award:before { + content: "\f559"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backspace:before { + content: "\f55a"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bezier-curve:before { + content: "\f55b"; } + +.fa-bible:before { + content: "\f647"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blender:before { + content: "\f517"; } + +.fa-blender-phone:before { + content: "\f6b6"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-bone:before { + content: "\f5d7"; } + +.fa-bong:before { + content: "\f55c"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-book-dead:before { + content: "\f6b7"; } + +.fa-book-open:before { + content: "\f518"; } + +.fa-book-reader:before { + content: "\f5da"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-brain:before { + content: "\f5dc"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-broadcast-tower:before { + content: "\f519"; } + +.fa-broom:before { + content: "\f51a"; } + +.fa-brush:before { + content: "\f55d"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-bus-alt:before { + content: "\f55e"; } + +.fa-business-time:before { + content: "\f64a"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-campground:before { + content: "\f6bb"; } + +.fa-cannabis:before { + content: "\f55f"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-car-alt:before { + content: "\f5de"; } + +.fa-car-battery:before { + content: "\f5df"; } + +.fa-car-crash:before { + content: "\f5e1"; } + +.fa-car-side:before { + content: "\f5e4"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cat:before { + content: "\f6be"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chair:before { + content: "\f6c0"; } + +.fa-chalkboard:before { + content: "\f51b"; } + +.fa-chalkboard-teacher:before { + content: "\f51c"; } + +.fa-charging-station:before { + content: "\f5e7"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-double:before { + content: "\f560"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-church:before { + content: "\f51d"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-city:before { + content: "\f64f"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-moon:before { + content: "\f6c3"; } + +.fa-cloud-sun:before { + content: "\f6c4"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-cocktail:before { + content: "\f561"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-coins:before { + content: "\f51e"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dollar:before { + content: "\f651"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-comments-dollar:before { + content: "\f653"; } + +.fa-compact-disc:before { + content: "\f51f"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-concierge-bell:before { + content: "\f562"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-cookie:before { + content: "\f563"; } + +.fa-cookie-bite:before { + content: "\f564"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crop-alt:before { + content: "\f565"; } + +.fa-cross:before { + content: "\f654"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-crow:before { + content: "\f520"; } + +.fa-crown:before { + content: "\f521"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-dharmachakra:before { + content: "\f655"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-dice:before { + content: "\f522"; } + +.fa-dice-d20:before { + content: "\f6cf"; } + +.fa-dice-d6:before { + content: "\f6d1"; } + +.fa-dice-five:before { + content: "\f523"; } + +.fa-dice-four:before { + content: "\f524"; } + +.fa-dice-one:before { + content: "\f525"; } + +.fa-dice-six:before { + content: "\f526"; } + +.fa-dice-three:before { + content: "\f527"; } + +.fa-dice-two:before { + content: "\f528"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-digital-tachograph:before { + content: "\f566"; } + +.fa-directions:before { + content: "\f5eb"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-divide:before { + content: "\f529"; } + +.fa-dizzy:before { + content: "\f567"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dog:before { + content: "\f6d3"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-door-closed:before { + content: "\f52a"; } + +.fa-door-open:before { + content: "\f52b"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-drafting-compass:before { + content: "\f568"; } + +.fa-dragon:before { + content: "\f6d5"; } + +.fa-draw-polygon:before { + content: "\f5ee"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drum:before { + content: "\f569"; } + +.fa-drum-steelpan:before { + content: "\f56a"; } + +.fa-drumstick-bite:before { + content: "\f6d7"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dumbbell:before { + content: "\f44b"; } + +.fa-dungeon:before { + content: "\f6d9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-open-text:before { + content: "\f658"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-equals:before { + content: "\f52c"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-feather:before { + content: "\f52d"; } + +.fa-feather-alt:before { + content: "\f56b"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-contract:before { + content: "\f56c"; } + +.fa-file-csv:before { + content: "\f6dd"; } + +.fa-file-download:before { + content: "\f56d"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-export:before { + content: "\f56e"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-import:before { + content: "\f56f"; } + +.fa-file-invoice:before { + content: "\f570"; } + +.fa-file-invoice-dollar:before { + content: "\f571"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-prescription:before { + content: "\f572"; } + +.fa-file-signature:before { + content: "\f573"; } + +.fa-file-upload:before { + content: "\f574"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-fill:before { + content: "\f575"; } + +.fa-fill-drip:before { + content: "\f576"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fingerprint:before { + content: "\f577"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-fish:before { + content: "\f578"; } + +.fa-fist-raised:before { + content: "\f6de"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-flushed:before { + content: "\f579"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-minus:before { + content: "\f65d"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-folder-plus:before { + content: "\f65e"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frog:before { + content: "\f52e"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-frown-open:before { + content: "\f57a"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-funnel-dollar:before { + content: "\f662"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gas-pump:before { + content: "\f52f"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-ghost:before { + content: "\f6e2"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glass-martini-alt:before { + content: "\f57b"; } + +.fa-glasses:before { + content: "\f530"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-globe-africa:before { + content: "\f57c"; } + +.fa-globe-americas:before { + content: "\f57d"; } + +.fa-globe-asia:before { + content: "\f57e"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-gopuram:before { + content: "\f664"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-greater-than:before { + content: "\f531"; } + +.fa-greater-than-equal:before { + content: "\f532"; } + +.fa-grimace:before { + content: "\f57f"; } + +.fa-grin:before { + content: "\f580"; } + +.fa-grin-alt:before { + content: "\f581"; } + +.fa-grin-beam:before { + content: "\f582"; } + +.fa-grin-beam-sweat:before { + content: "\f583"; } + +.fa-grin-hearts:before { + content: "\f584"; } + +.fa-grin-squint:before { + content: "\f585"; } + +.fa-grin-squint-tears:before { + content: "\f586"; } + +.fa-grin-stars:before { + content: "\f587"; } + +.fa-grin-tears:before { + content: "\f588"; } + +.fa-grin-tongue:before { + content: "\f589"; } + +.fa-grin-tongue-squint:before { + content: "\f58a"; } + +.fa-grin-tongue-wink:before { + content: "\f58b"; } + +.fa-grin-wink:before { + content: "\f58c"; } + +.fa-grip-horizontal:before { + content: "\f58d"; } + +.fa-grip-vertical:before { + content: "\f58e"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-hammer:before { + content: "\f6e3"; } + +.fa-hamsa:before { + content: "\f665"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hanukiah:before { + content: "\f6e6"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hat-wizard:before { + content: "\f6e8"; } + +.fa-haykal:before { + content: "\f666"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-headphones-alt:before { + content: "\f58f"; } + +.fa-headset:before { + content: "\f590"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-helicopter:before { + content: "\f533"; } + +.fa-highlighter:before { + content: "\f591"; } + +.fa-hiking:before { + content: "\f6ec"; } + +.fa-hippo:before { + content: "\f6ed"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-horse:before { + content: "\f6f0"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hot-tub:before { + content: "\f593"; } + +.fa-hotel:before { + content: "\f594"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-house-damage:before { + content: "\f6f1"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-hryvnia:before { + content: "\f6f2"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-infinity:before { + content: "\f534"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jedi:before { + content: "\f669"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joint:before { + content: "\f595"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-journal-whills:before { + content: "\f66a"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-kaaba:before { + content: "\f66b"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-khanda:before { + content: "\f66d"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-kiss:before { + content: "\f596"; } + +.fa-kiss-beam:before { + content: "\f597"; } + +.fa-kiss-wink-heart:before { + content: "\f598"; } + +.fa-kiwi-bird:before { + content: "\f535"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-landmark:before { + content: "\f66f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laptop-code:before { + content: "\f5fc"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-laugh:before { + content: "\f599"; } + +.fa-laugh-beam:before { + content: "\f59a"; } + +.fa-laugh-squint:before { + content: "\f59b"; } + +.fa-laugh-wink:before { + content: "\f59c"; } + +.fa-layer-group:before { + content: "\f5fd"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-less-than:before { + content: "\f536"; } + +.fa-less-than-equal:before { + content: "\f537"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-luggage-cart:before { + content: "\f59d"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-mail-bulk:before { + content: "\f674"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-male:before { + content: "\f183"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marked:before { + content: "\f59f"; } + +.fa-map-marked-alt:before { + content: "\f5a0"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-marker:before { + content: "\f5a1"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-mask:before { + content: "\f6fa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medal:before { + content: "\f5a2"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-meh-blank:before { + content: "\f5a4"; } + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; } + +.fa-memory:before { + content: "\f538"; } + +.fa-menorah:before { + content: "\f676"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-alt:before { + content: "\f3c9"; } + +.fa-microphone-alt-slash:before { + content: "\f539"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microscope:before { + content: "\f610"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill:before { + content: "\f0d6"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-money-bill-wave:before { + content: "\f53a"; } + +.fa-money-bill-wave-alt:before { + content: "\f53b"; } + +.fa-money-check:before { + content: "\f53c"; } + +.fa-money-check-alt:before { + content: "\f53d"; } + +.fa-monument:before { + content: "\f5a6"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-mortar-pestle:before { + content: "\f5a7"; } + +.fa-mosque:before { + content: "\f678"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mountain:before { + content: "\f6fc"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-network-wired:before { + content: "\f6ff"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-not-equal:before { + content: "\f53e"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-oil-can:before { + content: "\f613"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-om:before { + content: "\f679"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-otter:before { + content: "\f700"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-paint-roller:before { + content: "\f5aa"; } + +.fa-palette:before { + content: "\f53f"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-parking:before { + content: "\f540"; } + +.fa-passport:before { + content: "\f5ab"; } + +.fa-pastafarianism:before { + content: "\f67b"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-peace:before { + content: "\f67c"; } + +.fa-pen:before { + content: "\f304"; } + +.fa-pen-alt:before { + content: "\f305"; } + +.fa-pen-fancy:before { + content: "\f5ac"; } + +.fa-pen-nib:before { + content: "\f5ad"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-pencil-ruler:before { + content: "\f5ae"; } + +.fa-penny-arcade:before { + content: "\f704"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-percentage:before { + content: "\f541"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-place-of-worship:before { + content: "\f67f"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-plane-arrival:before { + content: "\f5af"; } + +.fa-plane-departure:before { + content: "\f5b0"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poll:before { + content: "\f681"; } + +.fa-poll-h:before { + content: "\f682"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-poop:before { + content: "\f619"; } + +.fa-portrait:before { + content: "\f3e0"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-pray:before { + content: "\f683"; } + +.fa-praying-hands:before { + content: "\f684"; } + +.fa-prescription:before { + content: "\f5b1"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-project-diagram:before { + content: "\f542"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-quran:before { + content: "\f687"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-receipt:before { + content: "\f543"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-ring:before { + content: "\f70b"; } + +.fa-road:before { + content: "\f018"; } + +.fa-robot:before { + content: "\f544"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-route:before { + content: "\f4d7"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-ruler:before { + content: "\f545"; } + +.fa-ruler-combined:before { + content: "\f546"; } + +.fa-ruler-horizontal:before { + content: "\f547"; } + +.fa-ruler-vertical:before { + content: "\f548"; } + +.fa-running:before { + content: "\f70c"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-sad-cry:before { + content: "\f5b3"; } + +.fa-sad-tear:before { + content: "\f5b4"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-school:before { + content: "\f549"; } + +.fa-screwdriver:before { + content: "\f54a"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-scroll:before { + content: "\f70e"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-dollar:before { + content: "\f688"; } + +.fa-search-location:before { + content: "\f689"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-shapes:before { + content: "\f61f"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shoe-prints:before { + content: "\f54b"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-shuttle-van:before { + content: "\f5b6"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-signature:before { + content: "\f5b7"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-skull:before { + content: "\f54c"; } + +.fa-skull-crossbones:before { + content: "\f714"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-slash:before { + content: "\f715"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smile-beam:before { + content: "\f5b8"; } + +.fa-smile-wink:before { + content: "\f4da"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-smoking-ban:before { + content: "\f54d"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-socks:before { + content: "\f696"; } + +.fa-solar-panel:before { + content: "\f5ba"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-spa:before { + content: "\f5bb"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spider:before { + content: "\f717"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-splotch:before { + content: "\f5bc"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-spray-can:before { + content: "\f5bd"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-square-root-alt:before { + content: "\f698"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-stamp:before { + content: "\f5bf"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-and-crescent:before { + content: "\f699"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-star-half-alt:before { + content: "\f5c0"; } + +.fa-star-of-david:before { + content: "\f69a"; } + +.fa-star-of-life:before { + content: "\f621"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-store:before { + content: "\f54e"; } + +.fa-store-alt:before { + content: "\f54f"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-stream:before { + content: "\f550"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-stroopwafel:before { + content: "\f551"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-suitcase-rolling:before { + content: "\f5c1"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-surprise:before { + content: "\f5c2"; } + +.fa-swatchbook:before { + content: "\f5c3"; } + +.fa-swimmer:before { + content: "\f5c4"; } + +.fa-swimming-pool:before { + content: "\f5c5"; } + +.fa-synagogue:before { + content: "\f69b"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-teeth:before { + content: "\f62e"; } + +.fa-teeth-open:before { + content: "\f62f"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-theater-masks:before { + content: "\f630"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-tint-slash:before { + content: "\f5c7"; } + +.fa-tired:before { + content: "\f5c8"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-toilet-paper:before { + content: "\f71e"; } + +.fa-toolbox:before { + content: "\f552"; } + +.fa-tooth:before { + content: "\f5c9"; } + +.fa-torah:before { + content: "\f6a0"; } + +.fa-torii-gate:before { + content: "\f6a1"; } + +.fa-tractor:before { + content: "\f722"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-traffic-light:before { + content: "\f637"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-monster:before { + content: "\f63b"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-truck-pickup:before { + content: "\f63c"; } + +.fa-tshirt:before { + content: "\f553"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-umbrella-beach:before { + content: "\f5ca"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-alt:before { + content: "\f406"; } + +.fa-user-alt-slash:before { + content: "\f4fa"; } + +.fa-user-astronaut:before { + content: "\f4fb"; } + +.fa-user-check:before { + content: "\f4fc"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-clock:before { + content: "\f4fd"; } + +.fa-user-cog:before { + content: "\f4fe"; } + +.fa-user-edit:before { + content: "\f4ff"; } + +.fa-user-friends:before { + content: "\f500"; } + +.fa-user-graduate:before { + content: "\f501"; } + +.fa-user-injured:before { + content: "\f728"; } + +.fa-user-lock:before { + content: "\f502"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-minus:before { + content: "\f503"; } + +.fa-user-ninja:before { + content: "\f504"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-shield:before { + content: "\f505"; } + +.fa-user-slash:before { + content: "\f506"; } + +.fa-user-tag:before { + content: "\f507"; } + +.fa-user-tie:before { + content: "\f508"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-users-cog:before { + content: "\f509"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-vector-square:before { + content: "\f5cb"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vihara:before { + content: "\f6a7"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-mute:before { + content: "\f6a9"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-walking:before { + content: "\f554"; } + +.fa-wallet:before { + content: "\f555"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weight-hanging:before { + content: "\f5cd"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wind:before { + content: "\f72e"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-bottle:before { + content: "\f72f"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-wine-glass-alt:before { + content: "\f5ce"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yin-yang:before { + content: "\f6ad"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } + +.fab { + font-family: 'Font Awesome 5 Brands'; } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css b/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css new file mode 100644 index 000000000..1bf10857a --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css @@ -0,0 +1,3932 @@ +/*! + * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } +.fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-acquisitions-incorporated:before { + content: "\f6af"; } + +.fa-ad:before { + content: "\f641"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-air-freshener:before { + content: "\f5d0"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angry:before { + content: "\f556"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-ankh:before { + content: "\f644"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-alt:before { + content: "\f5d1"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-archway:before { + content: "\f557"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-atlas:before { + content: "\f558"; } + +.fa-atom:before { + content: "\f5d2"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-award:before { + content: "\f559"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backspace:before { + content: "\f55a"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bezier-curve:before { + content: "\f55b"; } + +.fa-bible:before { + content: "\f647"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blender:before { + content: "\f517"; } + +.fa-blender-phone:before { + content: "\f6b6"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-bone:before { + content: "\f5d7"; } + +.fa-bong:before { + content: "\f55c"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-book-dead:before { + content: "\f6b7"; } + +.fa-book-open:before { + content: "\f518"; } + +.fa-book-reader:before { + content: "\f5da"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-brain:before { + content: "\f5dc"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-broadcast-tower:before { + content: "\f519"; } + +.fa-broom:before { + content: "\f51a"; } + +.fa-brush:before { + content: "\f55d"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-bus-alt:before { + content: "\f55e"; } + +.fa-business-time:before { + content: "\f64a"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-campground:before { + content: "\f6bb"; } + +.fa-cannabis:before { + content: "\f55f"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-car-alt:before { + content: "\f5de"; } + +.fa-car-battery:before { + content: "\f5df"; } + +.fa-car-crash:before { + content: "\f5e1"; } + +.fa-car-side:before { + content: "\f5e4"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cat:before { + content: "\f6be"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chair:before { + content: "\f6c0"; } + +.fa-chalkboard:before { + content: "\f51b"; } + +.fa-chalkboard-teacher:before { + content: "\f51c"; } + +.fa-charging-station:before { + content: "\f5e7"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-double:before { + content: "\f560"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-church:before { + content: "\f51d"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-city:before { + content: "\f64f"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-moon:before { + content: "\f6c3"; } + +.fa-cloud-sun:before { + content: "\f6c4"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-cocktail:before { + content: "\f561"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-coins:before { + content: "\f51e"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dollar:before { + content: "\f651"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-comments-dollar:before { + content: "\f653"; } + +.fa-compact-disc:before { + content: "\f51f"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-concierge-bell:before { + content: "\f562"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-cookie:before { + content: "\f563"; } + +.fa-cookie-bite:before { + content: "\f564"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crop-alt:before { + content: "\f565"; } + +.fa-cross:before { + content: "\f654"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-crow:before { + content: "\f520"; } + +.fa-crown:before { + content: "\f521"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-dharmachakra:before { + content: "\f655"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-dice:before { + content: "\f522"; } + +.fa-dice-d20:before { + content: "\f6cf"; } + +.fa-dice-d6:before { + content: "\f6d1"; } + +.fa-dice-five:before { + content: "\f523"; } + +.fa-dice-four:before { + content: "\f524"; } + +.fa-dice-one:before { + content: "\f525"; } + +.fa-dice-six:before { + content: "\f526"; } + +.fa-dice-three:before { + content: "\f527"; } + +.fa-dice-two:before { + content: "\f528"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-digital-tachograph:before { + content: "\f566"; } + +.fa-directions:before { + content: "\f5eb"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-divide:before { + content: "\f529"; } + +.fa-dizzy:before { + content: "\f567"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dog:before { + content: "\f6d3"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-door-closed:before { + content: "\f52a"; } + +.fa-door-open:before { + content: "\f52b"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-drafting-compass:before { + content: "\f568"; } + +.fa-dragon:before { + content: "\f6d5"; } + +.fa-draw-polygon:before { + content: "\f5ee"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drum:before { + content: "\f569"; } + +.fa-drum-steelpan:before { + content: "\f56a"; } + +.fa-drumstick-bite:before { + content: "\f6d7"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dumbbell:before { + content: "\f44b"; } + +.fa-dungeon:before { + content: "\f6d9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-open-text:before { + content: "\f658"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-equals:before { + content: "\f52c"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-feather:before { + content: "\f52d"; } + +.fa-feather-alt:before { + content: "\f56b"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-contract:before { + content: "\f56c"; } + +.fa-file-csv:before { + content: "\f6dd"; } + +.fa-file-download:before { + content: "\f56d"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-export:before { + content: "\f56e"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-import:before { + content: "\f56f"; } + +.fa-file-invoice:before { + content: "\f570"; } + +.fa-file-invoice-dollar:before { + content: "\f571"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-prescription:before { + content: "\f572"; } + +.fa-file-signature:before { + content: "\f573"; } + +.fa-file-upload:before { + content: "\f574"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-fill:before { + content: "\f575"; } + +.fa-fill-drip:before { + content: "\f576"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fingerprint:before { + content: "\f577"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-fish:before { + content: "\f578"; } + +.fa-fist-raised:before { + content: "\f6de"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-flushed:before { + content: "\f579"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-minus:before { + content: "\f65d"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-folder-plus:before { + content: "\f65e"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frog:before { + content: "\f52e"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-frown-open:before { + content: "\f57a"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-funnel-dollar:before { + content: "\f662"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gas-pump:before { + content: "\f52f"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-ghost:before { + content: "\f6e2"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glass-martini-alt:before { + content: "\f57b"; } + +.fa-glasses:before { + content: "\f530"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-globe-africa:before { + content: "\f57c"; } + +.fa-globe-americas:before { + content: "\f57d"; } + +.fa-globe-asia:before { + content: "\f57e"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-gopuram:before { + content: "\f664"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-greater-than:before { + content: "\f531"; } + +.fa-greater-than-equal:before { + content: "\f532"; } + +.fa-grimace:before { + content: "\f57f"; } + +.fa-grin:before { + content: "\f580"; } + +.fa-grin-alt:before { + content: "\f581"; } + +.fa-grin-beam:before { + content: "\f582"; } + +.fa-grin-beam-sweat:before { + content: "\f583"; } + +.fa-grin-hearts:before { + content: "\f584"; } + +.fa-grin-squint:before { + content: "\f585"; } + +.fa-grin-squint-tears:before { + content: "\f586"; } + +.fa-grin-stars:before { + content: "\f587"; } + +.fa-grin-tears:before { + content: "\f588"; } + +.fa-grin-tongue:before { + content: "\f589"; } + +.fa-grin-tongue-squint:before { + content: "\f58a"; } + +.fa-grin-tongue-wink:before { + content: "\f58b"; } + +.fa-grin-wink:before { + content: "\f58c"; } + +.fa-grip-horizontal:before { + content: "\f58d"; } + +.fa-grip-vertical:before { + content: "\f58e"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-hammer:before { + content: "\f6e3"; } + +.fa-hamsa:before { + content: "\f665"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hanukiah:before { + content: "\f6e6"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hat-wizard:before { + content: "\f6e8"; } + +.fa-haykal:before { + content: "\f666"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-headphones-alt:before { + content: "\f58f"; } + +.fa-headset:before { + content: "\f590"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-helicopter:before { + content: "\f533"; } + +.fa-highlighter:before { + content: "\f591"; } + +.fa-hiking:before { + content: "\f6ec"; } + +.fa-hippo:before { + content: "\f6ed"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-horse:before { + content: "\f6f0"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hot-tub:before { + content: "\f593"; } + +.fa-hotel:before { + content: "\f594"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-house-damage:before { + content: "\f6f1"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-hryvnia:before { + content: "\f6f2"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-infinity:before { + content: "\f534"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jedi:before { + content: "\f669"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joint:before { + content: "\f595"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-journal-whills:before { + content: "\f66a"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-kaaba:before { + content: "\f66b"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-khanda:before { + content: "\f66d"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-kiss:before { + content: "\f596"; } + +.fa-kiss-beam:before { + content: "\f597"; } + +.fa-kiss-wink-heart:before { + content: "\f598"; } + +.fa-kiwi-bird:before { + content: "\f535"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-landmark:before { + content: "\f66f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laptop-code:before { + content: "\f5fc"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-laugh:before { + content: "\f599"; } + +.fa-laugh-beam:before { + content: "\f59a"; } + +.fa-laugh-squint:before { + content: "\f59b"; } + +.fa-laugh-wink:before { + content: "\f59c"; } + +.fa-layer-group:before { + content: "\f5fd"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-less-than:before { + content: "\f536"; } + +.fa-less-than-equal:before { + content: "\f537"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-luggage-cart:before { + content: "\f59d"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-mail-bulk:before { + content: "\f674"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-male:before { + content: "\f183"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marked:before { + content: "\f59f"; } + +.fa-map-marked-alt:before { + content: "\f5a0"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-marker:before { + content: "\f5a1"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-mask:before { + content: "\f6fa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medal:before { + content: "\f5a2"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-meh-blank:before { + content: "\f5a4"; } + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; } + +.fa-memory:before { + content: "\f538"; } + +.fa-menorah:before { + content: "\f676"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-alt:before { + content: "\f3c9"; } + +.fa-microphone-alt-slash:before { + content: "\f539"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microscope:before { + content: "\f610"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill:before { + content: "\f0d6"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-money-bill-wave:before { + content: "\f53a"; } + +.fa-money-bill-wave-alt:before { + content: "\f53b"; } + +.fa-money-check:before { + content: "\f53c"; } + +.fa-money-check-alt:before { + content: "\f53d"; } + +.fa-monument:before { + content: "\f5a6"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-mortar-pestle:before { + content: "\f5a7"; } + +.fa-mosque:before { + content: "\f678"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mountain:before { + content: "\f6fc"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-network-wired:before { + content: "\f6ff"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-not-equal:before { + content: "\f53e"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-oil-can:before { + content: "\f613"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-om:before { + content: "\f679"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-otter:before { + content: "\f700"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-paint-roller:before { + content: "\f5aa"; } + +.fa-palette:before { + content: "\f53f"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-parking:before { + content: "\f540"; } + +.fa-passport:before { + content: "\f5ab"; } + +.fa-pastafarianism:before { + content: "\f67b"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-peace:before { + content: "\f67c"; } + +.fa-pen:before { + content: "\f304"; } + +.fa-pen-alt:before { + content: "\f305"; } + +.fa-pen-fancy:before { + content: "\f5ac"; } + +.fa-pen-nib:before { + content: "\f5ad"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-pencil-ruler:before { + content: "\f5ae"; } + +.fa-penny-arcade:before { + content: "\f704"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-percentage:before { + content: "\f541"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-place-of-worship:before { + content: "\f67f"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-plane-arrival:before { + content: "\f5af"; } + +.fa-plane-departure:before { + content: "\f5b0"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poll:before { + content: "\f681"; } + +.fa-poll-h:before { + content: "\f682"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-poop:before { + content: "\f619"; } + +.fa-portrait:before { + content: "\f3e0"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-pray:before { + content: "\f683"; } + +.fa-praying-hands:before { + content: "\f684"; } + +.fa-prescription:before { + content: "\f5b1"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-project-diagram:before { + content: "\f542"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-quran:before { + content: "\f687"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-receipt:before { + content: "\f543"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-ring:before { + content: "\f70b"; } + +.fa-road:before { + content: "\f018"; } + +.fa-robot:before { + content: "\f544"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-route:before { + content: "\f4d7"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-ruler:before { + content: "\f545"; } + +.fa-ruler-combined:before { + content: "\f546"; } + +.fa-ruler-horizontal:before { + content: "\f547"; } + +.fa-ruler-vertical:before { + content: "\f548"; } + +.fa-running:before { + content: "\f70c"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-sad-cry:before { + content: "\f5b3"; } + +.fa-sad-tear:before { + content: "\f5b4"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-school:before { + content: "\f549"; } + +.fa-screwdriver:before { + content: "\f54a"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-scroll:before { + content: "\f70e"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-dollar:before { + content: "\f688"; } + +.fa-search-location:before { + content: "\f689"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-shapes:before { + content: "\f61f"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shoe-prints:before { + content: "\f54b"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-shuttle-van:before { + content: "\f5b6"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-signature:before { + content: "\f5b7"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-skull:before { + content: "\f54c"; } + +.fa-skull-crossbones:before { + content: "\f714"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-slash:before { + content: "\f715"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smile-beam:before { + content: "\f5b8"; } + +.fa-smile-wink:before { + content: "\f4da"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-smoking-ban:before { + content: "\f54d"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-socks:before { + content: "\f696"; } + +.fa-solar-panel:before { + content: "\f5ba"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-spa:before { + content: "\f5bb"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spider:before { + content: "\f717"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-splotch:before { + content: "\f5bc"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-spray-can:before { + content: "\f5bd"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-square-root-alt:before { + content: "\f698"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-stamp:before { + content: "\f5bf"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-and-crescent:before { + content: "\f699"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-star-half-alt:before { + content: "\f5c0"; } + +.fa-star-of-david:before { + content: "\f69a"; } + +.fa-star-of-life:before { + content: "\f621"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-store:before { + content: "\f54e"; } + +.fa-store-alt:before { + content: "\f54f"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-stream:before { + content: "\f550"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-stroopwafel:before { + content: "\f551"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-suitcase-rolling:before { + content: "\f5c1"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-surprise:before { + content: "\f5c2"; } + +.fa-swatchbook:before { + content: "\f5c3"; } + +.fa-swimmer:before { + content: "\f5c4"; } + +.fa-swimming-pool:before { + content: "\f5c5"; } + +.fa-synagogue:before { + content: "\f69b"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-teeth:before { + content: "\f62e"; } + +.fa-teeth-open:before { + content: "\f62f"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-theater-masks:before { + content: "\f630"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-tint-slash:before { + content: "\f5c7"; } + +.fa-tired:before { + content: "\f5c8"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-toilet-paper:before { + content: "\f71e"; } + +.fa-toolbox:before { + content: "\f552"; } + +.fa-tooth:before { + content: "\f5c9"; } + +.fa-torah:before { + content: "\f6a0"; } + +.fa-torii-gate:before { + content: "\f6a1"; } + +.fa-tractor:before { + content: "\f722"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-traffic-light:before { + content: "\f637"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-monster:before { + content: "\f63b"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-truck-pickup:before { + content: "\f63c"; } + +.fa-tshirt:before { + content: "\f553"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-umbrella-beach:before { + content: "\f5ca"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-alt:before { + content: "\f406"; } + +.fa-user-alt-slash:before { + content: "\f4fa"; } + +.fa-user-astronaut:before { + content: "\f4fb"; } + +.fa-user-check:before { + content: "\f4fc"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-clock:before { + content: "\f4fd"; } + +.fa-user-cog:before { + content: "\f4fe"; } + +.fa-user-edit:before { + content: "\f4ff"; } + +.fa-user-friends:before { + content: "\f500"; } + +.fa-user-graduate:before { + content: "\f501"; } + +.fa-user-injured:before { + content: "\f728"; } + +.fa-user-lock:before { + content: "\f502"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-minus:before { + content: "\f503"; } + +.fa-user-ninja:before { + content: "\f504"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-shield:before { + content: "\f505"; } + +.fa-user-slash:before { + content: "\f506"; } + +.fa-user-tag:before { + content: "\f507"; } + +.fa-user-tie:before { + content: "\f508"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-users-cog:before { + content: "\f509"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-vector-square:before { + content: "\f5cb"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vihara:before { + content: "\f6a7"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-mute:before { + content: "\f6a9"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-walking:before { + content: "\f554"; } + +.fa-wallet:before { + content: "\f555"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weight-hanging:before { + content: "\f5cd"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wind:before { + content: "\f72e"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-bottle:before { + content: "\f72f"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-wine-glass-alt:before { + content: "\f5ce"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yin-yang:before { + content: "\f6ad"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } + +.fab { + font-family: 'Font Awesome 5 Brands'; } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css new file mode 100644 index 000000000..3156b8c7c --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css @@ -0,0 +1,3954 @@ +/*! + * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } +.fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-acquisitions-incorporated:before { + content: "\f6af"; } + +.fa-ad:before { + content: "\f641"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-air-freshener:before { + content: "\f5d0"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angry:before { + content: "\f556"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-ankh:before { + content: "\f644"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-alt:before { + content: "\f5d1"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-archway:before { + content: "\f557"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-atlas:before { + content: "\f558"; } + +.fa-atom:before { + content: "\f5d2"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-award:before { + content: "\f559"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backspace:before { + content: "\f55a"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bezier-curve:before { + content: "\f55b"; } + +.fa-bible:before { + content: "\f647"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blender:before { + content: "\f517"; } + +.fa-blender-phone:before { + content: "\f6b6"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-bone:before { + content: "\f5d7"; } + +.fa-bong:before { + content: "\f55c"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-book-dead:before { + content: "\f6b7"; } + +.fa-book-open:before { + content: "\f518"; } + +.fa-book-reader:before { + content: "\f5da"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-brain:before { + content: "\f5dc"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-broadcast-tower:before { + content: "\f519"; } + +.fa-broom:before { + content: "\f51a"; } + +.fa-brush:before { + content: "\f55d"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-bus-alt:before { + content: "\f55e"; } + +.fa-business-time:before { + content: "\f64a"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-campground:before { + content: "\f6bb"; } + +.fa-cannabis:before { + content: "\f55f"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-car-alt:before { + content: "\f5de"; } + +.fa-car-battery:before { + content: "\f5df"; } + +.fa-car-crash:before { + content: "\f5e1"; } + +.fa-car-side:before { + content: "\f5e4"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cat:before { + content: "\f6be"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chair:before { + content: "\f6c0"; } + +.fa-chalkboard:before { + content: "\f51b"; } + +.fa-chalkboard-teacher:before { + content: "\f51c"; } + +.fa-charging-station:before { + content: "\f5e7"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-double:before { + content: "\f560"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-church:before { + content: "\f51d"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-city:before { + content: "\f64f"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-moon:before { + content: "\f6c3"; } + +.fa-cloud-sun:before { + content: "\f6c4"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-cocktail:before { + content: "\f561"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-coins:before { + content: "\f51e"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dollar:before { + content: "\f651"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-comments-dollar:before { + content: "\f653"; } + +.fa-compact-disc:before { + content: "\f51f"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-concierge-bell:before { + content: "\f562"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-cookie:before { + content: "\f563"; } + +.fa-cookie-bite:before { + content: "\f564"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crop-alt:before { + content: "\f565"; } + +.fa-cross:before { + content: "\f654"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-crow:before { + content: "\f520"; } + +.fa-crown:before { + content: "\f521"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-dharmachakra:before { + content: "\f655"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-dice:before { + content: "\f522"; } + +.fa-dice-d20:before { + content: "\f6cf"; } + +.fa-dice-d6:before { + content: "\f6d1"; } + +.fa-dice-five:before { + content: "\f523"; } + +.fa-dice-four:before { + content: "\f524"; } + +.fa-dice-one:before { + content: "\f525"; } + +.fa-dice-six:before { + content: "\f526"; } + +.fa-dice-three:before { + content: "\f527"; } + +.fa-dice-two:before { + content: "\f528"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-digital-tachograph:before { + content: "\f566"; } + +.fa-directions:before { + content: "\f5eb"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-divide:before { + content: "\f529"; } + +.fa-dizzy:before { + content: "\f567"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dog:before { + content: "\f6d3"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-door-closed:before { + content: "\f52a"; } + +.fa-door-open:before { + content: "\f52b"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-drafting-compass:before { + content: "\f568"; } + +.fa-dragon:before { + content: "\f6d5"; } + +.fa-draw-polygon:before { + content: "\f5ee"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drum:before { + content: "\f569"; } + +.fa-drum-steelpan:before { + content: "\f56a"; } + +.fa-drumstick-bite:before { + content: "\f6d7"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dumbbell:before { + content: "\f44b"; } + +.fa-dungeon:before { + content: "\f6d9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-open-text:before { + content: "\f658"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-equals:before { + content: "\f52c"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-feather:before { + content: "\f52d"; } + +.fa-feather-alt:before { + content: "\f56b"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-contract:before { + content: "\f56c"; } + +.fa-file-csv:before { + content: "\f6dd"; } + +.fa-file-download:before { + content: "\f56d"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-export:before { + content: "\f56e"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-import:before { + content: "\f56f"; } + +.fa-file-invoice:before { + content: "\f570"; } + +.fa-file-invoice-dollar:before { + content: "\f571"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-prescription:before { + content: "\f572"; } + +.fa-file-signature:before { + content: "\f573"; } + +.fa-file-upload:before { + content: "\f574"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-fill:before { + content: "\f575"; } + +.fa-fill-drip:before { + content: "\f576"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fingerprint:before { + content: "\f577"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-fish:before { + content: "\f578"; } + +.fa-fist-raised:before { + content: "\f6de"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-flushed:before { + content: "\f579"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-minus:before { + content: "\f65d"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-folder-plus:before { + content: "\f65e"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frog:before { + content: "\f52e"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-frown-open:before { + content: "\f57a"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-funnel-dollar:before { + content: "\f662"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gas-pump:before { + content: "\f52f"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-ghost:before { + content: "\f6e2"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glass-martini-alt:before { + content: "\f57b"; } + +.fa-glasses:before { + content: "\f530"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-globe-africa:before { + content: "\f57c"; } + +.fa-globe-americas:before { + content: "\f57d"; } + +.fa-globe-asia:before { + content: "\f57e"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-gopuram:before { + content: "\f664"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-greater-than:before { + content: "\f531"; } + +.fa-greater-than-equal:before { + content: "\f532"; } + +.fa-grimace:before { + content: "\f57f"; } + +.fa-grin:before { + content: "\f580"; } + +.fa-grin-alt:before { + content: "\f581"; } + +.fa-grin-beam:before { + content: "\f582"; } + +.fa-grin-beam-sweat:before { + content: "\f583"; } + +.fa-grin-hearts:before { + content: "\f584"; } + +.fa-grin-squint:before { + content: "\f585"; } + +.fa-grin-squint-tears:before { + content: "\f586"; } + +.fa-grin-stars:before { + content: "\f587"; } + +.fa-grin-tears:before { + content: "\f588"; } + +.fa-grin-tongue:before { + content: "\f589"; } + +.fa-grin-tongue-squint:before { + content: "\f58a"; } + +.fa-grin-tongue-wink:before { + content: "\f58b"; } + +.fa-grin-wink:before { + content: "\f58c"; } + +.fa-grip-horizontal:before { + content: "\f58d"; } + +.fa-grip-vertical:before { + content: "\f58e"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-hammer:before { + content: "\f6e3"; } + +.fa-hamsa:before { + content: "\f665"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hanukiah:before { + content: "\f6e6"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hat-wizard:before { + content: "\f6e8"; } + +.fa-haykal:before { + content: "\f666"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-headphones-alt:before { + content: "\f58f"; } + +.fa-headset:before { + content: "\f590"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-helicopter:before { + content: "\f533"; } + +.fa-highlighter:before { + content: "\f591"; } + +.fa-hiking:before { + content: "\f6ec"; } + +.fa-hippo:before { + content: "\f6ed"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-horse:before { + content: "\f6f0"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hot-tub:before { + content: "\f593"; } + +.fa-hotel:before { + content: "\f594"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-house-damage:before { + content: "\f6f1"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-hryvnia:before { + content: "\f6f2"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-infinity:before { + content: "\f534"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jedi:before { + content: "\f669"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joint:before { + content: "\f595"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-journal-whills:before { + content: "\f66a"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-kaaba:before { + content: "\f66b"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-khanda:before { + content: "\f66d"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-kiss:before { + content: "\f596"; } + +.fa-kiss-beam:before { + content: "\f597"; } + +.fa-kiss-wink-heart:before { + content: "\f598"; } + +.fa-kiwi-bird:before { + content: "\f535"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-landmark:before { + content: "\f66f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laptop-code:before { + content: "\f5fc"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-laugh:before { + content: "\f599"; } + +.fa-laugh-beam:before { + content: "\f59a"; } + +.fa-laugh-squint:before { + content: "\f59b"; } + +.fa-laugh-wink:before { + content: "\f59c"; } + +.fa-layer-group:before { + content: "\f5fd"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-less-than:before { + content: "\f536"; } + +.fa-less-than-equal:before { + content: "\f537"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-luggage-cart:before { + content: "\f59d"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-mail-bulk:before { + content: "\f674"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-male:before { + content: "\f183"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marked:before { + content: "\f59f"; } + +.fa-map-marked-alt:before { + content: "\f5a0"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-marker:before { + content: "\f5a1"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-mask:before { + content: "\f6fa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medal:before { + content: "\f5a2"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-meh-blank:before { + content: "\f5a4"; } + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; } + +.fa-memory:before { + content: "\f538"; } + +.fa-menorah:before { + content: "\f676"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-alt:before { + content: "\f3c9"; } + +.fa-microphone-alt-slash:before { + content: "\f539"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microscope:before { + content: "\f610"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill:before { + content: "\f0d6"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-money-bill-wave:before { + content: "\f53a"; } + +.fa-money-bill-wave-alt:before { + content: "\f53b"; } + +.fa-money-check:before { + content: "\f53c"; } + +.fa-money-check-alt:before { + content: "\f53d"; } + +.fa-monument:before { + content: "\f5a6"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-mortar-pestle:before { + content: "\f5a7"; } + +.fa-mosque:before { + content: "\f678"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mountain:before { + content: "\f6fc"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-network-wired:before { + content: "\f6ff"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-not-equal:before { + content: "\f53e"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-oil-can:before { + content: "\f613"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-om:before { + content: "\f679"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-otter:before { + content: "\f700"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-paint-roller:before { + content: "\f5aa"; } + +.fa-palette:before { + content: "\f53f"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-parking:before { + content: "\f540"; } + +.fa-passport:before { + content: "\f5ab"; } + +.fa-pastafarianism:before { + content: "\f67b"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-peace:before { + content: "\f67c"; } + +.fa-pen:before { + content: "\f304"; } + +.fa-pen-alt:before { + content: "\f305"; } + +.fa-pen-fancy:before { + content: "\f5ac"; } + +.fa-pen-nib:before { + content: "\f5ad"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-pencil-ruler:before { + content: "\f5ae"; } + +.fa-penny-arcade:before { + content: "\f704"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-percentage:before { + content: "\f541"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-place-of-worship:before { + content: "\f67f"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-plane-arrival:before { + content: "\f5af"; } + +.fa-plane-departure:before { + content: "\f5b0"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poll:before { + content: "\f681"; } + +.fa-poll-h:before { + content: "\f682"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-poop:before { + content: "\f619"; } + +.fa-portrait:before { + content: "\f3e0"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-pray:before { + content: "\f683"; } + +.fa-praying-hands:before { + content: "\f684"; } + +.fa-prescription:before { + content: "\f5b1"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-project-diagram:before { + content: "\f542"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-quran:before { + content: "\f687"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-receipt:before { + content: "\f543"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-ring:before { + content: "\f70b"; } + +.fa-road:before { + content: "\f018"; } + +.fa-robot:before { + content: "\f544"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-route:before { + content: "\f4d7"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-ruler:before { + content: "\f545"; } + +.fa-ruler-combined:before { + content: "\f546"; } + +.fa-ruler-horizontal:before { + content: "\f547"; } + +.fa-ruler-vertical:before { + content: "\f548"; } + +.fa-running:before { + content: "\f70c"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-sad-cry:before { + content: "\f5b3"; } + +.fa-sad-tear:before { + content: "\f5b4"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-school:before { + content: "\f549"; } + +.fa-screwdriver:before { + content: "\f54a"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-scroll:before { + content: "\f70e"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-dollar:before { + content: "\f688"; } + +.fa-search-location:before { + content: "\f689"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-shapes:before { + content: "\f61f"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shoe-prints:before { + content: "\f54b"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-shuttle-van:before { + content: "\f5b6"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-signature:before { + content: "\f5b7"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-skull:before { + content: "\f54c"; } + +.fa-skull-crossbones:before { + content: "\f714"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-slash:before { + content: "\f715"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smile-beam:before { + content: "\f5b8"; } + +.fa-smile-wink:before { + content: "\f4da"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-smoking-ban:before { + content: "\f54d"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-socks:before { + content: "\f696"; } + +.fa-solar-panel:before { + content: "\f5ba"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-spa:before { + content: "\f5bb"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spider:before { + content: "\f717"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-splotch:before { + content: "\f5bc"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-spray-can:before { + content: "\f5bd"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-square-root-alt:before { + content: "\f698"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-stamp:before { + content: "\f5bf"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-and-crescent:before { + content: "\f699"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-star-half-alt:before { + content: "\f5c0"; } + +.fa-star-of-david:before { + content: "\f69a"; } + +.fa-star-of-life:before { + content: "\f621"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-store:before { + content: "\f54e"; } + +.fa-store-alt:before { + content: "\f54f"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-stream:before { + content: "\f550"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-stroopwafel:before { + content: "\f551"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-suitcase-rolling:before { + content: "\f5c1"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-surprise:before { + content: "\f5c2"; } + +.fa-swatchbook:before { + content: "\f5c3"; } + +.fa-swimmer:before { + content: "\f5c4"; } + +.fa-swimming-pool:before { + content: "\f5c5"; } + +.fa-synagogue:before { + content: "\f69b"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-teeth:before { + content: "\f62e"; } + +.fa-teeth-open:before { + content: "\f62f"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-theater-masks:before { + content: "\f630"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-tint-slash:before { + content: "\f5c7"; } + +.fa-tired:before { + content: "\f5c8"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-toilet-paper:before { + content: "\f71e"; } + +.fa-toolbox:before { + content: "\f552"; } + +.fa-tooth:before { + content: "\f5c9"; } + +.fa-torah:before { + content: "\f6a0"; } + +.fa-torii-gate:before { + content: "\f6a1"; } + +.fa-tractor:before { + content: "\f722"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-traffic-light:before { + content: "\f637"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-monster:before { + content: "\f63b"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-truck-pickup:before { + content: "\f63c"; } + +.fa-tshirt:before { + content: "\f553"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-umbrella-beach:before { + content: "\f5ca"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-alt:before { + content: "\f406"; } + +.fa-user-alt-slash:before { + content: "\f4fa"; } + +.fa-user-astronaut:before { + content: "\f4fb"; } + +.fa-user-check:before { + content: "\f4fc"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-clock:before { + content: "\f4fd"; } + +.fa-user-cog:before { + content: "\f4fe"; } + +.fa-user-edit:before { + content: "\f4ff"; } + +.fa-user-friends:before { + content: "\f500"; } + +.fa-user-graduate:before { + content: "\f501"; } + +.fa-user-injured:before { + content: "\f728"; } + +.fa-user-lock:before { + content: "\f502"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-minus:before { + content: "\f503"; } + +.fa-user-ninja:before { + content: "\f504"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-shield:before { + content: "\f505"; } + +.fa-user-slash:before { + content: "\f506"; } + +.fa-user-tag:before { + content: "\f507"; } + +.fa-user-tie:before { + content: "\f508"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-users-cog:before { + content: "\f509"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-vector-square:before { + content: "\f5cb"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vihara:before { + content: "\f6a7"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-mute:before { + content: "\f6a9"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-walking:before { + content: "\f554"; } + +.fa-wallet:before { + content: "\f555"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weight-hanging:before { + content: "\f5cd"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wind:before { + content: "\f72e"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-bottle:before { + content: "\f72f"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-wine-glass-alt:before { + content: "\f5ce"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yin-yang:before { + content: "\f6ad"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } + +.fab { + font-family: 'Font Awesome 5 Brands'; } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } + +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: normal; + src: url("../fontawesome-icons/fa-brands-400.eot"); + src: url("../fontawesome-icons/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../fontawesome-icons/fa-brands-400.woff2") format("woff2"), url("../fontawesome-icons/fa-brands-400.woff") format("woff"), url("../fontawesome-icons/fa-brands-400.ttf") format("truetype"), url("../fontawesome-icons/fa-brands-400.svg#fontawesome") format("svg"); } + + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 400; + src: url("../fontawesome-icons/fa-regular-400.eot"); + src: url("../fontawesome-icons/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../fontawesome-icons/fa-regular-400.woff2") format("woff2"), url("../fontawesome-icons/fa-regular-400.woff") format("woff"), url("../fontawesome-icons/fa-regular-400.ttf") format("truetype"), url("../fontawesome-icons/fa-regular-400.svg#fontawesome") format("svg"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + src: url("../fontawesome-icons/fa-solid-900.eot"); + src: url("../fontawesome-icons/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../fontawesome-icons/fa-solid-900.woff2") format("woff2"), url("../fontawesome-icons/fa-solid-900.woff") format("woff"), url("../fontawesome-icons/fa-solid-900.ttf") format("truetype"), url("../fontawesome-icons/fa-solid-900.svg#fontawesome") format("svg"); } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css new file mode 100644 index 000000000..a591cabf8 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */.fa-fw,.fa-li{text-align:center}.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.fab{font-family:'Font Awesome 5 Brands'}.fa,.far,.fas{font-family:'Font Awesome 5 Free'}.far{font-weight:400}.fa,.fas{font-weight:900}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;src:url(../fontawesome-icons/fa-brands-400.eot);src:url(../fontawesome-icons/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-brands-400.woff2) format("woff2"),url(../fontawesome-icons/fa-brands-400.woff) format("woff"),url(../fontawesome-icons/fa-brands-400.ttf) format("truetype"),url(../fontawesome-icons/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;src:url(../fontawesome-icons/fa-regular-400.eot);src:url(../fontawesome-icons/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-regular-400.woff2) format("woff2"),url(../fontawesome-icons/fa-regular-400.woff) format("woff"),url(../fontawesome-icons/fa-regular-400.ttf) format("truetype"),url(../fontawesome-icons/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;src:url(../fontawesome-icons/fa-solid-900.eot);src:url(../fontawesome-icons/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-solid-900.woff2) format("woff2"),url(../fontawesome-icons/fa-solid-900.woff) format("woff"),url(../fontawesome-icons/fa-solid-900.ttf) format("truetype"),url(../fontawesome-icons/fa-solid-900.svg#fontawesome) format("svg")} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.eot b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..c3bbd1cee36cbb8fb6daa0a9a725da1620cec159 GIT binary patch literal 123540 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.svg b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.svg new file mode 100644 index 000000000..ae0b39eef --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.svg @@ -0,0 +1,1175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.ttf b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..867f408c5afcfc97d0ed1c77450ee97f2d727e7e GIT binary patch literal 123304 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�eO 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.woff b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..87d28af1683e584c013737c49ca4f9bcee87fa73 GIT binary patch literal 79752 zcmV)hK%>8RPew)n0RR910XK*M3jhEB0pX|s0RR91000000000000000000000000- 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 Ol{Y6&`~Z<}PnrO~tXV+- literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.woff2 b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-brands-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e97785f2d5775bc965cc77338cd7a1be702df711 GIT binary patch literal 68240 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.eot b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..fba135e664945e987c0df4f180aba4e916aaec8e GIT binary patch literal 40576 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 RxyQZ__A)m$GXaME{{l)qau)yq literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.svg b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.svg new file mode 100644 index 000000000..008584337 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.svg @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.ttf b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc5e311b320b6e2b41d2b61f94dcbe10d892ade4 GIT binary patch literal 40348 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 T`m8wj+V{a;=B8#Qz_9;crvO%2 literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.woff b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..0c01e47a5b83268624426c9025fc628aa121bae7 GIT binary patch literal 18168 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.woff2 b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dbf3a76cc38372554f9a43387e22ef322b1bd829 GIT binary patch literal 14880 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 P=3fsFQR~8Y0igc@-rukO literal 0 HcmV?d00001 diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.eot b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.eot new file mode 100644 index 0000000000000000000000000000000000000000..ccdfcf1e55f5c58d8a187f0d9f6cce33d96e58ea GIT binary patch literal 191332 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.ttf b/src/main/resources/gwt/material/design/incubator/public/fontawesome-icons/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4c04632bac7652766144fedc875c38416eee6c9d GIT binary patch literal 191112 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

Hz(7 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%0D;Qj`#Wac18+F(07d{lR9IOiRYK>`-n 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�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 RRHl%Bj(@x Date: Sat, 20 Oct 2018 10:12:33 +0800 Subject: [PATCH 052/247] Separate FontAwesomeDebugResources.gwt and FontAwesomeResources.gwt --- .../FontAwesomeDebugResources.gwt.xml | 34 +++++++++++++++++++ .../incubator/FontAwesomeResources.gwt.xml | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/gwt/material/design/incubator/FontAwesomeDebugResources.gwt.xml diff --git a/src/main/resources/gwt/material/design/incubator/FontAwesomeDebugResources.gwt.xml b/src/main/resources/gwt/material/design/incubator/FontAwesomeDebugResources.gwt.xml new file mode 100644 index 000000000..f4525af96 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/FontAwesomeDebugResources.gwt.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff --git a/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml b/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml index f4525af96..327d9ad5d 100644 --- a/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml +++ b/src/main/resources/gwt/material/design/incubator/FontAwesomeResources.gwt.xml @@ -30,5 +30,5 @@ - + From 5e6afc8da7ddb4225a76da0f4a544613d2ab2c31 Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Mon, 22 Oct 2018 05:32:47 +0800 Subject: [PATCH 053/247] Remove unselect for now --- .../material/design/addins/client/combobox/MaterialComboBox.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 7c736700e..85890e468 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -201,7 +201,6 @@ public void reload() { public void reset() { super.reset(); displayArrowForAllowClearOption(false); - unselect(); } @Override From 8460cc610170a7ab51e502d4faf5fac49c3a7b7f Mon Sep 17 00:00:00 2001 From: "mark.baldemor" Date: Tue, 6 Nov 2018 21:09:24 +0800 Subject: [PATCH 054/247] WIP - Async widgets --- .../client/combobox/MaterialComboBox.java | 85 +++++++++++++++++-- .../async/DefaultComboBoxDisplayLoader.java | 47 ++++++++++ .../resources/css/language-selector.css | 2 +- .../resources/css/language-selector.min.css | 2 +- 4 files changed, 127 insertions(+), 9 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 85890e468..7a3f5eea2 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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,6 +28,7 @@ import com.google.gwt.user.client.ui.Widget; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.combobox.async.DefaultComboBoxDisplayLoader; import gwt.material.design.addins.client.combobox.base.HasUnselectItemHandler; import gwt.material.design.addins.client.combobox.events.ComboBoxEvents; import gwt.material.design.addins.client.combobox.events.SelectItemEvent; @@ -38,8 +39,15 @@ import gwt.material.design.addins.client.combobox.js.options.Data; import gwt.material.design.addins.client.combobox.js.options.Params; import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.async.AsyncWidgetCallback; +import gwt.material.design.client.async.IsAsyncWidget; +import gwt.material.design.client.async.loader.AsyncDisplayLoader; +import gwt.material.design.client.async.mixin.AsyncWidgetMixin; import gwt.material.design.client.base.*; -import gwt.material.design.client.base.mixin.*; +import gwt.material.design.client.base.mixin.EnabledMixin; +import gwt.material.design.client.base.mixin.FieldTypeMixin; +import gwt.material.design.client.base.mixin.ReadOnlyMixin; +import gwt.material.design.client.base.mixin.StatusTextMixin; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.FieldType; import gwt.material.design.client.ui.MaterialLabel; @@ -84,7 +92,7 @@ */ //@formatter:on public class MaterialComboBox extends AbstractValueWidget> implements JsLoader, HasPlaceholder, - HasOpenHandlers, HasCloseHandlers, HasUnselectItemHandler, HasReadOnly, HasFieldTypes { + HasOpenHandlers, HasCloseHandlers, HasUnselectItemHandler, HasReadOnly, HasFieldTypes, IsAsyncWidget> { static { if (MaterialAddins.isDebug()) { @@ -109,9 +117,12 @@ public class MaterialComboBox extends AbstractValueWidget> implements private ReadOnlyMixin readOnlyMixin; private EnabledMixin enabledMixin; private FieldTypeMixin fieldTypeMixin; + private AsyncWidgetMixin> asyncWidgetMixin; public MaterialComboBox() { super(Document.get().createDivElement(), CssName.INPUT_FIELD, AddinsCssName.COMBOBOX); + + setAsyncDisplayLoader(new DefaultComboBoxDisplayLoader(this)); } @Override @@ -155,7 +166,15 @@ public void load() { }); jsComboBox.on(ComboBoxEvents.OPEN, (event1, o) -> { - OpenEvent.fire(this, null); + + if (isAsynchronous()) { + event1.stopPropagation(); + event1.preventDefault(); + load(getAsyncCallback()); + } else { + OpenEvent.fire(this, null); + } + return true; }); @@ -524,7 +543,7 @@ public void setValue(List values, boolean fireEvents) { reset(); if (fireEvents) { - ValueChangeEvent.fire(this, null); + ValueChangeEvent.fire(this, null); } } else if (!isMultiple()) { if (!values.isEmpty()) { @@ -801,6 +820,51 @@ public void setFieldWidth(double percentWidth) { getFieldTypeMixin().setFieldWidth(percentWidth); } + @Override + public void setAsynchronous(boolean asynchronous) { + getAsyncWidgetMixin().setAsynchronous(asynchronous); + } + + @Override + public boolean isAsynchronous() { + return getAsyncWidgetMixin().isAsynchronous(); + } + + @Override + public void load(AsyncWidgetCallback> asyncCallback) { + getAsyncWidgetMixin().load(asyncCallback); + } + + @Override + public void setLoaded(boolean loaded) { + getAsyncWidgetMixin().setLoaded(loaded); + } + + @Override + public boolean isLoaded() { + return getAsyncWidgetMixin().isLoaded(); + } + + @Override + public void setAsyncCallback(AsyncWidgetCallback> asyncCallback) { + getAsyncWidgetMixin().setAsyncCallback(asyncCallback); + } + + @Override + public AsyncWidgetCallback> getAsyncCallback() { + return getAsyncWidgetMixin().getAsyncCallback(); + } + + @Override + public void setAsyncDisplayLoader(AsyncDisplayLoader displayLoader) { + getAsyncWidgetMixin().setAsyncDisplayLoader(displayLoader); + } + + @Override + public AsyncDisplayLoader getAsyncDisplayLoader() { + return getAsyncWidgetMixin().getAsyncDisplayLoader(); + } + public HandlerRegistration addSelectionHandler(SelectItemEvent.SelectComboHandler selectionHandler) { return addHandler(selectionHandler, SelectItemEvent.getType()); } @@ -843,10 +907,17 @@ public ReadOnlyMixin getReadOnlyMixin() { return readOnlyMixin; } - protected FieldTypeMixin getFieldTypeMixin() { + public FieldTypeMixin getFieldTypeMixin() { if (fieldTypeMixin == null) { fieldTypeMixin = new FieldTypeMixin<>(this); } return fieldTypeMixin; } + + public AsyncWidgetMixin> getAsyncWidgetMixin() { + if (asyncWidgetMixin == null) { + asyncWidgetMixin = new AsyncWidgetMixin<>(this); + } + return asyncWidgetMixin; + } } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java b/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java new file mode 100644 index 000000000..864e20c7d --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java @@ -0,0 +1,47 @@ +package gwt.material.design.addins.client.combobox.async; + +import gwt.material.design.addins.client.combobox.MaterialComboBox; +import gwt.material.design.client.async.loader.AsyncDisplayLoader; +import gwt.material.design.client.constants.LoaderType; +import gwt.material.design.client.ui.MaterialLoader; +import gwt.material.design.client.ui.MaterialToast; + +import java.util.List; + +public class DefaultComboBoxDisplayLoader implements AsyncDisplayLoader> { + + private MaterialComboBox comboBox; + private MaterialLoader loader; + + public DefaultComboBoxDisplayLoader(MaterialComboBox comboBox) { + this.comboBox = comboBox; + + setupLoader(); + } + + protected void setupLoader() { + loader = new MaterialLoader(); + loader.setType(LoaderType.PROGRESS); + loader.setContainer(comboBox); + } + + @Override + public void loading() { + loader.show(); + } + + @Override + public void success(List result) { + MaterialToast.fireToast(result.size() + " SIZE"); + } + + @Override + public void failure(String error) { + + } + + @Override + public void finalize() { + loader.hide(); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css b/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css index 8d1ed98fb..a74548711 100644 --- a/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css +++ b/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.css @@ -1,5 +1,5 @@ .language-selector { - padding: 0 15px; + padding: 0 24px; display: flex; align-items: center; height: 64px; diff --git a/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.min.css b/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.min.css index c3e673927..ae73714c8 100644 --- a/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/language/resources/css/language-selector.min.css @@ -1 +1 @@ -.language-selector{padding:0 15px;display:flex;align-items:center;height:64px;position:relative}.language-selector.single-language ul.dropdown-content{visibility:hidden}.language-selector.single-language .language-activator{cursor:default!important;margin-top:-12px}.language-selector .language-activator span:before{content:"";width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #fff;position:absolute;top:28px;right:24px}.language-selector.single-language .language-activator span:before{display:none}.language-selector img{width:2rem;height:2rem}nav .language-selector .language-activator{padding-right:36px;padding-left:16px}nav .language-selector .language-activator span{line-height:64px}nav .language-selector .dropdown-content{margin-top:16px}.language-selector img.language-activator{border:2px solid #fff;border-radius:100%;cursor:pointer}.language-selector .dropdown-content{min-width:160px}.language-selector .dropdown-content li{min-height:40px}.language-selector .dropdown-content li img{height:auto}.language-selector .language-selector-item{margin:0;padding:8px 8px 4px}.language-selector .language-selector-item a:hover{background:0 0} \ No newline at end of file +.language-selector{padding:0 24px;display:flex;align-items:center;height:64px;position:relative}.language-selector.single-language ul.dropdown-content{visibility:hidden}.language-selector.single-language .language-activator{cursor:default!important;margin-top:-12px}.language-selector .language-activator span:before{content:"";width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #fff;position:absolute;top:28px;right:24px}.language-selector.single-language .language-activator span:before{display:none}.language-selector img{width:2rem;height:2rem}nav .language-selector .language-activator{padding-right:36px;padding-left:16px}nav .language-selector .language-activator span{line-height:64px}nav .language-selector .dropdown-content{margin-top:16px}.language-selector img.language-activator{border:2px solid #fff;border-radius:100%;cursor:pointer}.language-selector .dropdown-content{min-width:160px}.language-selector .dropdown-content li{min-height:40px}.language-selector .dropdown-content li img{height:auto}.language-selector .language-selector-item{margin:0;padding:8px 8px 4px}.language-selector .language-selector-item a:hover{background:0 0} \ No newline at end of file From b724e2183137a4efd6d9bd05da2a2d136296f9d1 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 17 Nov 2018 06:19:39 +0800 Subject: [PATCH 055/247] Introduction to Async Widgets (WIP) --- .../client/combobox/MaterialComboBox.java | 6 +- .../async/DefaultComboBoxDisplayLoader.java | 19 ++ .../client/async/AbstractAsyncButton.java | 175 ------------------ .../incubator/client/async/AsyncButton.java | 57 ------ .../client/async/AsyncClientBundle.java | 31 ---- .../client/async/AsyncDebugClientBundle.java | 31 ---- .../incubator/client/async/AsyncIcon.java | 36 ---- .../client/async/events/ErrorEvent.java | 57 ------ .../client/async/events/HasAsyncHandlers.java | 29 --- .../client/async/events/LoadingEvent.java | 57 ------ .../client/async/events/SuccessEvent.java | 57 ------ .../async/resources/css/async-button.css | 36 ---- .../async/resources/css/async-button.min.css | 24 --- 13 files changed, 22 insertions(+), 593 deletions(-) delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/AsyncClientBundle.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/AsyncDebugClientBundle.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java delete mode 100644 src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css delete mode 100644 src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 7a3f5eea2..41bcb0290 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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. @@ -920,4 +920,4 @@ public AsyncWidgetMixin> getAsyncWidgetMixin() { } return asyncWidgetMixin; } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java b/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java index 864e20c7d..7c99ffd30 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.combobox.async; import gwt.material.design.addins.client.combobox.MaterialComboBox; diff --git a/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java b/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java deleted file mode 100644 index d8a771d2e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/AbstractAsyncButton.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async; - -import gwt.material.design.client.MaterialDesignBase; -import gwt.material.design.client.base.AbstractIconButton; -import gwt.material.design.client.base.HasActive; -import gwt.material.design.client.base.mixin.ActiveMixin; -import gwt.material.design.client.constants.IconPosition; -import gwt.material.design.client.constants.IconType; -import gwt.material.design.client.ui.html.Icon; -import gwt.material.design.incubator.client.AddinsIncubator; -import gwt.material.design.incubator.client.async.events.ErrorEvent; -import gwt.material.design.incubator.client.async.events.HasAsyncHandlers; -import gwt.material.design.incubator.client.async.events.LoadingEvent; -import gwt.material.design.incubator.client.async.events.SuccessEvent; -import gwt.material.design.incubator.client.base.IncubatorWidget; - -//@formatter:off - -/** - * Asynchronous buttons are components that is good ux for - * calling the server side component and automatically updates - * the states of the ui logic. - *

- *

- * Note: This component is under the incubation process and subject to change. - *

- *

XML Namespace Declaration

- * - * @author kevzlou7979 - */ -public abstract class AbstractAsyncButton extends AbstractIconButton - implements HasActive, HasAsyncHandlers { - - static { - IncubatorWidget.showWarning(AbstractAsyncButton.class); - if (AddinsIncubator.isDebug()) { - MaterialDesignBase.injectCss(AsyncDebugClientBundle.INSTANCE.asyncButtonDebugCss()); - } else { - MaterialDesignBase.injectCss(AsyncClientBundle.INSTANCE.asyncButtonCss()); - } - } - - protected ActiveMixin activeMixin; - protected IconType initialIcon; - protected String initialMessage; - protected IconType loadingIcon = IconType.AUTORENEW; - protected IconType errorIcon = IconType.WARNING; - protected IconType successIcon = IconType.CHECK; - - protected AbstractAsyncButton() { - super(); - } - - public AbstractAsyncButton(String className) { - super(className, ""); - - setIconPosition(IconPosition.LEFT); - } - - @Override - protected void onLoad() { - super.onLoad(); - } - - public void loading(String message) { - setActive(true); - setIconType(loadingIcon); - setEnabled(false); - LoadingEvent.fire(this); - } - - public void error(String message) { - setActive(false); - setIconType(errorIcon); - setEnabled(true); - ErrorEvent.fire(this); - } - - public void success(String message) { - setActive(false); - setIconType(successIcon); - setEnabled(true); - SuccessEvent.fire(this); - } - - public void reset(IconType iconType) { - reset(iconType, null); - } - - public void reset(String message) { - reset(null, message); - } - - public void reset(IconType iconType, String message) { - setActive(true); - - if (iconType != null) setIconType(iconType); - if (message != null) setText(message); - } - - @Override - public void setActive(boolean value) { - getActiveMixin().setActive(value); - } - - @Override - public boolean isActive() { - return getActiveMixin().isActive(); - } - - public ActiveMixin getActiveMixin() { - if (activeMixin == null) { - activeMixin = new ActiveMixin<>(this); - } - return activeMixin; - } - - public IconType getLoadingIcon() { - return loadingIcon; - } - - public void setLoadingIcon(IconType loadingIcon) { - this.loadingIcon = loadingIcon; - } - - public IconType getErrorIcon() { - return errorIcon; - } - - public void setErrorIcon(IconType errorIcon) { - this.errorIcon = errorIcon; - } - - public IconType getSuccessIcon() { - return successIcon; - } - - public void setSuccessIcon(IconType successIcon) { - this.successIcon = successIcon; - } - - @Override - public void addLoadingHandler(LoadingEvent.LoadingHandler handler) { - addHandler(handler, LoadingEvent.getType()); - } - - @Override - public void addErrorHandler(ErrorEvent.ErrorHandler handler) { - addHandler(handler, ErrorEvent.getType()); - } - - @Override - public void addSuccessHandler(SuccessEvent.SuccessHandler handler) { - addHandler(handler, SuccessEvent.getType()); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java deleted file mode 100644 index f9dadf59d..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncButton.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async; - -import com.google.gwt.dom.client.Document; -import com.google.gwt.dom.client.Element; -import gwt.material.design.client.constants.ButtonType; -import gwt.material.design.incubator.client.base.constants.IncubatorCssName; - -public class AsyncButton extends AbstractAsyncButton { - - public AsyncButton() { - super(IncubatorCssName.ASYNC_BUTTON); - - setType(ButtonType.RAISED); - } - - @Override - public void loading(String message) { - super.loading(message); - setText(message); - } - - @Override - public void success(String message) { - super.success(message); - setText(message); - } - - @Override - public void error(String message) { - super.error(message); - setText(message); - } - - @Override - protected Element createElement() { - return Document.get().createPushButtonElement(); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncClientBundle.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncClientBundle.java deleted file mode 100644 index aa025c35b..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncClientBundle.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.TextResource; - -public interface AsyncClientBundle extends ClientBundle { - AsyncClientBundle INSTANCE = GWT.create(AsyncClientBundle.class); - - @Source("resources/css/async-button.min.css") - TextResource asyncButtonCss(); -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncDebugClientBundle.java deleted file mode 100644 index b39a37729..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncDebugClientBundle.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.TextResource; - -public interface AsyncDebugClientBundle extends ClientBundle { - AsyncDebugClientBundle INSTANCE = GWT.create(AsyncDebugClientBundle.class); - - @Source("resources/css/async-button.css") - TextResource asyncButtonDebugCss(); -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java b/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java deleted file mode 100644 index 551e33881..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/AsyncIcon.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async; - -import com.google.gwt.dom.client.Document; -import com.google.gwt.dom.client.Element; -import gwt.material.design.incubator.client.base.constants.IncubatorCssName; - -public class AsyncIcon extends AbstractAsyncButton { - - public AsyncIcon() { - super(IncubatorCssName.ASYNC_ICON); - } - - @Override - protected Element createElement() { - return Document.get().createElement("i"); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java b/src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java deleted file mode 100644 index 35a149682..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/events/ErrorEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async.events; - -import com.google.gwt.event.shared.EventHandler; -import com.google.gwt.event.shared.GwtEvent; -import com.google.gwt.event.shared.HasHandlers; -//@formatter:off - -/** - * @author kevzlou7979 - */ -public class ErrorEvent extends GwtEvent { - - public static final Type TYPE = new Type<>(); - - public ErrorEvent() {} - - public static Type getType() { - return TYPE; - } - - public static void fire(HasHandlers source) { - source.fireEvent(new ErrorEvent()); - } - - @Override - public Type getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(ErrorHandler handler) { - handler.onError(this); - } - - public interface ErrorHandler extends EventHandler { - void onError(ErrorEvent event); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java b/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java deleted file mode 100644 index 92ef9fba5..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/events/HasAsyncHandlers.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async.events; - -public interface HasAsyncHandlers { - - void addLoadingHandler(LoadingEvent.LoadingHandler handler); - - void addErrorHandler(ErrorEvent.ErrorHandler handler); - - void addSuccessHandler(SuccessEvent.SuccessHandler handler); -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java b/src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java deleted file mode 100644 index 6bf45e9de..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/events/LoadingEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async.events; - -import com.google.gwt.event.shared.EventHandler; -import com.google.gwt.event.shared.GwtEvent; -import com.google.gwt.event.shared.HasHandlers; -//@formatter:off - -/** - * @author kevzlou7979 - */ -public class LoadingEvent extends GwtEvent { - - public static final Type TYPE = new Type<>(); - - public LoadingEvent() {} - - public static Type getType() { - return TYPE; - } - - public static void fire(HasHandlers source) { - source.fireEvent(new LoadingEvent()); - } - - @Override - public Type getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(LoadingHandler handler) { - handler.onLoading(this); - } - - public interface LoadingHandler extends EventHandler { - void onLoading(LoadingEvent event); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java b/src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java deleted file mode 100644 index 2e38c18d5..000000000 --- a/src/main/java/gwt/material/design/incubator/client/async/events/SuccessEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.async.events; - -import com.google.gwt.event.shared.EventHandler; -import com.google.gwt.event.shared.GwtEvent; -import com.google.gwt.event.shared.HasHandlers; -//@formatter:off - -/** - * @author kevzlou7979 - */ -public class SuccessEvent extends GwtEvent { - - public static final Type TYPE = new Type<>(); - - public SuccessEvent() {} - - public static Type getType() { - return TYPE; - } - - public static void fire(HasHandlers source) { - source.fireEvent(new SuccessEvent()); - } - - @Override - public Type getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(SuccessHandler handler) { - handler.onSuccess(this); - } - - public interface SuccessHandler extends EventHandler { - void onSuccess(SuccessEvent event); - } -} diff --git a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css b/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css deleted file mode 100644 index aec967d9c..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.css +++ /dev/null @@ -1,36 +0,0 @@ -.async-button.active { - background: white; - position: relative; - padding-left: 60px; - transition: 0.4s all; -} - -.async-button .spinner-layer, .async-icon .spinner-layer { - display: none; - position: absolute; - width: 20px; - height: 20px; - z-index: 1003; -} - -.async-button .spinner-layer { - top: 8px; - left: 20px; -} - -.async-button.active .spinner-layer, .async-icon.active .spinner-layer { - display: block; -} - -.async-button.active i, .async-button.active span { - color: black !important; -} - -.async-icon.active { - position: relative; -} - -.async-icon .spinner-layer { - top: -8px; - left: 2px; -} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css b/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css deleted file mode 100644 index 6136bd315..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/async/resources/css/async-button.min.css +++ /dev/null @@ -1,24 +0,0 @@ -.async-icon.active i, .async-button.active i { - -webkit-animation: spin 400ms linear infinite; - -moz-animation: spin 400ms linear infinite; - animation: spin 400ms linear infinite; -} - -@-moz-keyframes spin { - 100% { - -moz-transform: rotate(360deg); - } -} - -@-webkit-keyframes spin { - 100% { - -webkit-transform: rotate(360deg); - } -} - -@keyframes spin { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} \ No newline at end of file From 635eaf5a482f98905b5a695f871a7444eb492b12 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 19 Nov 2018 07:23:45 +0800 Subject: [PATCH 056/247] Recent updates on Image ALT Accessibility --- .../client/sideprofile/MaterialSideProfile.java | 12 ++++++++++++ .../design/addins/client/tree/MaterialTreeItem.java | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/main/java/gwt/material/design/addins/client/sideprofile/MaterialSideProfile.java b/src/main/java/gwt/material/design/addins/client/sideprofile/MaterialSideProfile.java index 02fa38ed6..170c30442 100644 --- a/src/main/java/gwt/material/design/addins/client/sideprofile/MaterialSideProfile.java +++ b/src/main/java/gwt/material/design/addins/client/sideprofile/MaterialSideProfile.java @@ -70,6 +70,7 @@ public class MaterialSideProfile extends AbstractValueWidget implements } } + private String alt; private String url; private ImageResource resource; @@ -110,6 +111,17 @@ public ImageResource getResource() { return resource; } + @Override + public void setAlt(String alt) { + this.alt = alt; + getElement().setAttribute("alt", alt); + } + + @Override + public String getAlt() { + return alt; + } + protected void applyBackground(String url) { getElement().setAttribute("style", "background-image: url(" + url + "); background-size: cover;"); } diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeItem.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeItem.java index afba201ef..51f3d3c99 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeItem.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeItem.java @@ -162,6 +162,16 @@ public ImageResource getResource() { return image.getResource(); } + @Override + public void setAlt(String alt) { + image.setAlt(alt); + } + + @Override + public String getAlt() { + return image.getAlt(); + } + public MaterialWidget getDivHeader() { return divHeader; } From 9810baa36564e761d3b29ce8a012105bac2ff268 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 19 Nov 2018 20:47:05 +0800 Subject: [PATCH 057/247] Added setSingleValue(T value, boolean fireevents) on GroupToggleButton (Incubator) --- .../client/toggle/GroupToggleButton.java | 26 ++++++++ .../resources/css/group-toggle-button.css | 4 ++ .../resources/css/group-toggle-button.min.css | 62 +------------------ 3 files changed, 31 insertions(+), 61 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java index 104acd9fb..2eef1d29c 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java @@ -33,8 +33,10 @@ import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; +import gwt.material.design.jscore.client.api.Array; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; //@formatter:off @@ -175,6 +177,14 @@ public T getSingleValue() { return values.get(getSelectedIndexes().get(0)); } + public void setSingleValue(T value) { + setSingleValue(value, false); + } + + public void setSingleValue(T value, boolean fireEvents) { + setValue(Arrays.asList(value), fireEvents); + } + public void selectAll() { for (ToggleButton mButton : items) { mButton.setToggle(true); @@ -187,6 +197,22 @@ public void clearAll() { } } + @Override + public void setValue(List value) { + setValue(value, false); + } + + @Override + public void setValue(List value, boolean fireEvents) { + super.setValue(value, fireEvents); + + value.forEach(t -> { + if (values.contains(t)) { + setActive(values.indexOf(t)); + } + }); + } + public boolean isMultiple() { return multiple; } diff --git a/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.css b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.css index fff4b9802..5888b9031 100644 --- a/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.css +++ b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.css @@ -23,6 +23,10 @@ font-size: 0.7em; } +.group-toggle-button .wrapper button:hover { + color: white; +} + .group-toggle-button button { background: #fff; color: #4a4a4a; diff --git a/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.min.css b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.min.css index 68a2ec83d..ecee2a11d 100644 --- a/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button.min.css @@ -1,61 +1 @@ -/** BudgetGroup Toggle **/ -.group-toggle-button label:first-child { - top: 0px; - font-size: 0.8em; -} - -.group-toggle-button { - margin-bottom: 16px; -} - -.group-toggle-button .wrapper { - margin-top: 20px; - background: white; - display: inline-block; - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important; - -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important; - -moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important; -} - -.group-toggle-button .wrapper button { - cursor: pointer; - border-right: 1px solid #e9e9e9; - font-size: 0.7em; -} - -.group-toggle-button button { - background: #fff; - color: #4a4a4a; -} - -.group-toggle-button button.active { - background: #2196F3; - color: #fff; -} - -/** Error / Success styles **/ -.group-toggle-button.field-error, -.group-toggle-button.field-success { - border-bottom: none !important; - -webkit-box-shadow: none !important; - -moz-box-shadow: none !important; - box-shadow: none !important; -} - -.group-toggle-button.field-error label { - color: #F44336; -} - -.group-toggle-button.field-success label { - color: #4CAF50; -} - -.group-toggle-button span.field-error-label, -.group-toggle-button span.field-success-label { - margin-top: 12px; -} - -.group-toggle-button .field-error-label, -.group-toggle-button .field-success-label { - margin-top: 12px; -} +.group-toggle-button label:first-child{top:0;font-size:.8em}.group-toggle-button{margin-bottom:16px}.group-toggle-button .wrapper{margin-top:20px;background:#fff;display:inline-block;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)!important;-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)!important;-moz-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)!important}.group-toggle-button .wrapper button{cursor:pointer;border-right:1px solid #e9e9e9;font-size:.7em}.group-toggle-button .wrapper button:hover{color:#fff}.group-toggle-button button{background:#fff;color:#4a4a4a}.group-toggle-button button.active{background:#2196F3;color:#fff}.group-toggle-button.field-error,.group-toggle-button.field-success{border:none}.group-toggle-button .field-error-label,.group-toggle-button .field-success-label,.group-toggle-button span.field-error-label,.group-toggle-button span.field-success-label{margin-top:16px} \ No newline at end of file From 47a977b820dd3ae37e03d9c73c6caf4284def02e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 29 Nov 2018 11:38:42 +0800 Subject: [PATCH 058/247] Initial working POC for DateRange widget --- .../client/livestamp/MaterialLiveStamp.java | 6 +- .../MaterialLiveStampClientBundle.java | 3 - .../MaterialLiveStampDebugClientBundle.java | 3 - .../moment/resources/MomentClientBundle.java | 13 + .../resources/MomentClientDebugBundle.java | 13 + .../incubator/client/daterange/DateRange.java | 611 +++++++ .../daterange/DateRangeClientBundle.java | 19 + .../daterange/DateRangeClientDebugBundle.java | 19 + .../client/daterange/events/ApplyEvent.java | 66 + .../client/daterange/events/CancelEvent.java | 54 + .../daterange/events/CloseCalendarEvent.java | 66 + .../daterange/events/DateRangeEvents.java | 11 + .../events/HasDateRangeHandlers.java | 15 + .../daterange/events/OpenCalendarEvent.java | 66 + .../client/daterange/js/DateRangeOptions.java | 105 ++ .../js/DateRangeVerticalPosition.java | 7 + .../daterange/js/DropdownAlignment.java | 26 + .../client/daterange/js/DropdownPosition.java | 26 + .../daterange/js/HasDateRangeOptions.java | 128 ++ .../client/daterange/js/JsDateRange.java | 39 + .../resources/js/moment.js | 0 .../resources/js/moment.min.js | 0 .../css/daterangepicker-override.css | 7 + .../css/daterangepicker-override.min.css | 7 + .../resources/css/daterangepicker.css | 388 +++++ .../resources/css/daterangepicker.min.css | 389 +++++ .../daterange/resources/js/daterangepicker.js | 1526 +++++++++++++++++ .../resources/js/daterangepicker.min.js | 1 + 28 files changed, 3606 insertions(+), 8 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java create mode 100644 src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java rename src/main/resources/gwt/material/design/addins/client/{livestamp => moment}/resources/js/moment.js (100%) rename src/main/resources/gwt/material/design/addins/client/{livestamp => moment}/resources/js/moment.min.js (100%) create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js diff --git a/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStamp.java b/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStamp.java index 3e06f9375..d1cee249f 100644 --- a/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStamp.java +++ b/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStamp.java @@ -23,6 +23,8 @@ import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.moment.resources.MomentClientBundle; +import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.AbstractValueWidget; import gwt.material.design.client.base.JsLoader; @@ -60,10 +62,10 @@ public class MaterialLiveStamp extends AbstractValueWidget implements JsLo static { if (MaterialAddins.isDebug()) { - MaterialDesignBase.injectDebugJs(MaterialLiveStampDebugClientBundle.INSTANCE.momentDebugJs()); + MaterialDesignBase.injectDebugJs(MomentClientDebugBundle.INSTANCE.momentDebugJs()); MaterialDesignBase.injectDebugJs(MaterialLiveStampDebugClientBundle.INSTANCE.liveStampDebugJs()); } else { - MaterialDesignBase.injectJs(MaterialLiveStampClientBundle.INSTANCE.momentJs()); + MaterialDesignBase.injectJs(MomentClientBundle.INSTANCE.momentJs()); MaterialDesignBase.injectJs(MaterialLiveStampClientBundle.INSTANCE.liveStampJs()); } } diff --git a/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampClientBundle.java b/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampClientBundle.java index 505c16580..fa36c8496 100644 --- a/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampClientBundle.java @@ -34,7 +34,4 @@ interface MaterialLiveStampClientBundle extends ClientBundle { @Source("resources/js/livestamp.min.js") TextResource liveStampJs(); - - @Source("resources/js/moment.min.js") - TextResource momentJs(); } diff --git a/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampDebugClientBundle.java index 59ffb8561..6a7ff0ad9 100644 --- a/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/livestamp/MaterialLiveStampDebugClientBundle.java @@ -34,7 +34,4 @@ interface MaterialLiveStampDebugClientBundle extends ClientBundle { @Source("resources/js/livestamp.js") TextResource liveStampDebugJs(); - - @Source("resources/js/moment.js") - TextResource momentDebugJs(); } diff --git a/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java new file mode 100644 index 000000000..728e30255 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java @@ -0,0 +1,13 @@ +package gwt.material.design.addins.client.moment.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface MomentClientBundle extends ClientBundle { + + MomentClientBundle INSTANCE = GWT.create(MomentClientBundle.class); + + @Source("js/moment.min.js") + TextResource momentJs(); +} diff --git a/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java new file mode 100644 index 000000000..0a3bc8960 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java @@ -0,0 +1,13 @@ +package gwt.material.design.addins.client.moment.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface MomentClientDebugBundle extends ClientBundle { + + MomentClientDebugBundle INSTANCE = GWT.create(MomentClientDebugBundle.class); + + @Source("js/moment.js") + TextResource momentDebugJs(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java new file mode 100644 index 000000000..29b5ceca9 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java @@ -0,0 +1,611 @@ +package gwt.material.design.incubator.client.daterange; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.InputElement; +import com.google.gwt.dom.client.Style; +import com.google.gwt.event.logical.shared.*; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.TextBox; +import gwt.material.design.addins.client.moment.resources.MomentClientBundle; +import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.*; +import gwt.material.design.client.base.mixin.FieldTypeMixin; +import gwt.material.design.client.base.mixin.ReadOnlyMixin; +import gwt.material.design.client.base.mixin.StatusTextMixin; +import gwt.material.design.client.constants.*; +import gwt.material.design.client.ui.MaterialDatePicker; +import gwt.material.design.client.ui.MaterialIcon; +import gwt.material.design.client.ui.MaterialLabel; +import gwt.material.design.client.ui.MaterialToast; +import gwt.material.design.client.ui.html.DateInput; +import gwt.material.design.client.ui.html.Label; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.daterange.events.*; +import gwt.material.design.incubator.client.daterange.js.*; +import gwt.material.design.jquery.client.api.Functions; + +import java.util.Date; + +import static gwt.material.design.incubator.client.daterange.js.JsDateRange.$; + + +public class DateRange extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, + HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder { + + static { + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectDebugJs(MomentClientDebugBundle.INSTANCE.momentDebugJs()); + MaterialDesignBase.injectDebugJs(DateRangeClientDebugBundle.INSTANCE.dateRangePickerDebugJs()); + MaterialDesignBase.injectCss(DateRangeClientDebugBundle.INSTANCE.dateRangePickerDebugCss()); + MaterialDesignBase.injectCss(DateRangeClientDebugBundle.INSTANCE.dateRangePickerOverrideDebugCss()); + } else { + MaterialDesignBase.injectJs(MomentClientBundle.INSTANCE.momentJs()); + MaterialDesignBase.injectJs(DateRangeClientBundle.INSTANCE.dateRangePickerJs()); + MaterialDesignBase.injectCss(DateRangeClientBundle.INSTANCE.dateRangePickerCss()); + MaterialDesignBase.injectCss(DateRangeClientBundle.INSTANCE.dateRangePickerOverrideCss()); + } + } + + private static final String DATE_RANGE_STYLENAME = "date-range-picker"; + private FieldTypeMixin fieldTypeMixin; + private TextBox dateInput = new TextBox(); + private Label label = new Label(); + private MaterialLabel errorLabel = new MaterialLabel(); + private MaterialIcon icon = new MaterialIcon(); + private DateRangeOptions options = new DateRangeOptions(); + private StatusTextMixin statusTextMixin; + private ReadOnlyMixin readOnlyMixin; + + public DateRange() { + super(Document.get().createDivElement(), CssName.INPUT_FIELD, DATE_RANGE_STYLENAME); + } + + @Override + protected void onLoad() { + super.onLoad(); + + load(); + } + + protected void load() { + + add(dateInput); + add(label); + add(errorLabel); + + getInputElement().daterangepicker(options); + + //TODO: Change target to Date + getInputElement().on(DateRangeEvents.OPEN, (e, param1) -> { + OpenEvent.fire(this, this); + return true; + }); + + //TODO: Change target to Date + getInputElement().on(DateRangeEvents.CLOSE, (e, param1) -> { + CloseEvent.fire(this, this); + return true; + }); + + getInputElement().on(DateRangeEvents.CLOSE_CALENDAR, (e, param1) -> { + MaterialToast.fireToast("Close Calendar"); + return true; + }); + + getInputElement().on(DateRangeEvents.OPEN_CALENDAR, (e, param1) -> { + MaterialToast.fireToast("Open Calendar"); + return true; + }); + + getInputElement().on(DateRangeEvents.APPLY, (e, param1) -> { + MaterialToast.fireToast("Apply"); + return true; + }); + + getInputElement().on(DateRangeEvents.CANCEL, (e, param1) -> { + MaterialToast.fireToast("Cancel"); + return true; + }); + } + + @Override + protected void onUnload() { + super.onUnload(); + + unload(); + } + + protected void unload() { + getInputElement().off(DateRangeEvents.OPEN); + getInputElement().off(DateRangeEvents.CLOSE); + getInputElement().off(DateRangeEvents.CLOSE_CALENDAR); + getInputElement().off(DateRangeEvents.OPEN_CALENDAR); + getInputElement().off(DateRangeEvents.APPLY); + getInputElement().off(DateRangeEvents.CANCEL); + } + + public void reload() { + unload(); + load(); + } + + public JsDateRange getInputElement() { + return $(dateInput.getElement()); + } + + @Override + public Date getStartDate() { + return options.startDate; + } + + @Override + public void setStartDate(Date startDate) { + options.startDate = startDate; + } + + @Override + public Date getEndDate() { + return options.endDate; + } + + @Override + public void setEndDate(Date endDate) { + options.endDate = endDate; + } + + @Override + public Date getMinDate() { + return options.minDate; + } + + @Override + public void setMinDate(Date minDate) { + options.minDate = minDate; + } + + @Override + public Date getMaxDate() { + return options.maxDate; + } + + @Override + public void setMaxDate(Date maxDate) { + options.maxDate = maxDate; + } + + @Override + public Object getMaxSpan() { + return options.maxSpan; + } + + @Override + public void setMaxSpan(Object maxSpan) { + options.maxSpan = maxSpan; + } + + @Override + public boolean isShowDropdowns() { + return options.showDropdowns; + } + + @Override + public void setShowDropdowns(boolean showDropdowns) { + options.showDropdowns = showDropdowns; + } + + @Override + public int getMinYear() { + return options.minYear; + } + + @Override + public void setMinYear(int minYear) { + options.minYear = minYear; + } + + @Override + public int getMaxYear() { + return options.maxYear; + } + + @Override + public void setMaxYear(int maxYear) { + options.maxYear = maxYear; + } + + @Override + public boolean isShowWeekNumbers() { + return options.showWeekNumbers; + } + + @Override + public void setShowWeekNumbers(boolean showWeekNumbers) { + options.showWeekNumbers = showWeekNumbers; + } + + @Override + public boolean isShowISOWeekNumbers() { + return options.showISOWeekNumbers; + } + + @Override + public void setShowISOWeekNumbers(boolean showISOWeekNumbers) { + options.showISOWeekNumbers = showISOWeekNumbers; + } + + @Override + public boolean isTimePicker() { + return options.timePicker; + } + + @Override + public void setTimePicker(boolean timePicker) { + options.timePicker = timePicker; + } + + @Override + public int getTimePickerIncrement() { + return options.timePickerIncrement; + } + + @Override + public void setTimePickerIncrement(int timePickerIncrement) { + options.timePickerIncrement = timePickerIncrement; + } + + @Override + public boolean isTimePicker24Hour() { + return options.timePicker24Hour; + } + + @Override + public void setTimePicker24Hour(boolean timePicker24Hour) { + options.timePicker24Hour = timePicker24Hour; + } + + @Override + public boolean isTimePickerSeconds() { + return options.timePickerSeconds; + } + + @Override + public void setTimePickerSeconds(boolean timePickerSeconds) { + options.timePickerSeconds = timePickerSeconds; + } + + @Override + public Object getRanges() { + return options.ranges; + } + + @Override + public void setRanges(Object ranges) { + options.ranges = ranges; + } + + @Override + public boolean isShowCustomRangeLabel() { + return options.showCustomRangeLabel; + } + + @Override + public void setShowCustomRangeLabel(boolean showCustomRangeLabel) { + options.showCustomRangeLabel = showCustomRangeLabel; + } + + @Override + public boolean isAlwaysShowCalendars() { + return options.alwaysShowCalendars; + } + + @Override + public void setAlwaysShowCalendars(boolean alwaysShowCalendars) { + options.alwaysShowCalendars = alwaysShowCalendars; + } + + @Override + public DropdownAlignment getDropdownAlignment() { + return options.opens != null ? DropdownAlignment.fromStyleName(options.opens) : null; + } + + @Override + public void setDropdownAlignment(DropdownAlignment alignment) { + options.opens = alignment.getCssName(); + } + + @Override + public DropdownPosition getDropdownPosition() { + return options.drops != null ? DropdownPosition.fromStyleName(options.drops) : null; + } + + @Override + public void setDropdownPosition(DropdownPosition dropdownPosition) { + options.drops = dropdownPosition.getCssName(); + } + + @Override + public String getButtonClasses() { + return options.buttonClasses; + } + + @Override + public void setButtonClasses(String buttonClasses) { + options.buttonClasses = buttonClasses; + } + + @Override + public String getApplyButtonClasses() { + return options.applyButtonClasses; + } + + @Override + public void setApplyButtonClasses(String applyButtonClasses) { + options.applyButtonClasses = applyButtonClasses; + } + + @Override + public String getCancelButtonClasses() { + return options.cancelButtonClasses; + } + + @Override + public void setCancelButtonClasses(String cancelButtonClasses) { + options.cancelButtonClasses = cancelButtonClasses; + } + + @Override + public Object getLocale() { + return options.locale; + } + + @Override + public void setLocale(Object locale) { + options.locale = locale; + } + + @Override + public boolean isSingleDatePicker() { + return options.singleDatePicker; + } + + @Override + public void setSingleDatePicker(boolean singleDatePicker) { + options.singleDatePicker = singleDatePicker; + } + + @Override + public boolean isAutoApply() { + return options.autoApply; + } + + @Override + public void setAutoApply(boolean autoApply) { + options.autoApply = autoApply; + } + + @Override + public boolean isLinkedCalendars() { + return options.linkedCalendars; + } + + @Override + public void setLinkedCalendars(boolean linkedCalendars) { + options.linkedCalendars = linkedCalendars; + } + + @Override + public Functions.FuncRet1 isInvalidDate() { + return options.isInvalidDate; + } + + @Override + public void setInvalidDate(Functions.FuncRet1 invalidDate) { + options.isInvalidDate = invalidDate; + } + + @Override + public Functions.FuncRet1 isCustomDate() { + return options.isCustomDate; + } + + @Override + public void setCustomDate(Functions.FuncRet1 customDate) { + options.isCustomDate = customDate; + } + + @Override + public boolean isAutoUpdateInput() { + return options.autoUpdateInput; + } + + @Override + public void setAutoUpdateInput(boolean autoUpdateInput) { + options.autoUpdateInput = autoUpdateInput; + } + + @Override + public String getParentEl() { + return options.parentEl; + } + + @Override + public void setParentEl(String parentEl) { + options.parentEl = parentEl; + } + + @Override + public Date getValue() { + Date date = null; + if (getInputElement().val() != null) { + date = (Date) getInputElement().val(); + } + return date; + } + + @Override + public void setFieldType(FieldType type) { + getFieldTypeMixin().setFieldType(type); + } + + @Override + public FieldType getFieldType() { + return getFieldTypeMixin().getFieldType(); + } + + @Override + public void setLabelWidth(double percentWidth) { + getFieldTypeMixin().setLabelWidth(percentWidth); + } + + @Override + public void setFieldWidth(double percentWidth) { + getFieldTypeMixin().setFieldWidth(percentWidth); + } + + + @Override + public MaterialIcon getIcon() { + return icon; + } + + @Override + public void setIconType(IconType iconType) { + icon.setIconType(iconType); + icon.setIconPrefix(true); + errorLabel.setPaddingLeft(44); + insert(icon, 0); + } + + @Override + public void setIconPosition(IconPosition position) { + icon.setIconPosition(position); + } + + @Override + public void setIconSize(IconSize size) { + icon.setIconSize(size); + } + + @Override + public void setIconFontSize(double size, Style.Unit unit) { + icon.setIconFontSize(size, unit); + } + + @Override + public void setIconColor(Color iconColor) { + icon.setIconColor(iconColor); + } + + @Override + public Color getIconColor() { + return icon.getIconColor(); + } + + @Override + public void setIconPrefix(boolean prefix) { + icon.setIconPrefix(prefix); + } + + @Override + public boolean isIconPrefix() { + return icon.isIconPrefix(); + } + + @Override + public void setCustomIconType(String iconType) { + icon.setCustomIconType(iconType); + } + + @Override + public String getCustomIconType() { + return icon.getCustomIconType(); + } + + @Override + public void setReadOnly(boolean value) { + getReadOnlyMixin().setReadOnly(value); + } + + @Override + public boolean isReadOnly() { + return getReadOnlyMixin().isReadOnly(); + } + + @Override + public void setToggleReadOnly(boolean toggle) { + getReadOnlyMixin().setToggleReadOnly(toggle); + } + + @Override + public boolean isToggleReadOnly() { + return getReadOnlyMixin().isToggleReadOnly(); + } + + @Override + public String getPlaceholder() { + return label.getText(); + } + + @Override + public void setPlaceholder(String placeholder) { + label.setText(placeholder); + } + + @Override + public HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendarEventHandler handler) { + return addHandler(handler, OpenCalendarEvent.getType()); + } + + @Override + public HandlerRegistration addCloseCalendarHandler(CloseCalendarEvent.CloseCalendarEventHandler handler) { + return addHandler(handler, CloseCalendarEvent.getType()); + } + + @Override + public HandlerRegistration addApplyHandler(ApplyEvent.ApplyEventHandler handler) { + return addHandler(handler, ApplyEvent.getType()); + } + + @Override + public HandlerRegistration addCancelHandler(CancelEvent.CancelEventHandler handler) { + return addHandler(handler, CancelEvent.getType()); + } + + @Override + public HandlerRegistration addCloseHandler(CloseHandler handler) { + return addHandler(handler, CloseEvent.getType()); + } + + @Override + public HandlerRegistration addOpenHandler(OpenHandler handler) { + return addHandler(handler, OpenEvent.getType()); + } + + @Override + public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { + return addHandler(handler, ValueChangeEvent.getType()); + } + + protected FieldTypeMixin getFieldTypeMixin() { + if (fieldTypeMixin == null) { + fieldTypeMixin = new FieldTypeMixin<>(this); + } + return fieldTypeMixin; + } + + @Override + public StatusTextMixin getStatusTextMixin() { + if (statusTextMixin == null) { + statusTextMixin = new StatusTextMixin<>(this, errorLabel, dateInput); + } + return statusTextMixin; + } + + protected ReadOnlyMixin getReadOnlyMixin() { + if (readOnlyMixin == null) { + readOnlyMixin = new ReadOnlyMixin<>(this, dateInput); + } + return readOnlyMixin; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java new file mode 100644 index 000000000..d45cbeadc --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java @@ -0,0 +1,19 @@ +package gwt.material.design.incubator.client.daterange; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface DateRangeClientBundle extends ClientBundle { + + DateRangeClientBundle INSTANCE = GWT.create(DateRangeClientBundle.class); + + @Source("resources/js/daterangepicker.min.js") + TextResource dateRangePickerJs(); + + @Source("resources/css/daterangepicker.min.css") + TextResource dateRangePickerCss(); + + @Source("resources/css/daterangepicker-override.min.css") + TextResource dateRangePickerOverrideCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java new file mode 100644 index 000000000..65208b816 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java @@ -0,0 +1,19 @@ +package gwt.material.design.incubator.client.daterange; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface DateRangeClientDebugBundle extends ClientBundle { + + DateRangeClientDebugBundle INSTANCE = GWT.create(DateRangeClientDebugBundle.class); + + @Source("resources/js/daterangepicker.js") + TextResource dateRangePickerDebugJs(); + + @Source("resources/css/daterangepicker.css") + TextResource dateRangePickerDebugCss(); + + @Source("resources/css/daterangepicker-override.css") + TextResource dateRangePickerOverrideDebugCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java new file mode 100644 index 000000000..77be7956a --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java @@ -0,0 +1,66 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +import java.util.Date; + +/** + * @author kevzlou7979 + */ +public class ApplyEvent extends GwtEvent { + + public interface ApplyEventHandler extends EventHandler { + void onApplyEvent(ApplyEvent event); + } + + public static final Type TYPE = new Type<>(); + + private Date date; + + public ApplyEvent(Date date) { + this.date = date; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, Date date) { + source.fireEvent(new ApplyEvent(date)); + } + + public Date getDate() { + return date; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ApplyEvent.ApplyEventHandler handler) { + handler.onApplyEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java new file mode 100644 index 000000000..015880f31 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java @@ -0,0 +1,54 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +/** + * @author kevzlou7979 + */ +public class CancelEvent extends GwtEvent { + + public interface CancelEventHandler extends EventHandler { + void onCancelEvent(CancelEvent event); + } + + public static final Type TYPE = new Type<>(); + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new CancelEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CancelEvent.CancelEventHandler handler) { + handler.onCancelEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java new file mode 100644 index 000000000..4310cd962 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java @@ -0,0 +1,66 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +import java.util.Date; + +/** + * @author kevzlou7979 + */ +public class CloseCalendarEvent extends GwtEvent { + + public interface CloseCalendarEventHandler extends EventHandler { + void onCloseCalendarEvent(CloseCalendarEvent event); + } + + private Date date; + + public CloseCalendarEvent(Date date) { + this.date = date; + } + + public static final Type TYPE = new Type<>(); + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, Date date) { + source.fireEvent(new CloseCalendarEvent(date)); + } + + public Date getDate() { + return date; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(CloseCalendarEvent.CloseCalendarEventHandler handler) { + handler.onCloseCalendarEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java new file mode 100644 index 000000000..9b368b65e --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java @@ -0,0 +1,11 @@ +package gwt.material.design.incubator.client.daterange.events; + +public interface DateRangeEvents { + + String OPEN = "show.daterangepicker"; + String CLOSE = "hide.daterangepicker"; + String OPEN_CALENDAR = "showCalendar.daterangepicker"; + String CLOSE_CALENDAR = "hideCalendar.daterangepicker"; + String APPLY = "apply.daterangepicker"; + String CANCEL = "cancel.daterangepicker"; +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java new file mode 100644 index 000000000..4d0adaedc --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java @@ -0,0 +1,15 @@ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.logical.shared.HasCloseHandlers; +import com.google.gwt.event.logical.shared.HasOpenHandlers; +import com.google.gwt.event.shared.HandlerRegistration; + +import java.util.Date; + +public interface HasDateRangeHandlers extends HasOpenHandlers, HasCloseHandlers { + + HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendarEventHandler handler); + HandlerRegistration addCloseCalendarHandler(CloseCalendarEvent.CloseCalendarEventHandler handler); + HandlerRegistration addApplyHandler(ApplyEvent.ApplyEventHandler handler); + HandlerRegistration addCancelHandler(CancelEvent.CancelEventHandler handler); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java new file mode 100644 index 000000000..8becbe87a --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java @@ -0,0 +1,66 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +import java.util.Date; + +/** + * @author kevzlou7979 + */ +public class OpenCalendarEvent extends GwtEvent { + + public interface OpenCalendarEventHandler extends EventHandler { + void onOpenCalendarEvent(OpenCalendarEvent event); + } + + private Date date; + + public OpenCalendarEvent(Date date) { + this.date = date; + } + + public static final Type TYPE = new Type<>(); + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, Date date) { + source.fireEvent(new OpenCalendarEvent(date)); + } + + public Date getDate() { + return date; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(OpenCalendarEvent.OpenCalendarEventHandler handler) { + handler.onOpenCalendarEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java new file mode 100644 index 000000000..59c3cd856 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java @@ -0,0 +1,105 @@ +package gwt.material.design.incubator.client.daterange.js; + +import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.Date; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class DateRangeOptions { + + @JsProperty + public Date startDate; + + @JsProperty + public Date endDate; + + @JsProperty + public Date minDate; + + @JsProperty + public Date maxDate; + + @JsProperty + public Object maxSpan; + + @JsProperty + public boolean showDropdowns; + + @JsProperty + public int minYear; + + @JsProperty + public int maxYear; + + @JsProperty + public boolean showWeekNumbers; + + @JsProperty + public boolean showISOWeekNumbers; + + @JsProperty + public boolean timePicker; + + @JsProperty + public int timePickerIncrement; + + @JsProperty + public boolean timePicker24Hour; + + @JsProperty + public boolean timePickerSeconds; + + @JsProperty + public Object ranges; + + @JsProperty + public boolean showCustomRangeLabel; + + @JsProperty + public boolean alwaysShowCalendars; + + /** + * @see DropdownAlignment + */ + @JsProperty + public String opens; + + @JsProperty + public String drops; + + @JsProperty + public String buttonClasses; + + @JsProperty + public String applyButtonClasses; + + @JsProperty + public String cancelButtonClasses; + + @JsProperty + public Object locale; + + @JsProperty + public boolean singleDatePicker; + + @JsProperty + public boolean autoApply; + + @JsProperty + public boolean linkedCalendars; + + @JsProperty + public Functions.FuncRet1 isInvalidDate; + + @JsProperty + public Functions.FuncRet1 isCustomDate; + + @JsProperty + public boolean autoUpdateInput; + + @JsProperty + public String parentEl; +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java new file mode 100644 index 000000000..4d5bf5c3f --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java @@ -0,0 +1,7 @@ +package gwt.material.design.incubator.client.daterange.js; + +public interface DateRangeVerticalPosition { + + String DOWN = "down"; + String UP = "up"; +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java new file mode 100644 index 000000000..4311f956d --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java @@ -0,0 +1,26 @@ +package gwt.material.design.incubator.client.daterange.js; + +import gwt.material.design.client.base.helper.EnumHelper; +import gwt.material.design.client.constants.CssType; + +public enum DropdownAlignment implements CssType { + + LEFT("left"), + RIGHT("right"), + CENTER("center"); + + private final String cssClass; + + DropdownAlignment(final String cssClass) { + this.cssClass = cssClass; + } + + @Override + public String getCssName() { + return cssClass; + } + + public static DropdownAlignment fromStyleName(final String styleName) { + return EnumHelper.fromStyleName(styleName, DropdownAlignment.class, LEFT); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java new file mode 100644 index 000000000..9a706886e --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java @@ -0,0 +1,26 @@ +package gwt.material.design.incubator.client.daterange.js; + +import gwt.material.design.client.base.helper.EnumHelper; +import gwt.material.design.client.constants.CssType; + +public enum DropdownPosition implements CssType { + + LEFT("left"), + RIGHT("right"), + CENTER("center"); + + private final String cssClass; + + DropdownPosition(final String cssClass) { + this.cssClass = cssClass; + } + + @Override + public String getCssName() { + return cssClass; + } + + public static DropdownPosition fromStyleName(final String styleName) { + return EnumHelper.fromStyleName(styleName, DropdownPosition.class, LEFT); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java new file mode 100644 index 000000000..7acc52905 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -0,0 +1,128 @@ +package gwt.material.design.incubator.client.daterange.js; + +import gwt.material.design.jquery.client.api.Functions; + +import java.util.Date; + +public interface HasDateRangeOptions { + + Date getStartDate(); + + void setStartDate(Date startDate); + + Date getEndDate(); + + void setEndDate(Date endDate); + + Date getMinDate(); + + void setMinDate(Date minDate); + + Date getMaxDate(); + + void setMaxDate(Date maxDate); + + Object getMaxSpan(); + + void setMaxSpan(Object maxSpan); + + boolean isShowDropdowns(); + + void setShowDropdowns(boolean showDropdowns); + + int getMinYear(); + + void setMinYear(int minYear); + + int getMaxYear(); + + void setMaxYear(int maxYear); + + boolean isShowWeekNumbers(); + + void setShowWeekNumbers(boolean showWeekNumbers); + + boolean isShowISOWeekNumbers(); + + void setShowISOWeekNumbers(boolean showISOWeekNumbers); + + boolean isTimePicker(); + + void setTimePicker(boolean timePicker); + + int getTimePickerIncrement(); + + void setTimePickerIncrement(int timePickerIncrement); + + boolean isTimePicker24Hour(); + + void setTimePicker24Hour(boolean timePicker24Hour); + + boolean isTimePickerSeconds(); + + void setTimePickerSeconds(boolean timePickerSeconds); + + Object getRanges(); + + void setRanges(Object ranges); + + boolean isShowCustomRangeLabel(); + + void setShowCustomRangeLabel(boolean showCustomRangeLabel); + + boolean isAlwaysShowCalendars(); + + void setAlwaysShowCalendars(boolean alwaysShowCalendars); + + DropdownAlignment getDropdownAlignment(); + + void setDropdownAlignment(DropdownAlignment alignment); + + DropdownPosition getDropdownPosition(); + + void setDropdownPosition(DropdownPosition position); + + String getButtonClasses(); + + void setButtonClasses(String buttonClasses); + + String getApplyButtonClasses(); + + void setApplyButtonClasses(String applyButtonClasses); + + String getCancelButtonClasses(); + + void setCancelButtonClasses(String cancelButtonClasses); + + Object getLocale(); + + void setLocale(Object locale); + + boolean isSingleDatePicker(); + + void setSingleDatePicker(boolean singleDatePicker); + + boolean isAutoApply(); + + void setAutoApply(boolean autoApply); + + boolean isLinkedCalendars(); + + void setLinkedCalendars(boolean linkedCalendars); + + Functions.FuncRet1 isInvalidDate(); + + void setInvalidDate(Functions.FuncRet1 isInvalidDate); + + Functions.FuncRet1 isCustomDate(); + + void setCustomDate(Functions.FuncRet1 isCustomDate); + + boolean isAutoUpdateInput(); + + void setAutoUpdateInput(boolean autoUpdateInput); + + String getParentEl(); + + void setParentEl(String parentEl); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java new file mode 100644 index 000000000..f82496c48 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java @@ -0,0 +1,39 @@ +package gwt.material.design.incubator.client.daterange.js; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.addins.client.combobox.js.JsComboBoxOptions; +import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jquery.client.api.JQueryElement; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.Date; + +@JsType(isNative = true) +public class JsDateRange extends JQueryElement { + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsDateRange $(JQueryElement element); + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsDateRange $(Element element); + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsDateRange $(String selector); + + @JsMethod + public native void daterangepicker(DateRangeOptions options); + + @JsMethod + public native void daterangepicker(); + + @JsMethod + public native void setStartDate(Date date); + + @JsMethod + public native void setEndDate(Date date); + + +} diff --git a/src/main/resources/gwt/material/design/addins/client/livestamp/resources/js/moment.js b/src/main/resources/gwt/material/design/addins/client/moment/resources/js/moment.js similarity index 100% rename from src/main/resources/gwt/material/design/addins/client/livestamp/resources/js/moment.js rename to src/main/resources/gwt/material/design/addins/client/moment/resources/js/moment.js diff --git a/src/main/resources/gwt/material/design/addins/client/livestamp/resources/js/moment.min.js b/src/main/resources/gwt/material/design/addins/client/moment/resources/js/moment.min.js similarity index 100% rename from src/main/resources/gwt/material/design/addins/client/livestamp/resources/js/moment.min.js rename to src/main/resources/gwt/material/design/addins/client/moment/resources/js/moment.min.js diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css new file mode 100644 index 000000000..ef069c73b --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css @@ -0,0 +1,7 @@ +.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { + padding: unset; +} + +.daterangepicker select { + display: inline-block; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css new file mode 100644 index 000000000..ef069c73b --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css @@ -0,0 +1,7 @@ +.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { + padding: unset; +} + +.daterangepicker select { + display: inline-block; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.css new file mode 100644 index 000000000..73f36b0cc --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.css @@ -0,0 +1,388 @@ +.daterangepicker { + position: absolute; + color: inherit; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ddd; + width: 278px; + max-width: none; + padding: 0; + margin-top: 7px; + top: 100px; + left: 20px; + z-index: 3001; + display: none; + font-family: arial; + font-size: 15px; + line-height: 1em; +} + +.daterangepicker:before, .daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker:before { + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #ccc; +} + +.daterangepicker:after { + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; +} + +.daterangepicker.opensleft:before { + right: 9px; +} + +.daterangepicker.opensleft:after { + right: 10px; +} + +.daterangepicker.openscenter:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.openscenter:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.opensright:before { + left: 9px; +} + +.daterangepicker.opensright:after { + left: 10px; +} + +.daterangepicker.drop-up { + margin-top: -7px; +} + +.daterangepicker.drop-up:before { + top: initial; + bottom: -7px; + border-bottom: initial; + border-top: 7px solid #ccc; +} + +.daterangepicker.drop-up:after { + top: initial; + bottom: -6px; + border-bottom: initial; + border-top: 6px solid #fff; +} + +.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar { + float: none; +} + +.daterangepicker.single .drp-selected { + display: none; +} + +.daterangepicker.show-calendar .drp-calendar { + display: block; +} + +.daterangepicker.show-calendar .drp-buttons { + display: block; +} + +.daterangepicker.auto-apply .drp-buttons { + display: none; +} + +.daterangepicker .drp-calendar { + display: none; + max-width: 270px; +} + +.daterangepicker .drp-calendar.left { + padding: 8px 0 8px 8px; +} + +.daterangepicker .drp-calendar.right { + padding: 8px; +} + +.daterangepicker .drp-calendar.single .calendar-table { + border: none; +} + +.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span { + color: #fff; + border: solid black; + border-width: 0 2px 2px 0; + border-radius: 0; + display: inline-block; + padding: 3px; +} + +.daterangepicker .calendar-table .next span { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.daterangepicker .calendar-table .prev span { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { + white-space: nowrap; + text-align: center; + vertical-align: middle; + min-width: 32px; + width: 32px; + height: 24px; + line-height: 24px; + font-size: 12px; + border-radius: 4px; + border: 1px solid transparent; + white-space: nowrap; + cursor: pointer; +} + +.daterangepicker .calendar-table { + border: 1px solid #fff; + border-radius: 4px; + background-color: #fff; +} + +.daterangepicker .calendar-table table { + width: 100%; + margin: 0; + border-spacing: 0; + border-collapse: collapse; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background-color: #eee; + border-color: transparent; + color: inherit; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: #fff; + border-color: transparent; + color: #999; +} + +.daterangepicker td.in-range { + background-color: #ebf4f8; + border-color: transparent; + color: #000; + border-radius: 0; +} + +.daterangepicker td.start-date { + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.end-date { + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + border-radius: 4px; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: transparent; + color: #fff; +} + +.daterangepicker th.month { + width: auto; +} + +.daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin: 0 auto; + background: #eee; + border: 1px solid #eee; + padding: 2px; + outline: 0; + font-size: 12px; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 4px auto 0 auto; + line-height: 30px; + position: relative; +} + +.daterangepicker .calendar-time select.disabled { + color: #ccc; + cursor: not-allowed; +} + +.daterangepicker .drp-buttons { + clear: both; + text-align: right; + padding: 8px; + border-top: 1px solid #ddd; + display: none; + line-height: 12px; + vertical-align: middle; +} + +.daterangepicker .drp-selected { + display: inline-block; + font-size: 12px; + padding-right: 8px; +} + +.daterangepicker .drp-buttons .btn { + margin-left: 8px; + font-size: 12px; + font-weight: bold; + padding: 4px 8px; +} + +.daterangepicker.show-ranges .drp-calendar.left { + border-left: 1px solid #ddd; +} + +.daterangepicker .ranges { + float: none; + text-align: left; + margin: 0; +} + +.daterangepicker.show-calendar .ranges { + margin-top: 8px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; +} + +.daterangepicker .ranges li { + font-size: 12px; + padding: 8px 12px; + cursor: pointer; +} + +.daterangepicker .ranges li:hover { + background-color: #eee; +} + +.daterangepicker .ranges li.active { + background-color: #08c; + color: #fff; +} + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; } + .daterangepicker .ranges ul { + width: 140px; } + .daterangepicker.single .ranges ul { + width: 100%; } + .daterangepicker.single .drp-calendar.left { + clear: none; } + .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .drp-calendar { + float: left; } + .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .drp-calendar { + float: right; } + .daterangepicker.ltr { + direction: ltr; + text-align: left; } + .daterangepicker.ltr .drp-calendar.left { + clear: left; + margin-right: 0; } + .daterangepicker.ltr .drp-calendar.left .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.ltr .drp-calendar.right { + margin-left: 0; } + .daterangepicker.ltr .drp-calendar.right .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.ltr .drp-calendar.left .calendar-table { + padding-right: 8px; } + .daterangepicker.ltr .ranges, .daterangepicker.ltr .drp-calendar { + float: left; } + .daterangepicker.rtl { + direction: rtl; + text-align: right; } + .daterangepicker.rtl .drp-calendar.left { + clear: right; + margin-left: 0; } + .daterangepicker.rtl .drp-calendar.left .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.rtl .drp-calendar.right { + margin-right: 0; } + .daterangepicker.rtl .drp-calendar.right .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.rtl .drp-calendar.left .calendar-table { + padding-left: 12px; } + .daterangepicker.rtl .ranges, .daterangepicker.rtl .drp-calendar { + text-align: right; + float: right; } } +@media (min-width: 730px) { + .daterangepicker .ranges { + width: auto; } + .daterangepicker.ltr .ranges { + float: left; } + .daterangepicker.rtl .ranges { + float: right; } + .daterangepicker .drp-calendar.left { + clear: none !important; } } diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.min.css new file mode 100644 index 000000000..c905deaf4 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker.min.css @@ -0,0 +1,389 @@ +.daterangepicker { + position: absolute; + color: inherit; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ddd; + width: 278px; + max-width: none; + padding: 0; + margin-top: 7px; + top: 100px; + left: 20px; + z-index: 3001; + display: none; + font-family: arial; + font-size: 15px; + line-height: 1em; +} + +.daterangepicker:before, .daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker:before { + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #ccc; +} + +.daterangepicker:after { + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; +} + +.daterangepicker.opensleft:before { + right: 9px; +} + +.daterangepicker.opensleft:after { + right: 10px; +} + +.daterangepicker.openscenter:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.openscenter:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.opensright:before { + left: 9px; +} + +.daterangepicker.opensright:after { + left: 10px; +} + +.daterangepicker.drop-up { + margin-top: -7px; +} + +.daterangepicker.drop-up:before { + top: initial; + bottom: -7px; + border-bottom: initial; + border-top: 7px solid #ccc; +} + +.daterangepicker.drop-up:after { + top: initial; + bottom: -6px; + border-bottom: initial; + border-top: 6px solid #fff; +} + +.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar { + float: none; +} + +.daterangepicker.single .drp-selected { + display: none; +} + +.daterangepicker.show-calendar .drp-calendar { + display: block; +} + +.daterangepicker.show-calendar .drp-buttons { + display: block; +} + +.daterangepicker.auto-apply .drp-buttons { + display: none; +} + +.daterangepicker .drp-calendar { + display: none; + max-width: 270px; +} + +.daterangepicker .drp-calendar.left { + padding: 8px 0 8px 8px; +} + +.daterangepicker .drp-calendar.right { + padding: 8px; +} + +.daterangepicker .drp-calendar.single .calendar-table { + border: none; +} + +.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span { + color: #fff; + border: solid black; + border-width: 0 2px 2px 0; + border-radius: 0; + display: inline-block; + padding: 3px; +} + +.daterangepicker .calendar-table .next span { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.daterangepicker .calendar-table .prev span { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { + white-space: nowrap; + text-align: center; + vertical-align: middle; + min-width: 32px; + width: 32px; + height: 24px; + line-height: 24px; + font-size: 12px; + border-radius: 4px; + border: 1px solid transparent; + white-space: nowrap; + cursor: pointer; + padding: unset; +} + +.daterangepicker .calendar-table { + border: 1px solid #fff; + border-radius: 4px; + background-color: #fff; +} + +.daterangepicker .calendar-table table { + width: 100%; + margin: 0; + border-spacing: 0; + border-collapse: collapse; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background-color: #eee; + border-color: transparent; + color: inherit; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: #fff; + border-color: transparent; + color: #999; +} + +.daterangepicker td.in-range { + background-color: #ebf4f8; + border-color: transparent; + color: #000; + border-radius: 0; +} + +.daterangepicker td.start-date { + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.end-date { + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + border-radius: 4px; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: transparent; + color: #fff; +} + +.daterangepicker th.month { + width: auto; +} + +.daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin: 0 auto; + background: #eee; + border: 1px solid #eee; + padding: 2px; + outline: 0; + font-size: 12px; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 4px auto 0 auto; + line-height: 30px; + position: relative; +} + +.daterangepicker .calendar-time select.disabled { + color: #ccc; + cursor: not-allowed; +} + +.daterangepicker .drp-buttons { + clear: both; + text-align: right; + padding: 8px; + border-top: 1px solid #ddd; + display: none; + line-height: 12px; + vertical-align: middle; +} + +.daterangepicker .drp-selected { + display: inline-block; + font-size: 12px; + padding-right: 8px; +} + +.daterangepicker .drp-buttons .btn { + margin-left: 8px; + font-size: 12px; + font-weight: bold; + padding: 4px 8px; +} + +.daterangepicker.show-ranges .drp-calendar.left { + border-left: 1px solid #ddd; +} + +.daterangepicker .ranges { + float: none; + text-align: left; + margin: 0; +} + +.daterangepicker.show-calendar .ranges { + margin-top: 8px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; +} + +.daterangepicker .ranges li { + font-size: 12px; + padding: 8px 12px; + cursor: pointer; +} + +.daterangepicker .ranges li:hover { + background-color: #eee; +} + +.daterangepicker .ranges li.active { + background-color: #08c; + color: #fff; +} + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; } + .daterangepicker .ranges ul { + width: 140px; } + .daterangepicker.single .ranges ul { + width: 100%; } + .daterangepicker.single .drp-calendar.left { + clear: none; } + .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .drp-calendar { + float: left; } + .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .drp-calendar { + float: right; } + .daterangepicker.ltr { + direction: ltr; + text-align: left; } + .daterangepicker.ltr .drp-calendar.left { + clear: left; + margin-right: 0; } + .daterangepicker.ltr .drp-calendar.left .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.ltr .drp-calendar.right { + margin-left: 0; } + .daterangepicker.ltr .drp-calendar.right .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.ltr .drp-calendar.left .calendar-table { + padding-right: 8px; } + .daterangepicker.ltr .ranges, .daterangepicker.ltr .drp-calendar { + float: left; } + .daterangepicker.rtl { + direction: rtl; + text-align: right; } + .daterangepicker.rtl .drp-calendar.left { + clear: right; + margin-left: 0; } + .daterangepicker.rtl .drp-calendar.left .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.rtl .drp-calendar.right { + margin-right: 0; } + .daterangepicker.rtl .drp-calendar.right .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.rtl .drp-calendar.left .calendar-table { + padding-left: 12px; } + .daterangepicker.rtl .ranges, .daterangepicker.rtl .drp-calendar { + text-align: right; + float: right; } } +@media (min-width: 730px) { + .daterangepicker .ranges { + width: auto; } + .daterangepicker.ltr .ranges { + float: left; } + .daterangepicker.rtl .ranges { + float: right; } + .daterangepicker .drp-calendar.left { + clear: none !important; } } diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js new file mode 100644 index 000000000..3657f481f --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js @@ -0,0 +1,1526 @@ +/** +* @version: 3.0.3 +* @author: Dan Grossman http://www.dangrossman.info/ +* @copyright: Copyright (c) 2012-2018 Dan Grossman. All rights reserved. +* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php +* @website: http://www.daterangepicker.com/ +*/ +// Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Make globaly available as well + define(['moment', 'jquery'], function (moment, jquery) { + if (!jquery.fn) jquery.fn = {}; // webpack server rendering + if (typeof moment !== 'function' && moment.default) moment = moment.default + return factory(moment, jquery); + }); + } else if (typeof module === 'object' && module.exports) { + // Node / Browserify + //isomorphic issue + var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined; + if (!jQuery) { + jQuery = require('jquery'); + if (!jQuery.fn) jQuery.fn = {}; + } + var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); + module.exports = factory(moment, jQuery); + } else { + // Browser globals + root.daterangepicker = factory(root.moment, root.jQuery); + } +}(this, function(moment, $) { + var DateRangePicker = function(element, options, cb) { + + //default settings for options + this.parentEl = 'body'; + this.element = $(element); + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.maxSpan = false; + this.autoApply = false; + this.singleDatePicker = false; + this.showDropdowns = false; + this.minYear = moment().subtract(100, 'year').format('YYYY'); + this.maxYear = moment().add(100, 'year').format('YYYY'); + this.showWeekNumbers = false; + this.showISOWeekNumbers = false; + this.showCustomRangeLabel = true; + this.timePicker = false; + this.timePicker24Hour = false; + this.timePickerIncrement = 1; + this.timePickerSeconds = false; + this.linkedCalendars = true; + this.autoUpdateInput = true; + this.alwaysShowCalendars = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.drops = 'down'; + if (this.element.hasClass('dropup')) + this.drops = 'up'; + + this.buttonClasses = 'btn btn-sm'; + this.applyButtonClasses = 'btn-primary'; + this.cancelButtonClasses = 'btn-default'; + + this.locale = { + direction: 'ltr', + format: moment.localeData().longDateFormat('L'), + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment.weekdaysMin(), + monthNames: moment.monthsShort(), + firstDay: moment.localeData().firstDayOfWeek() + }; + + this.callback = function() { }; + + //some state information + this.isShowing = false; + this.leftCalendar = {}; + this.rightCalendar = {}; + + //custom options from user + if (typeof options !== 'object' || options === null) + options = {}; + + //allow setting options with data attributes + //data-api options will be overwritten with custom javascript options + options = $.extend(this.element.data(), options); + + //html template for the picker UI + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '' + + ' ' + + '
' + + '
'; + + this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(options.template).appendTo(this.parentEl); + + // + // handle all the possible options overriding defaults + // + + if (typeof options.locale === 'object') { + + if (typeof options.locale.direction === 'string') + this.locale.direction = options.locale.direction; + + if (typeof options.locale.format === 'string') + this.locale.format = options.locale.format; + + if (typeof options.locale.separator === 'string') + this.locale.separator = options.locale.separator; + + if (typeof options.locale.daysOfWeek === 'object') + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + + if (typeof options.locale.monthNames === 'object') + this.locale.monthNames = options.locale.monthNames.slice(); + + if (typeof options.locale.firstDay === 'number') + this.locale.firstDay = options.locale.firstDay; + + if (typeof options.locale.applyLabel === 'string') + this.locale.applyLabel = options.locale.applyLabel; + + if (typeof options.locale.cancelLabel === 'string') + this.locale.cancelLabel = options.locale.cancelLabel; + + if (typeof options.locale.weekLabel === 'string') + this.locale.weekLabel = options.locale.weekLabel; + + if (typeof options.locale.customRangeLabel === 'string'){ + //Support unicode chars in the custom range name. + var elem = document.createElement('textarea'); + elem.innerHTML = options.locale.customRangeLabel; + var rangeHtml = elem.value; + this.locale.customRangeLabel = rangeHtml; + } + } + this.container.addClass(this.locale.direction); + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.locale.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.locale.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.locale.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.locale.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + // sanity check for bad options + if (this.minDate && this.startDate.isBefore(this.minDate)) + this.startDate = this.minDate.clone(); + + // sanity check for bad options + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (typeof options.applyButtonClasses === 'string') + this.applyButtonClasses = options.applyButtonClasses; + + if (typeof options.applyClass === 'string') //backwards compat + this.applyButtonClasses = options.applyClass; + + if (typeof options.cancelButtonClasses === 'string') + this.cancelButtonClasses = options.cancelButtonClasses; + + if (typeof options.cancelClass === 'string') //backwards compat + this.cancelButtonClasses = options.cancelClass; + + if (typeof options.maxSpan === 'object') + this.maxSpan = options.maxSpan; + + if (typeof options.dateLimit === 'object') //backwards compat + this.maxSpan = options.dateLimit; + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') + this.showWeekNumbers = options.showWeekNumbers; + + if (typeof options.showISOWeekNumbers === 'boolean') + this.showISOWeekNumbers = options.showISOWeekNumbers; + + if (typeof options.buttonClasses === 'string') + this.buttonClasses = options.buttonClasses; + + if (typeof options.buttonClasses === 'object') + this.buttonClasses = options.buttonClasses.join(' '); + + if (typeof options.showDropdowns === 'boolean') + this.showDropdowns = options.showDropdowns; + + if (typeof options.minYear === 'number') + this.minYear = options.minYear; + + if (typeof options.maxYear === 'number') + this.maxYear = options.maxYear; + + if (typeof options.showCustomRangeLabel === 'boolean') + this.showCustomRangeLabel = options.showCustomRangeLabel; + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) + this.endDate = this.startDate.clone(); + } + + if (typeof options.timePicker === 'boolean') + this.timePicker = options.timePicker; + + if (typeof options.timePickerSeconds === 'boolean') + this.timePickerSeconds = options.timePickerSeconds; + + if (typeof options.timePickerIncrement === 'number') + this.timePickerIncrement = options.timePickerIncrement; + + if (typeof options.timePicker24Hour === 'boolean') + this.timePicker24Hour = options.timePicker24Hour; + + if (typeof options.autoApply === 'boolean') + this.autoApply = options.autoApply; + + if (typeof options.autoUpdateInput === 'boolean') + this.autoUpdateInput = options.autoUpdateInput; + + if (typeof options.linkedCalendars === 'boolean') + this.linkedCalendars = options.linkedCalendars; + + if (typeof options.isInvalidDate === 'function') + this.isInvalidDate = options.isInvalidDate; + + if (typeof options.isCustomDate === 'function') + this.isCustomDate = options.isCustomDate; + + if (typeof options.alwaysShowCalendars === 'boolean') + this.alwaysShowCalendars = options.alwaysShowCalendars; + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is(':text')) { + var val = $(this.element).val(), + split = val.split(this.locale.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.locale.format); + end = moment(split[1], this.locale.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.locale.format); + end = moment(val, this.locale.format); + } + if (start !== null && end !== null) { + this.setStartDate(start); + this.setEndDate(end); + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.locale.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.locale.format); + else + end = moment(options.ranges[range][1]); + + // If the start or end date exceed those allowed by the minDate or maxSpan + // options, shorten the range to the allowable period. + if (this.minDate && start.isBefore(this.minDate)) + start = this.minDate.clone(); + + var maxDate = this.maxDate; + if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate)) + maxDate = start.clone().add(this.maxSpan); + if (maxDate && end.isAfter(maxDate)) + end = maxDate.clone(); + + // If the end of the range is before the minimum or the start of the range is + // after the maximum, don't display this range option at all. + if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + continue; + + //Support unicode chars in the range names. + var elem = document.createElement('textarea'); + elem.innerHTML = range; + var rangeHtml = elem.value; + + this.ranges[rangeHtml] = [start, end]; + } + + var list = '
    '; + for (range in this.ranges) { + list += '
  • ' + range + '
  • '; + } + if (this.showCustomRangeLabel) { + list += '
  • ' + this.locale.customRangeLabel + '
  • '; + } + list += '
'; + this.container.find('.ranges').prepend(list); + } + + if (typeof cb === 'function') { + this.callback = cb; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + this.container.find('.calendar-time').hide(); + } + + //can't be used together for now + if (this.timePicker && this.autoApply) + this.autoApply = false; + + if (this.autoApply) { + this.container.addClass('auto-apply'); + } + + if (typeof options.ranges === 'object') + this.container.addClass('show-ranges'); + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.drp-calendar.left').addClass('single'); + this.container.find('.drp-calendar.left').show(); + this.container.find('.drp-calendar.right').hide(); + if (!this.timePicker) { + this.container.addClass('auto-apply'); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyButtonClasses.length) + this.container.find('.applyBtn').addClass(this.applyButtonClasses); + if (this.cancelButtonClasses.length) + this.container.find('.cancelBtn').addClass(this.cancelButtonClasses); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.drp-calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) + + this.container.find('.ranges') + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + + this.container.find('.drp-buttons') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + + if (this.element.is('input') || this.element.is('button')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.elementChanged, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); + } + + // + // if attached to a text input, set the initial value + // + + this.updateElement(); + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.locale.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.minDate && this.startDate.isBefore(this.minDate)) { + this.startDate = this.minDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (this.maxDate && this.startDate.isAfter(this.maxDate)) { + this.startDate = this.maxDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.locale.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); + + if (this.timePicker && this.timePickerIncrement) + this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.endDate.isBefore(this.startDate)) + this.endDate = this.startDate.clone(); + + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (this.maxSpan && this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.maxSpan); + + this.previousRightTime = this.endDate.clone(); + + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + isInvalidDate: function() { + return false; + }, + + isCustomDate: function() { + return false; + }, + + updateView: function() { + if (this.timePicker) { + this.renderTimePicker('left'); + this.renderTimePicker('right'); + if (!this.endDate) { + this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); + } else { + this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); + } + } + if (this.endDate) + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.updateMonthsInView(); + this.updateCalendars(); + this.updateFormInputs(); + }, + + updateMonthsInView: function() { + if (this.endDate) { + + //if both dates are visible already, do nothing + if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && + (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + && + (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + ) { + return; + } + + this.leftCalendar.month = this.startDate.clone().date(2); + if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { + this.rightCalendar.month = this.endDate.clone().date(2); + } else { + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + + } else { + if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { + this.leftCalendar.month = this.startDate.clone().date(2); + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + } + if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + } + }, + + updateCalendars: function() { + + if (this.timePicker) { + var hour, minute, second; + if (this.endDate) { + hour = parseInt(this.container.find('.left .hourselect').val(), 10); + minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } else { + hour = parseInt(this.container.find('.right .hourselect').val(), 10); + minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } + this.leftCalendar.month.hour(hour).minute(minute).second(second); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.renderCalendar('left'); + this.renderCalendar('right'); + + //highlight any predefined range matching the current start and end dates + this.container.find('.ranges li').removeClass('active'); + if (this.endDate == null) return; + + this.calculateChosenLabel(); + }, + + renderCalendar: function(side) { + + // + // Build the matrix of dates that will populate the calendar + // + + var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; + var month = calendar.month.month(); + var year = calendar.month.year(); + var hour = calendar.month.hour(); + var minute = calendar.month.minute(); + var second = calendar.month.second(); + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); + + var col, row; + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + //make the calendar object available to hoverDate/clickDate + if (side == 'left') { + this.leftCalendar.calendar = calendar; + } else { + this.rightCalendar.calendar = calendar; + } + + // + // Display the calendar + // + + var minDate = side == 'left' ? this.minDate : this.startDate; + var maxDate = this.maxDate; + var selected = side == 'left' ? this.startDate : this.endDate; + var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; + + var html = ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + var currentMonth = calendar[1][1].month(); + var currentYear = calendar[1][1].year(); + var maxYear = (maxDate && maxDate.year()) || (this.maxYear); + var minYear = (minDate && minDate.year()) || (this.minYear); + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + var monthHtml = '"; + + var yearHtml = ''; + + dateHtml = monthHtml + yearHtml; + } + + html += ''; + if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + //adjust maxDate to reflect the maxSpan setting in order to + //grey out end dates beyond the maxSpan + if (this.endDate == null && this.maxSpan) { + var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day'); + if (!maxDate || maxLimit.isBefore(maxDate)) { + maxDate = maxLimit; + } + } + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + else if (this.showISOWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + + var classes = []; + + //highlight today's date + if (calendar[row][col].isSame(new Date(), "day")) + classes.push('today'); + + //highlight weekends + if (calendar[row][col].isoWeekday() > 5) + classes.push('weekend'); + + //grey out the dates in other months displayed at beginning and end of this calendar + if (calendar[row][col].month() != calendar[1][1].month()) + classes.push('off'); + + //don't allow selection of dates before the minimum date + if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of dates after the maximum date + if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of date if a custom function decides it's invalid + if (this.isInvalidDate(calendar[row][col])) + classes.push('off', 'disabled'); + + //highlight the currently selected start date + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) + classes.push('active', 'start-date'); + + //highlight the currently selected end date + if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) + classes.push('active', 'end-date'); + + //highlight dates in-between the selected dates + if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) + classes.push('in-range'); + + //apply custom classes for this date + var isCustom = this.isCustomDate(calendar[row][col]); + if (isCustom !== false) { + if (typeof isCustom === 'string') + classes.push(isCustom); + else + Array.prototype.push.apply(classes, isCustom); + } + + var cname = '', disabled = false; + for (var i = 0; i < classes.length; i++) { + cname += classes[i] + ' '; + if (classes[i] == 'disabled') + disabled = true; + } + if (!disabled) + cname += 'available'; + + html += ''; + + } + html += ''; + } + + html += ''; + html += '
' + dateHtml + '
' + this.locale.weekLabel + '' + dayOfWeek + '
' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
'; + + this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html); + + }, + + renderTimePicker: function(side) { + + // Don't bother updating the time picker if it's currently disabled + // because an end date hasn't been clicked yet + if (side == 'right' && !this.endDate) return; + + var html, selected, minDate, maxDate = this.maxDate; + + if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate))) + maxDate = this.startDate.clone().add(this.maxSpan); + + if (side == 'left') { + selected = this.startDate.clone(); + minDate = this.minDate; + } else if (side == 'right') { + selected = this.endDate.clone(); + minDate = this.startDate; + + //Preserve the time already selected + var timeSelector = this.container.find('.drp-calendar.right .calendar-time'); + if (timeSelector.html() != '') { + + selected.hour(selected.hour() || timeSelector.find('.hourselect option:selected').val()); + selected.minute(selected.minute() || timeSelector.find('.minuteselect option:selected').val()); + selected.second(selected.second() || timeSelector.find('.secondselect option:selected').val()); + + if (!this.timePicker24Hour) { + var ampm = timeSelector.find('.ampmselect option:selected').val(); + if (ampm === 'PM' && selected.hour() < 12) + selected.hour(selected.hour() + 12); + if (ampm === 'AM' && selected.hour() === 12) + selected.hour(0); + } + + } + + if (selected.isBefore(this.startDate)) + selected = this.startDate.clone(); + + if (maxDate && selected.isAfter(maxDate)) + selected = maxDate.clone(); + + } + + // + // hours + // + + html = ' '; + + // + // minutes + // + + html += ': '; + + // + // seconds + // + + if (this.timePickerSeconds) { + html += ': '; + } + + // + // AM/PM + // + + if (!this.timePicker24Hour) { + html += ''; + } + + this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html); + + }, + + updateFormInputs: function() { + + if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + + }, + + move: function() { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('drop-up'); + + if (this.opens == 'left') { + this.container.css({ + top: containerTop, + right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else if (this.opens == 'center') { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - this.container.outerWidth() / 2, + right: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + show: function(e) { + if (this.isShowing) return; + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); + + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + // Reposition the picker if the window is resized while it's open + $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.previousRightTime = this.endDate.clone(); + + this.updateView(); + this.container.show(); + this.move(); + this.element.trigger('show.daterangepicker', this); + this.isShowing = true; + }, + + hide: function(e) { + if (!this.isShowing) return; + + //incomplete date selection, revert to last values + if (!this.endDate) { + this.startDate = this.oldStartDate.clone(); + this.endDate = this.oldEndDate.clone(); + } + + //if a new date range was selected, invoke the user callback function + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel); + + //if picker is attached to a text input, update it + this.updateElement(); + + $(document).off('.daterangepicker'); + $(window).off('.daterangepicker'); + this.container.hide(); + this.element.trigger('hide.daterangepicker', this); + this.isShowing = false; + }, + + toggle: function(e) { + if (this.isShowing) { + this.hide(); + } else { + this.show(); + } + }, + + outsideClick: function(e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length + ) return; + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + clickRange: function(e) { + var label = e.target.getAttribute('data-range-key'); + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + if (!this.alwaysShowCalendars) + this.hideCalendars(); + this.clickApply(); + } + }, + + clickPrev: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + if (this.linkedCalendars) + this.rightCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + }, + + clickNext: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + if (this.linkedCalendars) + this.leftCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + }, + + hoverDate: function(e) { + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + //highlight the dates between the start date and the date being hovered as a potential end date + var leftCalendar = this.leftCalendar; + var rightCalendar = this.rightCalendar; + var startDate = this.startDate; + if (!this.endDate) { + this.container.find('.drp-calendar tbody td').each(function(index, el) { + + //skip week numbers, only look at dates + if ($(el).hasClass('week')) return; + + var title = $(el).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(el).parents('.drp-calendar'); + var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; + + if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { + $(el).addClass('in-range'); + } else { + $(el).removeClass('in-range'); + } + + }); + } + + }, + + clickDate: function(e) { + + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + // + // this function needs to do a few things: + // * alternate between selecting a start and end date for the range, + // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date + // * if autoapply is enabled, and an end date was chosen, apply the selection + // * if single date picker mode, and time picker isn't enabled, apply the selection immediately + // * if one of the inputs above the calendars was focused, cancel that manual input + // + + if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start + if (this.timePicker) { + var hour = parseInt(this.container.find('.left .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.endDate = null; + this.setStartDate(date.clone()); + } else if (!this.endDate && date.isBefore(this.startDate)) { + //special case: clicking the same date for start/end, + //but the time of the end date is before the start date + this.setEndDate(this.startDate.clone()); + } else { // picking end + if (this.timePicker) { + var hour = parseInt(this.container.find('.right .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.setEndDate(date.clone()); + if (this.autoApply) { + this.calculateChosenLabel(); + this.clickApply(); + } + } + + if (this.singleDatePicker) { + this.setEndDate(this.startDate); + if (!this.timePicker) + this.clickApply(); + } + + this.updateView(); + + //This is to cancel the blur event handler if the mouse was in one of the inputs + e.stopPropagation(); + + }, + + calculateChosenLabel: function () { + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD HH:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key'); + } else { + this.chosenLabel = null; + } + this.showCalendars(); + } + }, + + clickApply: function(e) { + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function(e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + monthOrYearChanged: function(e) { + var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.drp-calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); + } else { + this.rightCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); + } + this.updateCalendars(); + }, + + timeChanged: function(e) { + + var cal = $(e.target).closest('.drp-calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; + + if (!this.timePicker24Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.setStartDate(start); + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { + this.setEndDate(start.clone()); + } + } else if (this.endDate) { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.setEndDate(end); + } + + //update the calendars so all clickable dates reflect the new time component + this.updateCalendars(); + + //update the form inputs above the calendars with the new time + this.updateFormInputs(); + + //re-render the time pickers because changing one selection can affect what's enabled in another + this.renderTimePicker('left'); + this.renderTimePicker('right'); + + }, + + elementChanged: function() { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.locale.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.locale.format); + end = moment(dateString[1], this.locale.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.locale.format); + end = start; + } + + if (!start.isValid() || !end.isValid()) return; + + this.setStartDate(start); + this.setEndDate(end); + this.updateView(); + }, + + keydown: function(e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } + }, + + updateElement: function() { + if (this.element.is('input') && this.autoUpdateInput) { + var newValue = this.startDate.format(this.locale.format); + if (!this.singleDatePicker) { + newValue += this.locale.separator + this.endDate.format(this.locale.format); + } + if (newValue !== this.element.val()) { + this.element.val(newValue).trigger('change'); + } + } + }, + + remove: function() { + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData(); + } + + }; + + $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); + this.each(function() { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); + }); + return this; + }; + + return DateRangePicker; + +})); diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js new file mode 100644 index 000000000..9c5c544d4 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js @@ -0,0 +1 @@ +!function(t,e){if("function"==typeof define&&define.amd)define(["moment","jquery"],function(t,a){return a.fn||(a.fn={}),"function"!=typeof t&&t.default&&(t=t.default),e(t,a)});else if("object"==typeof module&&module.exports){var a="undefined"!=typeof window?window.jQuery:void 0;a||(a=require("jquery")).fn||(a.fn={});var i="undefined"!=typeof window&&void 0!==window.moment?window.moment:require("moment");module.exports=e(i,a)}else t.daterangepicker=e(t.moment,t.jQuery)}(this,function(t,e){var a=function(a,i,s){if(this.parentEl="body",this.element=e(a),this.startDate=t().startOf("day"),this.endDate=t().endOf("day"),this.minDate=!1,this.maxDate=!1,this.maxSpan=!1,this.autoApply=!1,this.singleDatePicker=!1,this.showDropdowns=!1,this.minYear=t().subtract(100,"year").format("YYYY"),this.maxYear=t().add(100,"year").format("YYYY"),this.showWeekNumbers=!1,this.showISOWeekNumbers=!1,this.showCustomRangeLabel=!0,this.timePicker=!1,this.timePicker24Hour=!1,this.timePickerIncrement=1,this.timePickerSeconds=!1,this.linkedCalendars=!0,this.autoUpdateInput=!0,this.alwaysShowCalendars=!1,this.ranges={},this.opens="right",this.element.hasClass("pull-right")&&(this.opens="left"),this.drops="down",this.element.hasClass("dropup")&&(this.drops="up"),this.buttonClasses="btn btn-sm",this.applyButtonClasses="btn-primary",this.cancelButtonClasses="btn-default",this.locale={direction:"ltr",format:t.localeData().longDateFormat("L"),separator:" - ",applyLabel:"Apply",cancelLabel:"Cancel",weekLabel:"W",customRangeLabel:"Custom Range",daysOfWeek:t.weekdaysMin(),monthNames:t.monthsShort(),firstDay:t.localeData().firstDayOfWeek()},this.callback=function(){},this.isShowing=!1,this.leftCalendar={},this.rightCalendar={},"object"==typeof i&&null!==i||(i={}),"string"==typeof(i=e.extend(this.element.data(),i)).template||i.template instanceof e||(i.template='
'),this.parentEl=i.parentEl&&e(i.parentEl).length?e(i.parentEl):e(this.parentEl),this.container=e(i.template).appendTo(this.parentEl),"object"==typeof i.locale&&("string"==typeof i.locale.direction&&(this.locale.direction=i.locale.direction),"string"==typeof i.locale.format&&(this.locale.format=i.locale.format),"string"==typeof i.locale.separator&&(this.locale.separator=i.locale.separator),"object"==typeof i.locale.daysOfWeek&&(this.locale.daysOfWeek=i.locale.daysOfWeek.slice()),"object"==typeof i.locale.monthNames&&(this.locale.monthNames=i.locale.monthNames.slice()),"number"==typeof i.locale.firstDay&&(this.locale.firstDay=i.locale.firstDay),"string"==typeof i.locale.applyLabel&&(this.locale.applyLabel=i.locale.applyLabel),"string"==typeof i.locale.cancelLabel&&(this.locale.cancelLabel=i.locale.cancelLabel),"string"==typeof i.locale.weekLabel&&(this.locale.weekLabel=i.locale.weekLabel),"string"==typeof i.locale.customRangeLabel)){(f=document.createElement("textarea")).innerHTML=i.locale.customRangeLabel;var n=f.value;this.locale.customRangeLabel=n}if(this.container.addClass(this.locale.direction),"string"==typeof i.startDate&&(this.startDate=t(i.startDate,this.locale.format)),"string"==typeof i.endDate&&(this.endDate=t(i.endDate,this.locale.format)),"string"==typeof i.minDate&&(this.minDate=t(i.minDate,this.locale.format)),"string"==typeof i.maxDate&&(this.maxDate=t(i.maxDate,this.locale.format)),"object"==typeof i.startDate&&(this.startDate=t(i.startDate)),"object"==typeof i.endDate&&(this.endDate=t(i.endDate)),"object"==typeof i.minDate&&(this.minDate=t(i.minDate)),"object"==typeof i.maxDate&&(this.maxDate=t(i.maxDate)),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),"string"==typeof i.applyButtonClasses&&(this.applyButtonClasses=i.applyButtonClasses),"string"==typeof i.applyClass&&(this.applyButtonClasses=i.applyClass),"string"==typeof i.cancelButtonClasses&&(this.cancelButtonClasses=i.cancelButtonClasses),"string"==typeof i.cancelClass&&(this.cancelButtonClasses=i.cancelClass),"object"==typeof i.maxSpan&&(this.maxSpan=i.maxSpan),"object"==typeof i.dateLimit&&(this.maxSpan=i.dateLimit),"string"==typeof i.opens&&(this.opens=i.opens),"string"==typeof i.drops&&(this.drops=i.drops),"boolean"==typeof i.showWeekNumbers&&(this.showWeekNumbers=i.showWeekNumbers),"boolean"==typeof i.showISOWeekNumbers&&(this.showISOWeekNumbers=i.showISOWeekNumbers),"string"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses),"object"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses.join(" ")),"boolean"==typeof i.showDropdowns&&(this.showDropdowns=i.showDropdowns),"number"==typeof i.minYear&&(this.minYear=i.minYear),"number"==typeof i.maxYear&&(this.maxYear=i.maxYear),"boolean"==typeof i.showCustomRangeLabel&&(this.showCustomRangeLabel=i.showCustomRangeLabel),"boolean"==typeof i.singleDatePicker&&(this.singleDatePicker=i.singleDatePicker,this.singleDatePicker&&(this.endDate=this.startDate.clone())),"boolean"==typeof i.timePicker&&(this.timePicker=i.timePicker),"boolean"==typeof i.timePickerSeconds&&(this.timePickerSeconds=i.timePickerSeconds),"number"==typeof i.timePickerIncrement&&(this.timePickerIncrement=i.timePickerIncrement),"boolean"==typeof i.timePicker24Hour&&(this.timePicker24Hour=i.timePicker24Hour),"boolean"==typeof i.autoApply&&(this.autoApply=i.autoApply),"boolean"==typeof i.autoUpdateInput&&(this.autoUpdateInput=i.autoUpdateInput),"boolean"==typeof i.linkedCalendars&&(this.linkedCalendars=i.linkedCalendars),"function"==typeof i.isInvalidDate&&(this.isInvalidDate=i.isInvalidDate),"function"==typeof i.isCustomDate&&(this.isCustomDate=i.isCustomDate),"boolean"==typeof i.alwaysShowCalendars&&(this.alwaysShowCalendars=i.alwaysShowCalendars),0!=this.locale.firstDay)for(var r=this.locale.firstDay;r>0;)this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),r--;var o,h,l;if(void 0===i.startDate&&void 0===i.endDate&&e(this.element).is(":text")){var c=e(this.element).val(),d=c.split(this.locale.separator);o=h=null,2==d.length?(o=t(d[0],this.locale.format),h=t(d[1],this.locale.format)):this.singleDatePicker&&""!==c&&(o=t(c,this.locale.format),h=t(c,this.locale.format)),null!==o&&null!==h&&(this.setStartDate(o),this.setEndDate(h))}if("object"==typeof i.ranges){for(l in i.ranges){o="string"==typeof i.ranges[l][0]?t(i.ranges[l][0],this.locale.format):t(i.ranges[l][0]),h="string"==typeof i.ranges[l][1]?t(i.ranges[l][1],this.locale.format):t(i.ranges[l][1]),this.minDate&&o.isBefore(this.minDate)&&(o=this.minDate.clone());var m=this.maxDate;if(this.maxSpan&&m&&o.clone().add(this.maxSpan).isAfter(m)&&(m=o.clone().add(this.maxSpan)),m&&h.isAfter(m)&&(h=m.clone()),!(this.minDate&&h.isBefore(this.minDate,this.timepicker?"minute":"day")||m&&o.isAfter(m,this.timepicker?"minute":"day"))){var f;(f=document.createElement("textarea")).innerHTML=l;n=f.value;this.ranges[n]=[o,h]}}var p="
    ";for(l in this.ranges)p+='
  • '+l+"
  • ";this.showCustomRangeLabel&&(p+='
  • '+this.locale.customRangeLabel+"
  • "),p+="
",this.container.find(".ranges").prepend(p)}"function"==typeof s&&(this.callback=s),this.timePicker||(this.startDate=this.startDate.startOf("day"),this.endDate=this.endDate.endOf("day"),this.container.find(".calendar-time").hide()),this.timePicker&&this.autoApply&&(this.autoApply=!1),this.autoApply&&this.container.addClass("auto-apply"),"object"==typeof i.ranges&&this.container.addClass("show-ranges"),this.singleDatePicker&&(this.container.addClass("single"),this.container.find(".drp-calendar.left").addClass("single"),this.container.find(".drp-calendar.left").show(),this.container.find(".drp-calendar.right").hide(),this.timePicker||this.container.addClass("auto-apply")),(void 0===i.ranges&&!this.singleDatePicker||this.alwaysShowCalendars)&&this.container.addClass("show-calendar"),this.container.addClass("opens"+this.opens),this.container.find(".applyBtn, .cancelBtn").addClass(this.buttonClasses),this.applyButtonClasses.length&&this.container.find(".applyBtn").addClass(this.applyButtonClasses),this.cancelButtonClasses.length&&this.container.find(".cancelBtn").addClass(this.cancelButtonClasses),this.container.find(".applyBtn").html(this.locale.applyLabel),this.container.find(".cancelBtn").html(this.locale.cancelLabel),this.container.find(".drp-calendar").on("click.daterangepicker",".prev",e.proxy(this.clickPrev,this)).on("click.daterangepicker",".next",e.proxy(this.clickNext,this)).on("mousedown.daterangepicker","td.available",e.proxy(this.clickDate,this)).on("mouseenter.daterangepicker","td.available",e.proxy(this.hoverDate,this)).on("change.daterangepicker","select.yearselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.monthselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.hourselect,select.minuteselect,select.secondselect,select.ampmselect",e.proxy(this.timeChanged,this)),this.container.find(".ranges").on("click.daterangepicker","li",e.proxy(this.clickRange,this)),this.container.find(".drp-buttons").on("click.daterangepicker","button.applyBtn",e.proxy(this.clickApply,this)).on("click.daterangepicker","button.cancelBtn",e.proxy(this.clickCancel,this)),this.element.is("input")||this.element.is("button")?this.element.on({"click.daterangepicker":e.proxy(this.show,this),"focus.daterangepicker":e.proxy(this.show,this),"keyup.daterangepicker":e.proxy(this.elementChanged,this),"keydown.daterangepicker":e.proxy(this.keydown,this)}):(this.element.on("click.daterangepicker",e.proxy(this.toggle,this)),this.element.on("keydown.daterangepicker",e.proxy(this.toggle,this))),this.updateElement()};return a.prototype={constructor:a,setStartDate:function(e){"string"==typeof e&&(this.startDate=t(e,this.locale.format)),"object"==typeof e&&(this.startDate=t(e)),this.timePicker||(this.startDate=this.startDate.startOf("day")),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.maxDate&&this.startDate.isAfter(this.maxDate)&&(this.startDate=this.maxDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.floor(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.isShowing||this.updateElement(),this.updateMonthsInView()},setEndDate:function(e){"string"==typeof e&&(this.endDate=t(e,this.locale.format)),"object"==typeof e&&(this.endDate=t(e)),this.timePicker||(this.endDate=this.endDate.add(1,"d").startOf("day").subtract(1,"second")),this.timePicker&&this.timePickerIncrement&&this.endDate.minute(Math.round(this.endDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.endDate.isBefore(this.startDate)&&(this.endDate=this.startDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),this.maxSpan&&this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)&&(this.endDate=this.startDate.clone().add(this.maxSpan)),this.previousRightTime=this.endDate.clone(),this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.isShowing||this.updateElement(),this.updateMonthsInView()},isInvalidDate:function(){return!1},isCustomDate:function(){return!1},updateView:function(){this.timePicker&&(this.renderTimePicker("left"),this.renderTimePicker("right"),this.endDate?this.container.find(".right .calendar-time select").removeAttr("disabled").removeClass("disabled"):this.container.find(".right .calendar-time select").attr("disabled","disabled").addClass("disabled")),this.endDate&&this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.updateMonthsInView(),this.updateCalendars(),this.updateFormInputs()},updateMonthsInView:function(){if(this.endDate){if(!this.singleDatePicker&&this.leftCalendar.month&&this.rightCalendar.month&&(this.startDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.startDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM"))&&(this.endDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.endDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM")))return;this.leftCalendar.month=this.startDate.clone().date(2),this.linkedCalendars||this.endDate.month()==this.startDate.month()&&this.endDate.year()==this.startDate.year()?this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"):this.rightCalendar.month=this.endDate.clone().date(2)}else this.leftCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&this.rightCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&(this.leftCalendar.month=this.startDate.clone().date(2),this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"));this.maxDate&&this.linkedCalendars&&!this.singleDatePicker&&this.rightCalendar.month>this.maxDate&&(this.rightCalendar.month=this.maxDate.clone().date(2),this.leftCalendar.month=this.maxDate.clone().date(2).subtract(1,"month"))},updateCalendars:function(){if(this.timePicker){var t,e,a,i;if(this.endDate){if(t=parseInt(this.container.find(".left .hourselect").val(),10),e=parseInt(this.container.find(".left .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".left .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0)}else if(t=parseInt(this.container.find(".right .hourselect").val(),10),e=parseInt(this.container.find(".right .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".right .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0);this.leftCalendar.month.hour(t).minute(e).second(a),this.rightCalendar.month.hour(t).minute(e).second(a)}this.renderCalendar("left"),this.renderCalendar("right"),this.container.find(".ranges li").removeClass("active"),null!=this.endDate&&this.calculateChosenLabel()},renderCalendar:function(a){var i,s=(i="left"==a?this.leftCalendar:this.rightCalendar).month.month(),n=i.month.year(),r=i.month.hour(),o=i.month.minute(),h=i.month.second(),l=t([n,s]).daysInMonth(),c=t([n,s,1]),d=t([n,s,l]),m=t(c).subtract(1,"month").month(),f=t(c).subtract(1,"month").year(),p=t([f,m]).daysInMonth(),u=c.day();(i=[]).firstDay=c,i.lastDay=d;for(var D=0;D<6;D++)i[D]=[];var g=p-u+this.locale.firstDay+1;g>p&&(g-=7),u==this.locale.firstDay&&(g=p-6);for(var y=t([f,m,g,12,o,h]),k=(D=0,0),b=0;D<42;D++,k++,y=t(y).add(24,"hour"))D>0&&k%7==0&&(k=0,b++),i[b][k]=y.clone().hour(r).minute(o).second(h),y.hour(12),this.minDate&&i[b][k].format("YYYY-MM-DD")==this.minDate.format("YYYY-MM-DD")&&i[b][k].isBefore(this.minDate)&&"left"==a&&(i[b][k]=this.minDate.clone()),this.maxDate&&i[b][k].format("YYYY-MM-DD")==this.maxDate.format("YYYY-MM-DD")&&i[b][k].isAfter(this.maxDate)&&"right"==a&&(i[b][k]=this.maxDate.clone());"left"==a?this.leftCalendar.calendar=i:this.rightCalendar.calendar=i;var C="left"==a?this.minDate:this.startDate,v=this.maxDate,Y=("left"==a?this.startDate:this.endDate,this.locale.direction,'');Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=""),C&&!C.isBefore(i.firstDay)||this.linkedCalendars&&"left"!=a?Y+="":Y+='';var w=this.locale.monthNames[i[1][1].month()]+i[1][1].format(" YYYY");if(this.showDropdowns){for(var P=i[1][1].month(),x=i[1][1].year(),M=v&&v.year()||this.maxYear,S=C&&C.year()||this.minYear,I=x==S,B=x==M,A='";for(var E='")}if(Y+='",v&&!v.isAfter(i.lastDay)||this.linkedCalendars&&"right"!=a&&!this.singleDatePicker?Y+="":Y+='',Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+='"),e.each(this.locale.daysOfWeek,function(t,e){Y+=""}),Y+="",Y+="",Y+="",null==this.endDate&&this.maxSpan){var O=this.startDate.clone().add(this.maxSpan).endOf("day");v&&!O.isBefore(v)||(v=O)}for(b=0;b<6;b++){Y+="",this.showWeekNumbers?Y+='":this.showISOWeekNumbers&&(Y+='");for(k=0;k<7;k++){var N=[];i[b][k].isSame(new Date,"day")&&N.push("today"),i[b][k].isoWeekday()>5&&N.push("weekend"),i[b][k].month()!=i[1][1].month()&&N.push("off"),this.minDate&&i[b][k].isBefore(this.minDate,"day")&&N.push("off","disabled"),v&&i[b][k].isAfter(v,"day")&&N.push("off","disabled"),this.isInvalidDate(i[b][k])&&N.push("off","disabled"),i[b][k].format("YYYY-MM-DD")==this.startDate.format("YYYY-MM-DD")&&N.push("active","start-date"),null!=this.endDate&&i[b][k].format("YYYY-MM-DD")==this.endDate.format("YYYY-MM-DD")&&N.push("active","end-date"),null!=this.endDate&&i[b][k]>this.startDate&&i[b][k]'+i[b][k].date()+""}Y+=""}Y+="",Y+="
'+w+"
'+this.locale.weekLabel+""+e+"
'+i[b][0].week()+"'+i[b][0].isoWeek()+"
",this.container.find(".drp-calendar."+a+" .calendar-table").html(Y)},renderTimePicker:function(t){if("right"!=t||this.endDate){var e,a,i,s=this.maxDate;if(!this.maxSpan||this.maxDate&&!this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate)||(s=this.startDate.clone().add(this.maxSpan)),"left"==t)a=this.startDate.clone(),i=this.minDate;else if("right"==t){a=this.endDate.clone(),i=this.startDate;var n=this.container.find(".drp-calendar.right .calendar-time");if(""!=n.html()&&(a.hour(a.hour()||n.find(".hourselect option:selected").val()),a.minute(a.minute()||n.find(".minuteselect option:selected").val()),a.second(a.second()||n.find(".secondselect option:selected").val()),!this.timePicker24Hour)){var r=n.find(".ampmselect option:selected").val();"PM"===r&&a.hour()<12&&a.hour(a.hour()+12),"AM"===r&&12===a.hour()&&a.hour(0)}a.isBefore(this.startDate)&&(a=this.startDate.clone()),s&&a.isAfter(s)&&(a=s.clone())}e=' ",e+=': ",this.timePickerSeconds){e+=': "}if(!this.timePicker24Hour){e+='"}this.container.find(".drp-calendar."+t+" .calendar-time").html(e)}},updateFormInputs:function(){this.singleDatePicker||this.endDate&&(this.startDate.isBefore(this.endDate)||this.startDate.isSame(this.endDate))?this.container.find("button.applyBtn").removeAttr("disabled"):this.container.find("button.applyBtn").attr("disabled","disabled")},move:function(){var t,a={top:0,left:0},i=e(window).width();this.parentEl.is("body")||(a={top:this.parentEl.offset().top-this.parentEl.scrollTop(),left:this.parentEl.offset().left-this.parentEl.scrollLeft()},i=this.parentEl[0].clientWidth+this.parentEl.offset().left),t="up"==this.drops?this.element.offset().top-this.container.outerHeight()-a.top:this.element.offset().top+this.element.outerHeight()-a.top,this.container["up"==this.drops?"addClass":"removeClass"]("drop-up"),"left"==this.opens?(this.container.css({top:t,right:i-this.element.offset().left-this.element.outerWidth(),left:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):"center"==this.opens?(this.container.css({top:t,left:this.element.offset().left-a.left+this.element.outerWidth()/2-this.container.outerWidth()/2,right:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):(this.container.css({top:t,left:this.element.offset().left-a.left,right:"auto"}),this.container.offset().left+this.container.outerWidth()>e(window).width()&&this.container.css({left:"auto",right:0}))},show:function(t){this.isShowing||(this._outsideClickProxy=e.proxy(function(t){this.outsideClick(t)},this),e(document).on("mousedown.daterangepicker",this._outsideClickProxy).on("touchend.daterangepicker",this._outsideClickProxy).on("click.daterangepicker","[data-toggle=dropdown]",this._outsideClickProxy).on("focusin.daterangepicker",this._outsideClickProxy),e(window).on("resize.daterangepicker",e.proxy(function(t){this.move(t)},this)),this.oldStartDate=this.startDate.clone(),this.oldEndDate=this.endDate.clone(),this.previousRightTime=this.endDate.clone(),this.updateView(),this.container.show(),this.move(),this.element.trigger("show.daterangepicker",this),this.isShowing=!0)},hide:function(t){this.isShowing&&(this.endDate||(this.startDate=this.oldStartDate.clone(),this.endDate=this.oldEndDate.clone()),this.startDate.isSame(this.oldStartDate)&&this.endDate.isSame(this.oldEndDate)||this.callback(this.startDate.clone(),this.endDate.clone(),this.chosenLabel),this.updateElement(),e(document).off(".daterangepicker"),e(window).off(".daterangepicker"),this.container.hide(),this.element.trigger("hide.daterangepicker",this),this.isShowing=!1)},toggle:function(t){this.isShowing?this.hide():this.show()},outsideClick:function(t){var a=e(t.target);"focusin"==t.type||a.closest(this.element).length||a.closest(this.container).length||a.closest(".calendar-table").length||(this.hide(),this.element.trigger("outsideClick.daterangepicker",this))},showCalendars:function(){this.container.addClass("show-calendar"),this.move(),this.element.trigger("showCalendar.daterangepicker",this)},hideCalendars:function(){this.container.removeClass("show-calendar"),this.element.trigger("hideCalendar.daterangepicker",this)},clickRange:function(t){var e=t.target.getAttribute("data-range-key");if(this.chosenLabel=e,e==this.locale.customRangeLabel)this.showCalendars();else{var a=this.ranges[e];this.startDate=a[0],this.endDate=a[1],this.timePicker||(this.startDate.startOf("day"),this.endDate.endOf("day")),this.alwaysShowCalendars||this.hideCalendars(),this.clickApply()}},clickPrev:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?(this.leftCalendar.month.subtract(1,"month"),this.linkedCalendars&&this.rightCalendar.month.subtract(1,"month")):this.rightCalendar.month.subtract(1,"month"),this.updateCalendars()},clickNext:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.month.add(1,"month"):(this.rightCalendar.month.add(1,"month"),this.linkedCalendars&&this.leftCalendar.month.add(1,"month")),this.updateCalendars()},hoverDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s],r=this.leftCalendar,o=this.rightCalendar,h=this.startDate;this.endDate||this.container.find(".drp-calendar tbody td").each(function(t,a){if(!e(a).hasClass("week")){var i=e(a).attr("data-title"),s=i.substr(1,1),l=i.substr(3,1),c=e(a).parents(".drp-calendar").hasClass("left")?r.calendar[s][l]:o.calendar[s][l];c.isAfter(h)&&c.isBefore(n)||c.isSame(n,"day")?e(a).addClass("in-range"):e(a).removeClass("in-range")}})}},clickDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s];if(this.endDate||n.isBefore(this.startDate,"day")){if(this.timePicker){var r=parseInt(this.container.find(".left .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".left .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);var o=parseInt(this.container.find(".left .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.endDate=null,this.setStartDate(n.clone())}else if(!this.endDate&&n.isBefore(this.startDate))this.setEndDate(this.startDate.clone());else{if(this.timePicker){var l;r=parseInt(this.container.find(".right .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".right .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);o=parseInt(this.container.find(".right .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.setEndDate(n.clone()),this.autoApply&&(this.calculateChosenLabel(),this.clickApply())}this.singleDatePicker&&(this.setEndDate(this.startDate),this.timePicker||this.clickApply()),this.updateView(),t.stopPropagation()}},calculateChosenLabel:function(){var t=!0,e=0;for(var a in this.ranges){if(this.timePicker){var i=this.timePickerSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm";if(this.startDate.format(i)==this.ranges[a][0].format(i)&&this.endDate.format(i)==this.ranges[a][1].format(i)){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}}else if(this.startDate.format("YYYY-MM-DD")==this.ranges[a][0].format("YYYY-MM-DD")&&this.endDate.format("YYYY-MM-DD")==this.ranges[a][1].format("YYYY-MM-DD")){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}e++}t&&(this.showCustomRangeLabel?this.chosenLabel=this.container.find(".ranges li:last").addClass("active").attr("data-range-key"):this.chosenLabel=null,this.showCalendars())},clickApply:function(t){this.hide(),this.element.trigger("apply.daterangepicker",this)},clickCancel:function(t){this.startDate=this.oldStartDate,this.endDate=this.oldEndDate,this.hide(),this.element.trigger("cancel.daterangepicker",this)},monthOrYearChanged:function(t){var a=e(t.target).closest(".drp-calendar").hasClass("left"),i=a?"left":"right",s=this.container.find(".drp-calendar."+i),n=parseInt(s.find(".monthselect").val(),10),r=s.find(".yearselect").val();a||(rthis.maxDate.year()||r==this.maxDate.year()&&n>this.maxDate.month())&&(n=this.maxDate.month(),r=this.maxDate.year()),a?(this.leftCalendar.month.month(n).year(r),this.linkedCalendars&&(this.rightCalendar.month=this.leftCalendar.month.clone().add(1,"month"))):(this.rightCalendar.month.month(n).year(r),this.linkedCalendars&&(this.leftCalendar.month=this.rightCalendar.month.clone().subtract(1,"month"))),this.updateCalendars()},timeChanged:function(t){var a=e(t.target).closest(".drp-calendar"),i=a.hasClass("left"),s=parseInt(a.find(".hourselect").val(),10),n=parseInt(a.find(".minuteselect").val(),10),r=this.timePickerSeconds?parseInt(a.find(".secondselect").val(),10):0;if(!this.timePicker24Hour){var o=a.find(".ampmselect").val();"PM"===o&&s<12&&(s+=12),"AM"===o&&12===s&&(s=0)}if(i){var h=this.startDate.clone();h.hour(s),h.minute(n),h.second(r),this.setStartDate(h),this.singleDatePicker?this.endDate=this.startDate.clone():this.endDate&&this.endDate.format("YYYY-MM-DD")==h.format("YYYY-MM-DD")&&this.endDate.isBefore(h)&&this.setEndDate(h.clone())}else if(this.endDate){var l=this.endDate.clone();l.hour(s),l.minute(n),l.second(r),this.setEndDate(l)}this.updateCalendars(),this.updateFormInputs(),this.renderTimePicker("left"),this.renderTimePicker("right")},elementChanged:function(){if(this.element.is("input")&&this.element.val().length){var e=this.element.val().split(this.locale.separator),a=null,i=null;2===e.length&&(a=t(e[0],this.locale.format),i=t(e[1],this.locale.format)),(this.singleDatePicker||null===a||null===i)&&(i=a=t(this.element.val(),this.locale.format)),a.isValid()&&i.isValid()&&(this.setStartDate(a),this.setEndDate(i),this.updateView())}},keydown:function(t){9!==t.keyCode&&13!==t.keyCode||this.hide(),27===t.keyCode&&(t.preventDefault(),t.stopPropagation(),this.hide())},updateElement:function(){if(this.element.is("input")&&this.autoUpdateInput){var t=this.startDate.format(this.locale.format);this.singleDatePicker||(t+=this.locale.separator+this.endDate.format(this.locale.format)),t!==this.element.val()&&this.element.val(t).trigger("change")}},remove:function(){this.container.remove(),this.element.off(".daterangepicker"),this.element.removeData()}},e.fn.daterangepicker=function(t,i){var s=e.extend(!0,{},e.fn.daterangepicker.defaultOptions,t);return this.each(function(){var t=e(this);t.data("daterangepicker")&&t.data("daterangepicker").remove(),t.data("daterangepicker",new a(t,s,i))}),this},a}); \ No newline at end of file From bbcd84f5d211b7fee0d4d560819872fec03ea9b2 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 3 Dec 2018 11:39:33 +0800 Subject: [PATCH 059/247] Initial working POC for DateRange Widget --- .../design/addins/client/moment/Moment.java | 21 + .../daterange/DateRangeClientBundle.java | 8 +- .../daterange/DateRangeClientDebugBundle.java | 7 +- .../{DateRange.java => DateRangePicker.java} | 234 ++- .../client/daterange/events/ApplyEvent.java | 19 +- .../client/daterange/events/CancelEvent.java | 17 +- .../daterange/events/CloseCalendarEvent.java | 27 +- .../daterange/events/DateRangeEvents.java | 4 + .../events/HasDateRangeHandlers.java | 5 +- .../daterange/events/OpenCalendarEvent.java | 19 +- .../client/daterange/js/DateRangeLocale.java | 166 ++ .../client/daterange/js/DateRangeOptions.java | 362 +++- .../js/DateRangeVerticalPosition.java | 7 - .../daterange/js/DropdownAlignment.java | 5 + .../client/daterange/js/DropdownPosition.java | 5 + .../daterange/js/HasDateRangeOptions.java | 120 +- .../client/daterange/js/JsDateRange.java | 20 +- .../client/daterange/js/LocaleString.java | 18 + .../client/daterange/js/RangeOption.java | 50 + .../incubator/client/daterange/js/Today.java | 12 + .../css/daterangepicker-materialize.css | 146 ++ .../css/daterangepicker-materialize.min.css | 146 ++ .../css/daterangepicker-override.css | 7 - .../css/daterangepicker-override.min.css | 7 - .../daterange/resources/js/daterangepicker.js | 78 +- .../resources/js/daterangepicker.min.js | 1531 ++++++++++++++++- 26 files changed, 2809 insertions(+), 232 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/moment/Moment.java rename src/main/java/gwt/material/design/incubator/client/daterange/{DateRange.java => DateRangePicker.java} (65%) create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css delete mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css delete mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css diff --git a/src/main/java/gwt/material/design/addins/client/moment/Moment.java b/src/main/java/gwt/material/design/addins/client/moment/Moment.java new file mode 100644 index 000000000..d9d84b623 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/moment/Moment.java @@ -0,0 +1,21 @@ +package gwt.material.design.addins.client.moment; + +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, namespace = JsPackage.GLOBAL) +public class Moment { + + @JsMethod(namespace = JsPackage.GLOBAL) + public static native Moment moment(); + + @JsMethod + public native Moment subtract(int number, String duration); + + @JsMethod + public native Moment startOf(String duration); + + @JsMethod + public native Moment endOf(String duration); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java index d45cbeadc..67955be16 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java @@ -3,7 +3,13 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; +/** + * Client Bundle for {@link DateRangePicker} + * + * @author kevzlou7979 + */ public interface DateRangeClientBundle extends ClientBundle { DateRangeClientBundle INSTANCE = GWT.create(DateRangeClientBundle.class); @@ -14,6 +20,6 @@ public interface DateRangeClientBundle extends ClientBundle { @Source("resources/css/daterangepicker.min.css") TextResource dateRangePickerCss(); - @Source("resources/css/daterangepicker-override.min.css") + @Source("resources/css/daterangepicker-materialize.min.css") TextResource dateRangePickerOverrideCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java index 65208b816..97709c8ca 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java @@ -4,6 +4,11 @@ import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.TextResource; +/** + * Client Bundle for {@link DateRangePicker} + * + * @author kevzlou7979 + */ public interface DateRangeClientDebugBundle extends ClientBundle { DateRangeClientDebugBundle INSTANCE = GWT.create(DateRangeClientDebugBundle.class); @@ -14,6 +19,6 @@ public interface DateRangeClientDebugBundle extends ClientBundle { @Source("resources/css/daterangepicker.css") TextResource dateRangePickerDebugCss(); - @Source("resources/css/daterangepicker-override.css") + @Source("resources/css/daterangepicker-materialize.css") TextResource dateRangePickerOverrideDebugCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java similarity index 65% rename from src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java rename to src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 29b5ceca9..5e37327b7 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRange.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -1,11 +1,15 @@ package gwt.material.design.incubator.client.daterange; import com.google.gwt.dom.client.Document; -import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.Style; import com.google.gwt.event.logical.shared.*; import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.TextBox; +import gwt.material.design.addins.client.combobox.MaterialComboBoxDebugClientBundle; +import gwt.material.design.addins.client.combobox.js.JsComboBox; +import gwt.material.design.addins.client.combobox.js.JsComboBoxOptions; +import gwt.material.design.addins.client.moment.Moment; import gwt.material.design.addins.client.moment.resources.MomentClientBundle; import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; import gwt.material.design.client.MaterialDesignBase; @@ -13,12 +17,11 @@ import gwt.material.design.client.base.mixin.FieldTypeMixin; import gwt.material.design.client.base.mixin.ReadOnlyMixin; import gwt.material.design.client.base.mixin.StatusTextMixin; +import gwt.material.design.client.base.viewport.Resolution; +import gwt.material.design.client.base.viewport.ViewPort; import gwt.material.design.client.constants.*; -import gwt.material.design.client.ui.MaterialDatePicker; import gwt.material.design.client.ui.MaterialIcon; import gwt.material.design.client.ui.MaterialLabel; -import gwt.material.design.client.ui.MaterialToast; -import gwt.material.design.client.ui.html.DateInput; import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.daterange.events.*; @@ -27,10 +30,11 @@ import java.util.Date; +import static gwt.material.design.addins.client.moment.Moment.moment; import static gwt.material.design.incubator.client.daterange.js.JsDateRange.$; -public class DateRange extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, +public class DateRangePicker extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder { static { @@ -45,19 +49,21 @@ public class DateRange extends AbstractValueWidget implements HasDateRange MaterialDesignBase.injectCss(DateRangeClientBundle.INSTANCE.dateRangePickerCss()); MaterialDesignBase.injectCss(DateRangeClientBundle.INSTANCE.dateRangePickerOverrideCss()); } + MaterialDesignBase.injectDebugJs(MaterialComboBoxDebugClientBundle.INSTANCE.select2DebugJs()); + MaterialDesignBase.injectCss(MaterialComboBoxDebugClientBundle.INSTANCE.select2DebugCss()); } private static final String DATE_RANGE_STYLENAME = "date-range-picker"; - private FieldTypeMixin fieldTypeMixin; + private FieldTypeMixin fieldTypeMixin; private TextBox dateInput = new TextBox(); private Label label = new Label(); private MaterialLabel errorLabel = new MaterialLabel(); private MaterialIcon icon = new MaterialIcon(); private DateRangeOptions options = new DateRangeOptions(); private StatusTextMixin statusTextMixin; - private ReadOnlyMixin readOnlyMixin; + private ReadOnlyMixin readOnlyMixin; - public DateRange() { + public DateRangePicker() { super(Document.get().createDivElement(), CssName.INPUT_FIELD, DATE_RANGE_STYLENAME); } @@ -74,39 +80,80 @@ protected void load() { add(label); add(errorLabel); - getInputElement().daterangepicker(options); + ViewPort.when(Resolution.ALL_MOBILE).then(param1 -> { + setDropdownAlignment(DropdownAlignment.CENTER); + }); + + getInputElement().daterangepicker(options, (param1, param2, param3) -> { + //TODO Change event + }); + + getInputElement().on(DateRangeEvents.UPDATE_CALENDAR, (e, picker) -> { + // OpenEvent.fire(this, picker); + toggleTypeAssist(); + return true; + }); + + getInputElement().on(DateRangeEvents.NEXT, (e, picker) -> { + // OpenEvent.fire(this, picker); + toggleTypeAssist(); + return true; + }); + + getInputElement().on(DateRangeEvents.PREV, (e, picker) -> { + // OpenEvent.fire(this, picker); + toggleTypeAssist(); + return true; + }); + + getInputElement().on(DateRangeEvents.SELECT, (e, picker) -> { + // OpenEvent.fire(this, picker); + toggleTypeAssist(); + return true; + }); - //TODO: Change target to Date - getInputElement().on(DateRangeEvents.OPEN, (e, param1) -> { - OpenEvent.fire(this, this); + getInputElement().on(DateRangeEvents.OPEN, (e, picker) -> { + // OpenEvent.fire(this, picker); return true; }); - //TODO: Change target to Date - getInputElement().on(DateRangeEvents.CLOSE, (e, param1) -> { - CloseEvent.fire(this, this); + getInputElement().on(DateRangeEvents.CLOSE, (e, picker) -> { + // CloseEvent.fire(this, picker); return true; }); - getInputElement().on(DateRangeEvents.CLOSE_CALENDAR, (e, param1) -> { - MaterialToast.fireToast("Close Calendar"); + getInputElement().on(DateRangeEvents.CLOSE_CALENDAR, (e, picker) -> { + // CloseCalendarEvent.fire(this, picker); return true; }); - getInputElement().on(DateRangeEvents.OPEN_CALENDAR, (e, param1) -> { - MaterialToast.fireToast("Open Calendar"); + getInputElement().on(DateRangeEvents.OPEN_CALENDAR, (e, picker) -> { + // OpenCalendarEvent.fire(this, picker); return true; }); - getInputElement().on(DateRangeEvents.APPLY, (e, param1) -> { - MaterialToast.fireToast("Apply"); + getInputElement().on(DateRangeEvents.APPLY, (e, picker) -> { + // ApplyEvent.fire(this, picker); return true; }); - getInputElement().on(DateRangeEvents.CANCEL, (e, param1) -> { - MaterialToast.fireToast("Cancel"); + getInputElement().on(DateRangeEvents.CANCEL, (e, picker) -> { + // CancelEvent.fire(this, picker); return true; }); + + setId(DOM.createUniqueId()); + } + + protected void toggleTypeAssist() { + if (isShowDropdowns()) { + JsComboBox monthSelect = JsComboBox.$(".monthselect"); + JsComboBox yearSelect = JsComboBox.$(".yearselect"); + JsComboBoxOptions op = JsComboBoxOptions.create(); + op.dropdownParent = JsComboBox.$(getElement()); + monthSelect.select2(op); + yearSelect.select2(op); + } } @Override @@ -123,6 +170,9 @@ protected void unload() { getInputElement().off(DateRangeEvents.OPEN_CALENDAR); getInputElement().off(DateRangeEvents.APPLY); getInputElement().off(DateRangeEvents.CANCEL); + getInputElement().off(DateRangeEvents.NEXT); + getInputElement().off(DateRangeEvents.PREV); + getInputElement().off(DateRangeEvents.UPDATE_CALENDAR); } public void reload() { @@ -135,312 +185,312 @@ public JsDateRange getInputElement() { } @Override - public Date getStartDate() { - return options.startDate; + public Moment getStartDate() { + return options.getStartDate(); } @Override - public void setStartDate(Date startDate) { - options.startDate = startDate; + public void setStartDate(Moment startDate) { + options.setStartDate(startDate); } @Override public Date getEndDate() { - return options.endDate; + return options.getEndDate(); } @Override public void setEndDate(Date endDate) { - options.endDate = endDate; + options.setEndDate(endDate); } @Override public Date getMinDate() { - return options.minDate; + return options.getMinDate(); } @Override public void setMinDate(Date minDate) { - options.minDate = minDate; + options.setMinDate(minDate); } @Override public Date getMaxDate() { - return options.maxDate; + return options.getMaxDate(); } @Override public void setMaxDate(Date maxDate) { - options.maxDate = maxDate; + options.setMaxDate(maxDate); } @Override public Object getMaxSpan() { - return options.maxSpan; + return options.getMaxSpan(); } @Override public void setMaxSpan(Object maxSpan) { - options.maxSpan = maxSpan; + options.setMaxSpan(maxSpan); } @Override public boolean isShowDropdowns() { - return options.showDropdowns; + return options.isShowDropdowns(); } @Override public void setShowDropdowns(boolean showDropdowns) { - options.showDropdowns = showDropdowns; + options.setShowDropdowns(showDropdowns); } @Override public int getMinYear() { - return options.minYear; + return options.getMinYear(); } @Override public void setMinYear(int minYear) { - options.minYear = minYear; + options.setMinYear(minYear); } @Override public int getMaxYear() { - return options.maxYear; + return options.getMaxYear(); } @Override public void setMaxYear(int maxYear) { - options.maxYear = maxYear; + options.setMaxYear(maxYear); } @Override public boolean isShowWeekNumbers() { - return options.showWeekNumbers; + return options.isShowWeekNumbers(); } @Override public void setShowWeekNumbers(boolean showWeekNumbers) { - options.showWeekNumbers = showWeekNumbers; + options.setShowWeekNumbers(showWeekNumbers); } @Override public boolean isShowISOWeekNumbers() { - return options.showISOWeekNumbers; + return options.isShowISOWeekNumbers(); } @Override public void setShowISOWeekNumbers(boolean showISOWeekNumbers) { - options.showISOWeekNumbers = showISOWeekNumbers; + options.setShowISOWeekNumbers(showISOWeekNumbers); } @Override public boolean isTimePicker() { - return options.timePicker; + return options.isTimePicker(); } @Override public void setTimePicker(boolean timePicker) { - options.timePicker = timePicker; + options.setTimePicker(timePicker); } @Override public int getTimePickerIncrement() { - return options.timePickerIncrement; + return options.getTimePickerIncrement(); } @Override public void setTimePickerIncrement(int timePickerIncrement) { - options.timePickerIncrement = timePickerIncrement; + options.setTimePickerIncrement(timePickerIncrement); } @Override public boolean isTimePicker24Hour() { - return options.timePicker24Hour; + return options.isTimePicker24Hour(); } @Override public void setTimePicker24Hour(boolean timePicker24Hour) { - options.timePicker24Hour = timePicker24Hour; + options.setTimePicker24Hour(timePicker24Hour); } @Override public boolean isTimePickerSeconds() { - return options.timePickerSeconds; + return options.isTimePickerSeconds(); } @Override public void setTimePickerSeconds(boolean timePickerSeconds) { - options.timePickerSeconds = timePickerSeconds; + options.setTimePickerSeconds(timePickerSeconds); } @Override public Object getRanges() { - return options.ranges; + return options.getRanges(); } @Override public void setRanges(Object ranges) { - options.ranges = ranges; + options.setRanges(ranges); } @Override public boolean isShowCustomRangeLabel() { - return options.showCustomRangeLabel; + return options.isShowCustomRangeLabel(); } @Override public void setShowCustomRangeLabel(boolean showCustomRangeLabel) { - options.showCustomRangeLabel = showCustomRangeLabel; + options.setShowCustomRangeLabel(showCustomRangeLabel); } @Override public boolean isAlwaysShowCalendars() { - return options.alwaysShowCalendars; + return options.isAlwaysShowCalendars(); } @Override public void setAlwaysShowCalendars(boolean alwaysShowCalendars) { - options.alwaysShowCalendars = alwaysShowCalendars; + options.setAlwaysShowCalendars(alwaysShowCalendars); } @Override public DropdownAlignment getDropdownAlignment() { - return options.opens != null ? DropdownAlignment.fromStyleName(options.opens) : null; + return options.getOpens() != null ? DropdownAlignment.fromStyleName(options.getOpens()) : null; } @Override public void setDropdownAlignment(DropdownAlignment alignment) { - options.opens = alignment.getCssName(); + options.setOpens(alignment.getCssName()); } @Override public DropdownPosition getDropdownPosition() { - return options.drops != null ? DropdownPosition.fromStyleName(options.drops) : null; + return options.getDrops() != null ? DropdownPosition.fromStyleName(options.getDrops()) : null; } @Override public void setDropdownPosition(DropdownPosition dropdownPosition) { - options.drops = dropdownPosition.getCssName(); + options.setDrops(dropdownPosition.getCssName()); } @Override public String getButtonClasses() { - return options.buttonClasses; + return options.getButtonClasses(); } @Override public void setButtonClasses(String buttonClasses) { - options.buttonClasses = buttonClasses; + options.setButtonClasses(buttonClasses); } @Override public String getApplyButtonClasses() { - return options.applyButtonClasses; + return options.getApplyButtonClasses(); } @Override public void setApplyButtonClasses(String applyButtonClasses) { - options.applyButtonClasses = applyButtonClasses; + options.setApplyButtonClasses(applyButtonClasses); } @Override public String getCancelButtonClasses() { - return options.cancelButtonClasses; + return options.getCancelButtonClasses(); } @Override public void setCancelButtonClasses(String cancelButtonClasses) { - options.cancelButtonClasses = cancelButtonClasses; + options.setCancelButtonClasses(cancelButtonClasses); } @Override - public Object getLocale() { - return options.locale; + public DateRangeLocale getLocale() { + return options.getLocale() != null ? (DateRangeLocale) options.getLocale() : null; } @Override - public void setLocale(Object locale) { - options.locale = locale; + public void setLocale(DateRangeLocale locale) { + options.setLocale(locale != null ? locale : false); } @Override public boolean isSingleDatePicker() { - return options.singleDatePicker; + return options.isSingleDatePicker(); } @Override public void setSingleDatePicker(boolean singleDatePicker) { - options.singleDatePicker = singleDatePicker; + options.setSingleDatePicker(singleDatePicker); } @Override public boolean isAutoApply() { - return options.autoApply; + return options.isAutoApply(); } @Override public void setAutoApply(boolean autoApply) { - options.autoApply = autoApply; + options.setAutoApply(autoApply); } @Override public boolean isLinkedCalendars() { - return options.linkedCalendars; + return options.isLinkedCalendars(); } @Override public void setLinkedCalendars(boolean linkedCalendars) { - options.linkedCalendars = linkedCalendars; + options.setLinkedCalendars(linkedCalendars); } @Override public Functions.FuncRet1 isInvalidDate() { - return options.isInvalidDate; + return options.isInvalidDate(); } @Override public void setInvalidDate(Functions.FuncRet1 invalidDate) { - options.isInvalidDate = invalidDate; + options.setInvalidDate(invalidDate); } @Override public Functions.FuncRet1 isCustomDate() { - return options.isCustomDate; + return options.isCustomDate(); } @Override public void setCustomDate(Functions.FuncRet1 customDate) { - options.isCustomDate = customDate; + options.setCustomDate(customDate); } @Override public boolean isAutoUpdateInput() { - return options.autoUpdateInput; + return options.isAutoUpdateInput(); } @Override public void setAutoUpdateInput(boolean autoUpdateInput) { - options.autoUpdateInput = autoUpdateInput; + options.setAutoUpdateInput(autoUpdateInput); } @Override public String getParentEl() { - return options.parentEl; + return options.getParentEl(); } @Override public void setParentEl(String parentEl) { - options.parentEl = parentEl; + options.setParentEl(parentEl); } @Override public Date getValue() { - Date date = null; + /*Date date = null; if (getInputElement().val() != null) { date = (Date) getInputElement().val(); - } - return date; + }*/ + return null; } @Override @@ -587,7 +637,7 @@ public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { return addHandler(handler, ValueChangeEvent.getType()); } - protected FieldTypeMixin getFieldTypeMixin() { + protected FieldTypeMixin getFieldTypeMixin() { if (fieldTypeMixin == null) { fieldTypeMixin = new FieldTypeMixin<>(this); } @@ -602,7 +652,7 @@ public StatusTextMixin getStatusTextMixin() return statusTextMixin; } - protected ReadOnlyMixin getReadOnlyMixin() { + protected ReadOnlyMixin getReadOnlyMixin() { if (readOnlyMixin == null) { readOnlyMixin = new ReadOnlyMixin<>(this, dateInput); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java index 77be7956a..786b2e9ba 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java @@ -22,10 +22,11 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; - -import java.util.Date; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; /** + * Triggered when the apply button is clicked, or when a predefined range is clicked + * * @author kevzlou7979 */ public class ApplyEvent extends GwtEvent { @@ -36,22 +37,22 @@ public interface ApplyEventHandler extends EventHandler { public static final Type TYPE = new Type<>(); - private Date date; + private JsDateRange dateRange; - public ApplyEvent(Date date) { - this.date = date; + public ApplyEvent(JsDateRange dateRange) { + this.dateRange = dateRange; } public static Type getType() { return TYPE; } - public static void fire(HasHandlers source, Date date) { - source.fireEvent(new ApplyEvent(date)); + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new ApplyEvent(dateRange)); } - public Date getDate() { - return date; + public JsDateRange getDateRange() { + return dateRange; } @Override diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java index 015880f31..6fad72ff7 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java @@ -22,8 +22,11 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; /** + * Triggered when the cancel button is clicked + * * @author kevzlou7979 */ public class CancelEvent extends GwtEvent { @@ -34,12 +37,18 @@ public interface CancelEventHandler extends EventHandler { public static final Type TYPE = new Type<>(); + private JsDateRange dateRange; + + public CancelEvent(JsDateRange dateRange) { + this.dateRange = dateRange; + } + public static Type getType() { return TYPE; } - public static void fire(HasHandlers source) { - source.fireEvent(new CancelEvent()); + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new CancelEvent(dateRange)); } @Override @@ -47,6 +56,10 @@ public Type getAssociatedType() { return TYPE; } + public JsDateRange getDateRange() { + return dateRange; + } + @Override protected void dispatch(CancelEvent.CancelEventHandler handler) { handler.onCancelEvent(this); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java index 4310cd962..fe12703ad 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java @@ -7,9 +7,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,10 +22,11 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; - -import java.util.Date; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; /** + * Triggered when the picker is hidden + * * @author kevzlou7979 */ public class CloseCalendarEvent extends GwtEvent { @@ -34,10 +35,10 @@ public interface CloseCalendarEventHandler extends EventHandler { void onCloseCalendarEvent(CloseCalendarEvent event); } - private Date date; + private JsDateRange dateRange; - public CloseCalendarEvent(Date date) { - this.date = date; + public CloseCalendarEvent(JsDateRange dateRange) { + this.dateRange = dateRange; } public static final Type TYPE = new Type<>(); @@ -46,12 +47,8 @@ public static Type getType() { return TYPE; } - public static void fire(HasHandlers source, Date date) { - source.fireEvent(new CloseCalendarEvent(date)); - } - - public Date getDate() { - return date; + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new CloseCalendarEvent(dateRange)); } @Override @@ -59,6 +56,10 @@ public Type getAssociatedType() { return TYPE; } + public JsDateRange getDateRange() { + return dateRange; + } + @Override protected void dispatch(CloseCalendarEvent.CloseCalendarEventHandler handler) { handler.onCloseCalendarEvent(this); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java index 9b368b65e..648c521be 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java @@ -8,4 +8,8 @@ public interface DateRangeEvents { String CLOSE_CALENDAR = "hideCalendar.daterangepicker"; String APPLY = "apply.daterangepicker"; String CANCEL = "cancel.daterangepicker"; + String SELECT = "selectDate.daterangepicker"; + String UPDATE_CALENDAR = "updateCalendar.daterangepicker"; + String NEXT = "next.daterangepicker"; + String PREV = "prev.daterangepicker"; } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java index 4d0adaedc..9c3f446e4 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java @@ -3,10 +3,9 @@ import com.google.gwt.event.logical.shared.HasCloseHandlers; import com.google.gwt.event.logical.shared.HasOpenHandlers; import com.google.gwt.event.shared.HandlerRegistration; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; -import java.util.Date; - -public interface HasDateRangeHandlers extends HasOpenHandlers, HasCloseHandlers { +public interface HasDateRangeHandlers extends HasOpenHandlers, HasCloseHandlers { HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendarEventHandler handler); HandlerRegistration addCloseCalendarHandler(CloseCalendarEvent.CloseCalendarEventHandler handler); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java index 8becbe87a..9f2c1484d 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java @@ -22,10 +22,11 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; - -import java.util.Date; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; /** + * Triggered when the picker is shown + * * @author kevzlou7979 */ public class OpenCalendarEvent extends GwtEvent { @@ -34,10 +35,10 @@ public interface OpenCalendarEventHandler extends EventHandler { void onOpenCalendarEvent(OpenCalendarEvent event); } - private Date date; + private JsDateRange dateRange; - public OpenCalendarEvent(Date date) { - this.date = date; + public OpenCalendarEvent(JsDateRange dateRange) { + this.dateRange = dateRange; } public static final Type TYPE = new Type<>(); @@ -46,12 +47,12 @@ public static Type getType() { return TYPE; } - public static void fire(HasHandlers source, Date date) { - source.fireEvent(new OpenCalendarEvent(date)); + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new OpenCalendarEvent(dateRange)); } - public Date getDate() { - return date; + public JsDateRange getDateRange() { + return dateRange; } @Override diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java new file mode 100644 index 000000000..9a79b83a5 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java @@ -0,0 +1,166 @@ +package gwt.material.design.incubator.client.daterange.js; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.json.client.JSONString; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.List; + +/** + * @author kevzlou7979 + * @see {@link gwt.material.design.incubator.client.daterange.DateRangePicker#setLocale(DateRangeLocale)} + */ +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class DateRangeLocale { + + @JsProperty + private String format; + + @JsProperty + private String separator; + + @JsProperty + private String applyLabel; + + @JsProperty + private String cancelLabel; + + @JsProperty + private String fromLabel; + + @JsProperty + private String toLabel; + + @JsProperty + private String customRangeLabel; + + @JsProperty + private String weekLabel; + + @JsProperty + private LocaleString[] daysOfWeek; + + @JsProperty + private LocaleString[] monthNames; + + @JsProperty + private String firstDay; + + @JsOverlay + public final String getFormat() { + return format; + } + + @JsOverlay + public final void setFormat(String format) { + this.format = format; + } + + @JsOverlay + public final String getSeparator() { + return separator; + } + + @JsOverlay + public final void setSeparator(String separator) { + this.separator = separator; + } + + @JsOverlay + public final String getApplyLabel() { + return applyLabel; + } + + @JsOverlay + public final void setApplyLabel(String applyLabel) { + this.applyLabel = applyLabel; + } + + @JsOverlay + public final String getCancelLabel() { + return cancelLabel; + } + + @JsOverlay + public final void setCancelLabel(String cancelLabel) { + this.cancelLabel = cancelLabel; + } + + @JsOverlay + public final String getFromLabel() { + return fromLabel; + } + + @JsOverlay + public final void setFromLabel(String fromLabel) { + this.fromLabel = fromLabel; + } + + @JsOverlay + public final String getToLabel() { + return toLabel; + } + + @JsOverlay + public final void setToLabel(String toLabel) { + this.toLabel = toLabel; + } + + @JsOverlay + public final String getCustomRangeLabel() { + return customRangeLabel; + } + + @JsOverlay + public final void setCustomRangeLabel(String customRangeLabel) { + this.customRangeLabel = customRangeLabel; + } + + @JsOverlay + public final String getWeekLabel() { + return weekLabel; + } + + @JsOverlay + public final void setWeekLabel(String weekLabel) { + this.weekLabel = weekLabel; + } + + @JsOverlay + public final LocaleString[] getDaysOfWeek() { + return daysOfWeek; + } + + @JsOverlay + public final void setDaysOfWeek(LocaleString[] daysOfWeek) { + this.daysOfWeek = daysOfWeek; + } + + @JsOverlay + public final LocaleString[] getMonthNames() { + return monthNames; + } + + @JsOverlay + public final void setMonthNames(LocaleString[] monthNames) { + if (monthNames.length == 12) { + this.monthNames = monthNames; + } else { + GWT.log("Months must be equal to seven (12) months", new IllegalArgumentException()); + } + } + + @JsOverlay + public final String getFirstDay() { + return firstDay; + } + + @JsOverlay + public final void setFirstDay(String firstDay) { + this.firstDay = firstDay; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java index 59c3cd856..6ecf1ce35 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java @@ -1,6 +1,8 @@ package gwt.material.design.incubator.client.daterange.js; +import gwt.material.design.addins.client.moment.Moment; import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; @@ -11,95 +13,395 @@ public class DateRangeOptions { @JsProperty - public Date startDate; + private Moment startDate; @JsProperty - public Date endDate; + private Date endDate; @JsProperty - public Date minDate; + private Date minDate; @JsProperty - public Date maxDate; + private Date maxDate; @JsProperty - public Object maxSpan; + private Object maxSpan; @JsProperty - public boolean showDropdowns; + private boolean showDropdowns; @JsProperty - public int minYear; + private int minYear; @JsProperty - public int maxYear; + private int maxYear; @JsProperty - public boolean showWeekNumbers; + private boolean showWeekNumbers; @JsProperty - public boolean showISOWeekNumbers; + private boolean showISOWeekNumbers; @JsProperty - public boolean timePicker; + private boolean timePicker; @JsProperty - public int timePickerIncrement; + private int timePickerIncrement; @JsProperty - public boolean timePicker24Hour; + private boolean timePicker24Hour; @JsProperty - public boolean timePickerSeconds; + private boolean timePickerSeconds; @JsProperty - public Object ranges; + private Object ranges; @JsProperty - public boolean showCustomRangeLabel; + private boolean showCustomRangeLabel; @JsProperty - public boolean alwaysShowCalendars; + private boolean alwaysShowCalendars; /** * @see DropdownAlignment */ @JsProperty - public String opens; + private String opens; @JsProperty - public String drops; + private String drops; @JsProperty - public String buttonClasses; + private String buttonClasses; @JsProperty - public String applyButtonClasses; + private String applyButtonClasses; @JsProperty - public String cancelButtonClasses; + private String cancelButtonClasses; @JsProperty - public Object locale; + private Object locale; @JsProperty - public boolean singleDatePicker; + private boolean singleDatePicker; @JsProperty - public boolean autoApply; + private boolean autoApply; @JsProperty - public boolean linkedCalendars; + private boolean linkedCalendars; @JsProperty - public Functions.FuncRet1 isInvalidDate; + private Functions.FuncRet1 isInvalidDate; @JsProperty - public Functions.FuncRet1 isCustomDate; + private Functions.FuncRet1 isCustomDate; @JsProperty - public boolean autoUpdateInput; + private boolean autoUpdateInput; @JsProperty - public String parentEl; + private String parentEl; + + @JsOverlay + public final Moment getStartDate() { + return startDate; + } + + @JsOverlay + public final void setStartDate(Moment startDate) { + this.startDate = startDate; + } + + @JsOverlay + public final Date getEndDate() { + return endDate; + } + + @JsOverlay + public final void setEndDate(Date endDate) { + this.endDate = endDate; + } + + @JsOverlay + public final Date getMinDate() { + return minDate; + } + + @JsOverlay + public final void setMinDate(Date minDate) { + this.minDate = minDate; + } + + @JsOverlay + public final Date getMaxDate() { + return maxDate; + } + + @JsOverlay + public final void setMaxDate(Date maxDate) { + this.maxDate = maxDate; + } + + @JsOverlay + public final Object getMaxSpan() { + return maxSpan; + } + + @JsOverlay + public final void setMaxSpan(Object maxSpan) { + this.maxSpan = maxSpan; + } + + @JsOverlay + public final boolean isShowDropdowns() { + return showDropdowns; + } + + @JsOverlay + public final void setShowDropdowns(boolean showDropdowns) { + this.showDropdowns = showDropdowns; + } + + @JsOverlay + public final int getMinYear() { + return minYear; + } + + @JsOverlay + public final void setMinYear(int minYear) { + this.minYear = minYear; + } + + @JsOverlay + public final int getMaxYear() { + return maxYear; + } + + @JsOverlay + public final void setMaxYear(int maxYear) { + this.maxYear = maxYear; + } + + @JsOverlay + public final boolean isShowWeekNumbers() { + return showWeekNumbers; + } + + @JsOverlay + public final void setShowWeekNumbers(boolean showWeekNumbers) { + this.showWeekNumbers = showWeekNumbers; + } + + @JsOverlay + public final boolean isShowISOWeekNumbers() { + return showISOWeekNumbers; + } + + @JsOverlay + public final void setShowISOWeekNumbers(boolean showISOWeekNumbers) { + this.showISOWeekNumbers = showISOWeekNumbers; + } + + @JsOverlay + public final boolean isTimePicker() { + return timePicker; + } + + @JsOverlay + public final void setTimePicker(boolean timePicker) { + this.timePicker = timePicker; + } + + @JsOverlay + public final int getTimePickerIncrement() { + return timePickerIncrement; + } + + @JsOverlay + public final void setTimePickerIncrement(int timePickerIncrement) { + this.timePickerIncrement = timePickerIncrement; + } + + @JsOverlay + public final boolean isTimePicker24Hour() { + return timePicker24Hour; + } + + @JsOverlay + public final void setTimePicker24Hour(boolean timePicker24Hour) { + this.timePicker24Hour = timePicker24Hour; + } + + @JsOverlay + public final boolean isTimePickerSeconds() { + return timePickerSeconds; + } + + @JsOverlay + public final void setTimePickerSeconds(boolean timePickerSeconds) { + this.timePickerSeconds = timePickerSeconds; + } + + @JsOverlay + public final Object getRanges() { + return ranges; + } + + @JsOverlay + public final void setRanges(Object ranges) { + this.ranges = ranges; + } + + @JsOverlay + public final boolean isShowCustomRangeLabel() { + return showCustomRangeLabel; + } + + @JsOverlay + public final void setShowCustomRangeLabel(boolean showCustomRangeLabel) { + this.showCustomRangeLabel = showCustomRangeLabel; + } + + @JsOverlay + public final boolean isAlwaysShowCalendars() { + return alwaysShowCalendars; + } + + @JsOverlay + public final void setAlwaysShowCalendars(boolean alwaysShowCalendars) { + this.alwaysShowCalendars = alwaysShowCalendars; + } + + @JsOverlay + public final String getOpens() { + return opens; + } + + @JsOverlay + public final void setOpens(String opens) { + this.opens = opens; + } + + @JsOverlay + public final String getDrops() { + return drops; + } + + @JsOverlay + public final void setDrops(String drops) { + this.drops = drops; + } + + @JsOverlay + public final String getButtonClasses() { + return buttonClasses; + } + + @JsOverlay + public final void setButtonClasses(String buttonClasses) { + this.buttonClasses = buttonClasses; + } + + @JsOverlay + public final String getApplyButtonClasses() { + return applyButtonClasses; + } + + @JsOverlay + public final void setApplyButtonClasses(String applyButtonClasses) { + this.applyButtonClasses = applyButtonClasses; + } + + @JsOverlay + public final String getCancelButtonClasses() { + return cancelButtonClasses; + } + + @JsOverlay + public final void setCancelButtonClasses(String cancelButtonClasses) { + this.cancelButtonClasses = cancelButtonClasses; + } + + @JsOverlay + public final Object getLocale() { + return locale; + } + + @JsOverlay + public final void setLocale(Object locale) { + this.locale = locale; + } + + @JsOverlay + public final boolean isSingleDatePicker() { + return singleDatePicker; + } + + @JsOverlay + public final void setSingleDatePicker(boolean singleDatePicker) { + this.singleDatePicker = singleDatePicker; + } + + @JsOverlay + public final boolean isAutoApply() { + return autoApply; + } + + @JsOverlay + public final void setAutoApply(boolean autoApply) { + this.autoApply = autoApply; + } + + @JsOverlay + public final boolean isLinkedCalendars() { + return linkedCalendars; + } + + @JsOverlay + public final void setLinkedCalendars(boolean linkedCalendars) { + this.linkedCalendars = linkedCalendars; + } + + @JsOverlay + public final Functions.FuncRet1 isInvalidDate() { + return isInvalidDate; + } + + @JsOverlay + public final void setInvalidDate(Functions.FuncRet1 isInvalidDate) { + this.isInvalidDate = isInvalidDate; + } + + @JsOverlay + public final Functions.FuncRet1 isCustomDate() { + return isCustomDate; + } + + @JsOverlay + public final void setCustomDate(Functions.FuncRet1 isCustomDate) { + this.isCustomDate = isCustomDate; + } + + @JsOverlay + public final boolean isAutoUpdateInput() { + return autoUpdateInput; + } + + @JsOverlay + public final void setAutoUpdateInput(boolean autoUpdateInput) { + this.autoUpdateInput = autoUpdateInput; + } + + @JsOverlay + public final String getParentEl() { + return parentEl; + } + + @JsOverlay + public final void setParentEl(String parentEl) { + this.parentEl = parentEl; + } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java deleted file mode 100644 index 4d5bf5c3f..000000000 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeVerticalPosition.java +++ /dev/null @@ -1,7 +0,0 @@ -package gwt.material.design.incubator.client.daterange.js; - -public interface DateRangeVerticalPosition { - - String DOWN = "down"; - String UP = "up"; -} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java index 4311f956d..bf41153ce 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java @@ -3,6 +3,11 @@ import gwt.material.design.client.base.helper.EnumHelper; import gwt.material.design.client.constants.CssType; +/** + * @see {@link gwt.material.design.incubator.client.daterange.DateRangePicker#setDropdownAlignment(DropdownAlignment)} + * + * @author kevzlou7979 + */ public enum DropdownAlignment implements CssType { LEFT("left"), diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java index 9a706886e..97025c6ed 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java @@ -3,6 +3,11 @@ import gwt.material.design.client.base.helper.EnumHelper; import gwt.material.design.client.constants.CssType; +/** + * @see {@link gwt.material.design.incubator.client.daterange.DateRangePicker#setDropdownPosition(DropdownPosition)} + * + * @author kevzlou7979 + */ public enum DropdownPosition implements CssType { LEFT("left"), diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index 7acc52905..24b9bb5a9 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -1,128 +1,240 @@ package gwt.material.design.incubator.client.daterange.js; +import gwt.material.design.addins.client.moment.Moment; import gwt.material.design.jquery.client.api.Functions; import java.util.Date; +/** + * Options for {@link gwt.material.design.incubator.client.daterange.DateRangePicker} + * + * @author kevzlou7979 + */ public interface HasDateRangeOptions { - Date getStartDate(); + Moment getStartDate(); - void setStartDate(Date startDate); + /** + * The beginning date of the initially selected date range. If you provide a string, it must match the date format + * string set in your locale setting. + */ + void setStartDate(Moment startDate); Date getEndDate(); + /** + * The end date of the initially selected date range. + */ void setEndDate(Date endDate); Date getMinDate(); + /** + * The earliest date a user may select. + */ void setMinDate(Date minDate); Date getMaxDate(); + /** + * The latest date a user may select. + */ void setMaxDate(Date maxDate); Object getMaxSpan(); + /** + * The maximum span between the selected start and end dates. Check off maxSpan in the configuration generator for + * an example of how to use this. You can provide any object the moment library would let you add to a date. + */ void setMaxSpan(Object maxSpan); boolean isShowDropdowns(); + /** + * Show year and month select boxes above calendars to jump to a specific month and year. + */ void setShowDropdowns(boolean showDropdowns); int getMinYear(); + /** + * The minimum year shown in the dropdowns when showDropdowns is set to true. + */ void setMinYear(int minYear); int getMaxYear(); + /** + * The maximum year shown in the dropdowns when showDropdowns is set to true. + */ void setMaxYear(int maxYear); boolean isShowWeekNumbers(); + /** + * Show localized week numbers at the start of each week on the calendars. + */ void setShowWeekNumbers(boolean showWeekNumbers); boolean isShowISOWeekNumbers(); + /** + * Show ISO week numbers at the start of each week on the calendars. + */ void setShowISOWeekNumbers(boolean showISOWeekNumbers); boolean isTimePicker(); + /** + * Adds select boxes to choose times in addition to dates. + */ void setTimePicker(boolean timePicker); int getTimePickerIncrement(); + /** + * Increment of the minutes selection list for times (i.e. 30 to allow only selection of times ending in 0 or 30). + */ void setTimePickerIncrement(int timePickerIncrement); boolean isTimePicker24Hour(); + /** + * Use 24-hour instead of 12-hour times, removing the AM/PM selection. + */ void setTimePicker24Hour(boolean timePicker24Hour); boolean isTimePickerSeconds(); + /** + * Show seconds in the timePicker. + */ void setTimePickerSeconds(boolean timePickerSeconds); Object getRanges(); + /** + * Set predefined date ranges the user can select from. Each key is the label for the range, and its value an array + * with two dates representing the bounds of the range. Click ranges in the configuration generator for examples. + */ void setRanges(Object ranges); boolean isShowCustomRangeLabel(); + /** + * Displays "Custom Range" at the end of the list of predefined ranges, when the ranges option is used. This option + * will be highlighted whenever the current date range selection does not match one of the predefined ranges. + * Clicking it will display the calendars to select a new range. + */ void setShowCustomRangeLabel(boolean showCustomRangeLabel); boolean isAlwaysShowCalendars(); + /** + * Normally, if you use the ranges option to specify pre-defined date ranges, calendars for choosing a custom date + * range are not shown until the user clicks "Custom Range". When this option is set to true, the calendars for + * choosing a custom date range are always shown instead. + */ void setAlwaysShowCalendars(boolean alwaysShowCalendars); DropdownAlignment getDropdownAlignment(); + /** + * Whether the picker appears aligned to the left, to the right, or centered under the HTML element it's attached to. + * @see DropdownAlignment + */ void setDropdownAlignment(DropdownAlignment alignment); DropdownPosition getDropdownPosition(); + /** + * Whether the picker appears below (default) or above the HTML element it's attached to. + * @see DropdownPosition + */ void setDropdownPosition(DropdownPosition position); String getButtonClasses(); + /** + * CSS class names that will be added to both the apply and cancel buttons. + */ void setButtonClasses(String buttonClasses); String getApplyButtonClasses(); + /** + * CSS class names that will be added only to the apply button. + */ void setApplyButtonClasses(String applyButtonClasses); String getCancelButtonClasses(); + /** + * CSS class names that will be added only to the cancel button. + */ void setCancelButtonClasses(String cancelButtonClasses); - Object getLocale(); + DateRangeLocale getLocale(); - void setLocale(Object locale); + /** + * Allows you to provide localized strings for buttons and labels, customize the date format, and change the first + * day of week for the calendars. Check off locale in the configuration generator to see how to customize these options. + */ + void setLocale(DateRangeLocale locale); boolean isSingleDatePicker(); + /** + * Show only a single calendar to choose one date, instead of a range picker with two calendars. + * The start and end dates provided to your callback will be the same single date chosen. + */ void setSingleDatePicker(boolean singleDatePicker); boolean isAutoApply(); + /** + * Hide the apply and cancel buttons, and automatically apply a new date range as soon as two dates are clicked. + */ void setAutoApply(boolean autoApply); boolean isLinkedCalendars(); + /** + * When enabled, the two calendars displayed will always be for two sequential months (i.e. January and February), + * and both will be advanced when clicking the left or right arrows above the calendars. When disabled, the two calendars can be individually advanced and display any month/year. + */ void setLinkedCalendars(boolean linkedCalendars); Functions.FuncRet1 isInvalidDate(); + /** + * A function that is passed each date in the two calendars before they are displayed, and may return true or false + * to indicate whether that date should be available for selection or not. + */ void setInvalidDate(Functions.FuncRet1 isInvalidDate); Functions.FuncRet1 isCustomDate(); + /** + * A function that is passed each date in the two calendars before they are displayed, and may return a string or + * array of CSS class names to apply to that date's calendar cell. + */ void setCustomDate(Functions.FuncRet1 isCustomDate); boolean isAutoUpdateInput(); + /** + * Indicates whether the date range picker should automatically update the value of the element it's + * attached to at initialization and when the selected dates change. + */ void setAutoUpdateInput(boolean autoUpdateInput); String getParentEl(); + /** + * jQuery selector of the parent element that the date range picker will be added to, if not provided this will be + * 'body' + */ void setParentEl(String parentEl); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java index f82496c48..200f87f39 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java @@ -1,18 +1,21 @@ package gwt.material.design.incubator.client.daterange.js; import com.google.gwt.dom.client.Element; -import gwt.material.design.addins.client.combobox.js.JsComboBoxOptions; import gwt.material.design.jquery.client.api.Functions; import gwt.material.design.jquery.client.api.JQueryElement; import jsinterop.annotations.JsMethod; import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; import java.util.Date; -@JsType(isNative = true) -public class JsDateRange extends JQueryElement { +/** + * JSInterop utils for {@link gwt.material.design.incubator.client.daterange.DateRangePicker} + * + * @author kevzlou7979 + */ +@JsType(isNative = true, name = "DateRangePicker") +public class JsDateRange extends DateRangeOptions { @JsMethod(name = "$", namespace = JsPackage.GLOBAL) public static native JsDateRange $(JQueryElement element); @@ -27,13 +30,12 @@ public class JsDateRange extends JQueryElement { public native void daterangepicker(DateRangeOptions options); @JsMethod - public native void daterangepicker(); - - @JsMethod - public native void setStartDate(Date date); + public native void daterangepicker(DateRangeOptions options, Functions.Func3 callback); @JsMethod - public native void setEndDate(Date date); + public native void daterangepicker(); + public native JsDateRange on(String event, Functions.EventFunc1 callback); + public native JsDateRange off(String event); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java new file mode 100644 index 000000000..3084fae0e --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java @@ -0,0 +1,18 @@ +package gwt.material.design.incubator.client.daterange.js; + +import jsinterop.annotations.JsConstructor; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class LocaleString { + + @JsConstructor + public LocaleString(String value) { + this.value = value; + } + + @JsProperty + public String value; +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java new file mode 100644 index 000000000..29de81765 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java @@ -0,0 +1,50 @@ +package gwt.material.design.incubator.client.daterange.js; + +import gwt.material.design.addins.client.moment.Moment; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import static gwt.material.design.addins.client.moment.Moment.moment; + +/** + * @author kevzlou7979 + * @see {@link gwt.material.design.incubator.client.daterange.DateRangePicker#setRanges(Object)} + */ +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class RangeOption { + + private RangeOption() { + } + + @JsOverlay + public static final RangeOption create() { + RangeOption range = new RangeOption(); + range.Today = new Moment[]{moment(), moment()}; + range.Yesterday = new Moment[]{moment().subtract(1, "days"), moment().subtract(1, "days")}; + range.Last7Days = new Moment[]{moment().subtract(6, "days"), moment()}; + range.Last30Days = new Moment[]{moment().subtract(29, "days"), moment()}; + range.ThisMonth = new Moment[]{moment().startOf("month"), moment().endOf("month")}; + range.LastMonth = new Moment[]{moment().subtract(1, "month"), moment().startOf("month")}; + return range; + } + + @JsProperty + public Moment[] Today; + + @JsProperty + public Moment[] Yesterday; + + @JsProperty + public Moment[] Last7Days; + + @JsProperty + public Moment[] Last30Days; + + @JsProperty + public Moment[] ThisMonth; + + @JsProperty + public Moment[] LastMonth; +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java new file mode 100644 index 000000000..ba5ab81e2 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java @@ -0,0 +1,12 @@ +package gwt.material.design.incubator.client.daterange.js; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class Today { + + @JsProperty + public Object[] value; +} diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css new file mode 100644 index 000000000..2428d27a1 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -0,0 +1,146 @@ +/** Calendar **/ +.daterangepicker { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12); +} + +/** Calendar Header **/ +.daterangepicker .calendar-table th, +.daterangepicker .calendar-table td { + padding: unset; +} + +.daterangepicker th.month { + color: #444; + font-size: 1.2em; +} + +/** Calendar Day Item / Columns **/ +.daterangepicker .calendar-table td.available { + width: 36px !important; + height: 36px !important; +} + +.daterangepicker td.active, +.daterangepicker td.active:hover, +.daterangepicker td.in-range.active:not(.off) { + background-color: #42a5f5; + border-color: transparent; + color: #fff; + border-radius: 100%; +} + +.daterangepicker td.start-date.end-date { + border-radius: 100%; +} + +.daterangepicker td.in-range, +.daterangepicker td.available.in-range:hover:not(.active) { + background-color: #e3f2fd; +} + +.daterangepicker td.available:hover { + position: relative; + background-color: white; +} + +.daterangepicker td.available:hover:after { + content: " "; + background: transparent; + width: 100%; + position: absolute; + height: 100%; + left: 0px; + top: 0px; + border-radius: 100%; + border: 2px solid #42a5f5; +} + +/** Calendar Container **/ +.daterangepicker .drp-calendar { + max-width: unset; +} + +.daterangepicker .drp-calendar.left, +.daterangepicker .drp-calendar.right { + padding: 20px; +} + +/** Action Buttons **/ +.daterangepicker .calendar-table .prev { + left: -18px; + right: unset; +} + +/** Month and Year Selection **/ +.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field { + width: 100% !important; + background: white; + border-radius: 0px; + border-top: none; + border-left: none; + border-right: none; + margin-bottom: 0px; + padding-left: 12px !important; + font-size: 1em; +} + +.date-range-picker .select2-results__option { + padding-top: 8px; + padding-bottom: 8px; + min-height: 20px; +} + +.date-range-picker .select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { + max-height: 240px !important; +} + +.date-range-picker .select2-container { + z-index: 10000; +} + +.daterangepicker .select2-container--default .select2-selection--single { + border-bottom: none; +} + +.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 46px; + padding-left: 0; + font-size: 14px; +} + +.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after { + content: ""; + position: absolute; + right: 8px; + bottom: 23px; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 8px 8px; + border-color: transparent transparent #9c9c9c !important; +} + +/** Calendar Footer **/ +.daterangepicker .drp-buttons .btn { + padding-left: 12px; + padding-right: 12px; + line-height: 20px; +} + +.daterangepicker .drp-selected { + float: left; + padding: 12px; + font-size: 1em; +} + +button.cancelBtn { + background: none; + color: #42a5f5; + box-shadow: none; + border: 1px solid; +} + +button.cancelBtn:hover { + color: #ffffff; + border: none; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css new file mode 100644 index 000000000..2428d27a1 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -0,0 +1,146 @@ +/** Calendar **/ +.daterangepicker { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12); +} + +/** Calendar Header **/ +.daterangepicker .calendar-table th, +.daterangepicker .calendar-table td { + padding: unset; +} + +.daterangepicker th.month { + color: #444; + font-size: 1.2em; +} + +/** Calendar Day Item / Columns **/ +.daterangepicker .calendar-table td.available { + width: 36px !important; + height: 36px !important; +} + +.daterangepicker td.active, +.daterangepicker td.active:hover, +.daterangepicker td.in-range.active:not(.off) { + background-color: #42a5f5; + border-color: transparent; + color: #fff; + border-radius: 100%; +} + +.daterangepicker td.start-date.end-date { + border-radius: 100%; +} + +.daterangepicker td.in-range, +.daterangepicker td.available.in-range:hover:not(.active) { + background-color: #e3f2fd; +} + +.daterangepicker td.available:hover { + position: relative; + background-color: white; +} + +.daterangepicker td.available:hover:after { + content: " "; + background: transparent; + width: 100%; + position: absolute; + height: 100%; + left: 0px; + top: 0px; + border-radius: 100%; + border: 2px solid #42a5f5; +} + +/** Calendar Container **/ +.daterangepicker .drp-calendar { + max-width: unset; +} + +.daterangepicker .drp-calendar.left, +.daterangepicker .drp-calendar.right { + padding: 20px; +} + +/** Action Buttons **/ +.daterangepicker .calendar-table .prev { + left: -18px; + right: unset; +} + +/** Month and Year Selection **/ +.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field { + width: 100% !important; + background: white; + border-radius: 0px; + border-top: none; + border-left: none; + border-right: none; + margin-bottom: 0px; + padding-left: 12px !important; + font-size: 1em; +} + +.date-range-picker .select2-results__option { + padding-top: 8px; + padding-bottom: 8px; + min-height: 20px; +} + +.date-range-picker .select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { + max-height: 240px !important; +} + +.date-range-picker .select2-container { + z-index: 10000; +} + +.daterangepicker .select2-container--default .select2-selection--single { + border-bottom: none; +} + +.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 46px; + padding-left: 0; + font-size: 14px; +} + +.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after { + content: ""; + position: absolute; + right: 8px; + bottom: 23px; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 8px 8px; + border-color: transparent transparent #9c9c9c !important; +} + +/** Calendar Footer **/ +.daterangepicker .drp-buttons .btn { + padding-left: 12px; + padding-right: 12px; + line-height: 20px; +} + +.daterangepicker .drp-selected { + float: left; + padding: 12px; + font-size: 1em; +} + +button.cancelBtn { + background: none; + color: #42a5f5; + box-shadow: none; + border: 1px solid; +} + +button.cancelBtn:hover { + color: #ffffff; + border: none; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css deleted file mode 100644 index ef069c73b..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.css +++ /dev/null @@ -1,7 +0,0 @@ -.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { - padding: unset; -} - -.daterangepicker select { - display: inline-block; -} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css deleted file mode 100644 index ef069c73b..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-override.min.css +++ /dev/null @@ -1,7 +0,0 @@ -.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { - padding: unset; -} - -.daterangepicker select { - display: inline-block; -} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js index 3657f481f..aa58c5d5c 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js @@ -1,10 +1,10 @@ /** -* @version: 3.0.3 -* @author: Dan Grossman http://www.dangrossman.info/ -* @copyright: Copyright (c) 2012-2018 Dan Grossman. All rights reserved. -* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php -* @website: http://www.daterangepicker.com/ -*/ + * @version: 3.0.3 + * @author: Dan Grossman http://www.dangrossman.info/ + * @copyright: Copyright (c) 2012-2018 Dan Grossman. All rights reserved. + * @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php + * @website: http://www.daterangepicker.com/ + */ // Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js (function (root, factory) { if (typeof define === 'function' && define.amd) { @@ -99,22 +99,22 @@ //html template for the picker UI if (typeof options.template !== 'string' && !(options.template instanceof $)) options.template = - '
' + + '
' + '
' + '
' + - '
' + - '
' + + '
' + + '
' + '
' + '
' + - '
' + - '
' + + '
' + + '
' + '
' + '
' + - '' + - '' + - ' ' + + '' + + '' + + ' ' + '
' + - '
'; + '
'; this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); this.container = $(options.template).appendTo(this.parentEl); @@ -138,19 +138,19 @@ this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); if (typeof options.locale.monthNames === 'object') - this.locale.monthNames = options.locale.monthNames.slice(); + this.locale.monthNames = options.locale.monthNames.slice(); if (typeof options.locale.firstDay === 'number') - this.locale.firstDay = options.locale.firstDay; + this.locale.firstDay = options.locale.firstDay; if (typeof options.locale.applyLabel === 'string') - this.locale.applyLabel = options.locale.applyLabel; + this.locale.applyLabel = options.locale.applyLabel; if (typeof options.locale.cancelLabel === 'string') - this.locale.cancelLabel = options.locale.cancelLabel; + this.locale.cancelLabel = options.locale.cancelLabel; if (typeof options.locale.weekLabel === 'string') - this.locale.weekLabel = options.locale.weekLabel; + this.locale.weekLabel = options.locale.weekLabel; if (typeof options.locale.customRangeLabel === 'string'){ //Support unicode chars in the custom range name. @@ -338,7 +338,7 @@ // If the end of the range is before the minimum or the start of the range is // after the maximum, don't display this range option at all. if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) - || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) continue; //Support unicode chars in the range names. @@ -546,7 +546,7 @@ (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) && (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) - ) { + ) { return; } @@ -564,8 +564,8 @@ } } if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { - this.rightCalendar.month = this.maxDate.clone().date(2); - this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); } }, @@ -607,6 +607,7 @@ this.container.find('.ranges li').removeClass('active'); if (this.endDate == null) return; + this.element.trigger('updateCalendar.daterangepicker', this); this.calculateChosenLabel(); }, @@ -1049,7 +1050,7 @@ this.container.css({ top: containerTop, left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 - - this.container.outerWidth() / 2, + - this.container.outerWidth() / 2, right: 'auto' }); if (this.container.offset().left < 0) { @@ -1081,13 +1082,13 @@ // Bind global datepicker mousedown for hiding and $(document) - .on('mousedown.daterangepicker', this._outsideClickProxy) - // also support mobile devices - .on('touchend.daterangepicker', this._outsideClickProxy) - // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them - .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) - // and also close when focus changes to outside the picker (eg. tabbing between controls) - .on('focusin.daterangepicker', this._outsideClickProxy); + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); // Reposition the picker if the window is resized while it's open $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); @@ -1144,7 +1145,7 @@ target.closest(this.element).length || target.closest(this.container).length || target.closest('.calendar-table').length - ) return; + ) return; this.hide(); this.element.trigger('outsideClick.daterangepicker', this); }, @@ -1179,6 +1180,7 @@ this.hideCalendars(); this.clickApply(); } + }, clickPrev: function(e) { @@ -1191,6 +1193,7 @@ this.rightCalendar.month.subtract(1, 'month'); } this.updateCalendars(); + this.element.trigger('prev.daterangepicker', this); }, clickNext: function(e) { @@ -1203,6 +1206,7 @@ this.leftCalendar.month.add(1, 'month'); } this.updateCalendars(); + this.element.trigger('next.daterangepicker', this); }, hoverDate: function(e) { @@ -1298,8 +1302,8 @@ } this.setEndDate(date.clone()); if (this.autoApply) { - this.calculateChosenLabel(); - this.clickApply(); + this.calculateChosenLabel(); + this.clickApply(); } } @@ -1310,7 +1314,7 @@ } this.updateView(); - + this.element.trigger('selectDate.daterangepicker', this); //This is to cancel the blur event handler if the mouse was in one of the inputs e.stopPropagation(); @@ -1320,7 +1324,7 @@ var customRange = true; var i = 0; for (var range in this.ranges) { - if (this.timePicker) { + if (this.timePicker) { var format = this.timePickerSeconds ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD HH:mm"; //ignore times when comparing dates if time picker seconds is not enabled if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js index 9c5c544d4..aa58c5d5c 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js @@ -1 +1,1530 @@ -!function(t,e){if("function"==typeof define&&define.amd)define(["moment","jquery"],function(t,a){return a.fn||(a.fn={}),"function"!=typeof t&&t.default&&(t=t.default),e(t,a)});else if("object"==typeof module&&module.exports){var a="undefined"!=typeof window?window.jQuery:void 0;a||(a=require("jquery")).fn||(a.fn={});var i="undefined"!=typeof window&&void 0!==window.moment?window.moment:require("moment");module.exports=e(i,a)}else t.daterangepicker=e(t.moment,t.jQuery)}(this,function(t,e){var a=function(a,i,s){if(this.parentEl="body",this.element=e(a),this.startDate=t().startOf("day"),this.endDate=t().endOf("day"),this.minDate=!1,this.maxDate=!1,this.maxSpan=!1,this.autoApply=!1,this.singleDatePicker=!1,this.showDropdowns=!1,this.minYear=t().subtract(100,"year").format("YYYY"),this.maxYear=t().add(100,"year").format("YYYY"),this.showWeekNumbers=!1,this.showISOWeekNumbers=!1,this.showCustomRangeLabel=!0,this.timePicker=!1,this.timePicker24Hour=!1,this.timePickerIncrement=1,this.timePickerSeconds=!1,this.linkedCalendars=!0,this.autoUpdateInput=!0,this.alwaysShowCalendars=!1,this.ranges={},this.opens="right",this.element.hasClass("pull-right")&&(this.opens="left"),this.drops="down",this.element.hasClass("dropup")&&(this.drops="up"),this.buttonClasses="btn btn-sm",this.applyButtonClasses="btn-primary",this.cancelButtonClasses="btn-default",this.locale={direction:"ltr",format:t.localeData().longDateFormat("L"),separator:" - ",applyLabel:"Apply",cancelLabel:"Cancel",weekLabel:"W",customRangeLabel:"Custom Range",daysOfWeek:t.weekdaysMin(),monthNames:t.monthsShort(),firstDay:t.localeData().firstDayOfWeek()},this.callback=function(){},this.isShowing=!1,this.leftCalendar={},this.rightCalendar={},"object"==typeof i&&null!==i||(i={}),"string"==typeof(i=e.extend(this.element.data(),i)).template||i.template instanceof e||(i.template='
'),this.parentEl=i.parentEl&&e(i.parentEl).length?e(i.parentEl):e(this.parentEl),this.container=e(i.template).appendTo(this.parentEl),"object"==typeof i.locale&&("string"==typeof i.locale.direction&&(this.locale.direction=i.locale.direction),"string"==typeof i.locale.format&&(this.locale.format=i.locale.format),"string"==typeof i.locale.separator&&(this.locale.separator=i.locale.separator),"object"==typeof i.locale.daysOfWeek&&(this.locale.daysOfWeek=i.locale.daysOfWeek.slice()),"object"==typeof i.locale.monthNames&&(this.locale.monthNames=i.locale.monthNames.slice()),"number"==typeof i.locale.firstDay&&(this.locale.firstDay=i.locale.firstDay),"string"==typeof i.locale.applyLabel&&(this.locale.applyLabel=i.locale.applyLabel),"string"==typeof i.locale.cancelLabel&&(this.locale.cancelLabel=i.locale.cancelLabel),"string"==typeof i.locale.weekLabel&&(this.locale.weekLabel=i.locale.weekLabel),"string"==typeof i.locale.customRangeLabel)){(f=document.createElement("textarea")).innerHTML=i.locale.customRangeLabel;var n=f.value;this.locale.customRangeLabel=n}if(this.container.addClass(this.locale.direction),"string"==typeof i.startDate&&(this.startDate=t(i.startDate,this.locale.format)),"string"==typeof i.endDate&&(this.endDate=t(i.endDate,this.locale.format)),"string"==typeof i.minDate&&(this.minDate=t(i.minDate,this.locale.format)),"string"==typeof i.maxDate&&(this.maxDate=t(i.maxDate,this.locale.format)),"object"==typeof i.startDate&&(this.startDate=t(i.startDate)),"object"==typeof i.endDate&&(this.endDate=t(i.endDate)),"object"==typeof i.minDate&&(this.minDate=t(i.minDate)),"object"==typeof i.maxDate&&(this.maxDate=t(i.maxDate)),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),"string"==typeof i.applyButtonClasses&&(this.applyButtonClasses=i.applyButtonClasses),"string"==typeof i.applyClass&&(this.applyButtonClasses=i.applyClass),"string"==typeof i.cancelButtonClasses&&(this.cancelButtonClasses=i.cancelButtonClasses),"string"==typeof i.cancelClass&&(this.cancelButtonClasses=i.cancelClass),"object"==typeof i.maxSpan&&(this.maxSpan=i.maxSpan),"object"==typeof i.dateLimit&&(this.maxSpan=i.dateLimit),"string"==typeof i.opens&&(this.opens=i.opens),"string"==typeof i.drops&&(this.drops=i.drops),"boolean"==typeof i.showWeekNumbers&&(this.showWeekNumbers=i.showWeekNumbers),"boolean"==typeof i.showISOWeekNumbers&&(this.showISOWeekNumbers=i.showISOWeekNumbers),"string"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses),"object"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses.join(" ")),"boolean"==typeof i.showDropdowns&&(this.showDropdowns=i.showDropdowns),"number"==typeof i.minYear&&(this.minYear=i.minYear),"number"==typeof i.maxYear&&(this.maxYear=i.maxYear),"boolean"==typeof i.showCustomRangeLabel&&(this.showCustomRangeLabel=i.showCustomRangeLabel),"boolean"==typeof i.singleDatePicker&&(this.singleDatePicker=i.singleDatePicker,this.singleDatePicker&&(this.endDate=this.startDate.clone())),"boolean"==typeof i.timePicker&&(this.timePicker=i.timePicker),"boolean"==typeof i.timePickerSeconds&&(this.timePickerSeconds=i.timePickerSeconds),"number"==typeof i.timePickerIncrement&&(this.timePickerIncrement=i.timePickerIncrement),"boolean"==typeof i.timePicker24Hour&&(this.timePicker24Hour=i.timePicker24Hour),"boolean"==typeof i.autoApply&&(this.autoApply=i.autoApply),"boolean"==typeof i.autoUpdateInput&&(this.autoUpdateInput=i.autoUpdateInput),"boolean"==typeof i.linkedCalendars&&(this.linkedCalendars=i.linkedCalendars),"function"==typeof i.isInvalidDate&&(this.isInvalidDate=i.isInvalidDate),"function"==typeof i.isCustomDate&&(this.isCustomDate=i.isCustomDate),"boolean"==typeof i.alwaysShowCalendars&&(this.alwaysShowCalendars=i.alwaysShowCalendars),0!=this.locale.firstDay)for(var r=this.locale.firstDay;r>0;)this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),r--;var o,h,l;if(void 0===i.startDate&&void 0===i.endDate&&e(this.element).is(":text")){var c=e(this.element).val(),d=c.split(this.locale.separator);o=h=null,2==d.length?(o=t(d[0],this.locale.format),h=t(d[1],this.locale.format)):this.singleDatePicker&&""!==c&&(o=t(c,this.locale.format),h=t(c,this.locale.format)),null!==o&&null!==h&&(this.setStartDate(o),this.setEndDate(h))}if("object"==typeof i.ranges){for(l in i.ranges){o="string"==typeof i.ranges[l][0]?t(i.ranges[l][0],this.locale.format):t(i.ranges[l][0]),h="string"==typeof i.ranges[l][1]?t(i.ranges[l][1],this.locale.format):t(i.ranges[l][1]),this.minDate&&o.isBefore(this.minDate)&&(o=this.minDate.clone());var m=this.maxDate;if(this.maxSpan&&m&&o.clone().add(this.maxSpan).isAfter(m)&&(m=o.clone().add(this.maxSpan)),m&&h.isAfter(m)&&(h=m.clone()),!(this.minDate&&h.isBefore(this.minDate,this.timepicker?"minute":"day")||m&&o.isAfter(m,this.timepicker?"minute":"day"))){var f;(f=document.createElement("textarea")).innerHTML=l;n=f.value;this.ranges[n]=[o,h]}}var p="
    ";for(l in this.ranges)p+='
  • '+l+"
  • ";this.showCustomRangeLabel&&(p+='
  • '+this.locale.customRangeLabel+"
  • "),p+="
",this.container.find(".ranges").prepend(p)}"function"==typeof s&&(this.callback=s),this.timePicker||(this.startDate=this.startDate.startOf("day"),this.endDate=this.endDate.endOf("day"),this.container.find(".calendar-time").hide()),this.timePicker&&this.autoApply&&(this.autoApply=!1),this.autoApply&&this.container.addClass("auto-apply"),"object"==typeof i.ranges&&this.container.addClass("show-ranges"),this.singleDatePicker&&(this.container.addClass("single"),this.container.find(".drp-calendar.left").addClass("single"),this.container.find(".drp-calendar.left").show(),this.container.find(".drp-calendar.right").hide(),this.timePicker||this.container.addClass("auto-apply")),(void 0===i.ranges&&!this.singleDatePicker||this.alwaysShowCalendars)&&this.container.addClass("show-calendar"),this.container.addClass("opens"+this.opens),this.container.find(".applyBtn, .cancelBtn").addClass(this.buttonClasses),this.applyButtonClasses.length&&this.container.find(".applyBtn").addClass(this.applyButtonClasses),this.cancelButtonClasses.length&&this.container.find(".cancelBtn").addClass(this.cancelButtonClasses),this.container.find(".applyBtn").html(this.locale.applyLabel),this.container.find(".cancelBtn").html(this.locale.cancelLabel),this.container.find(".drp-calendar").on("click.daterangepicker",".prev",e.proxy(this.clickPrev,this)).on("click.daterangepicker",".next",e.proxy(this.clickNext,this)).on("mousedown.daterangepicker","td.available",e.proxy(this.clickDate,this)).on("mouseenter.daterangepicker","td.available",e.proxy(this.hoverDate,this)).on("change.daterangepicker","select.yearselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.monthselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.hourselect,select.minuteselect,select.secondselect,select.ampmselect",e.proxy(this.timeChanged,this)),this.container.find(".ranges").on("click.daterangepicker","li",e.proxy(this.clickRange,this)),this.container.find(".drp-buttons").on("click.daterangepicker","button.applyBtn",e.proxy(this.clickApply,this)).on("click.daterangepicker","button.cancelBtn",e.proxy(this.clickCancel,this)),this.element.is("input")||this.element.is("button")?this.element.on({"click.daterangepicker":e.proxy(this.show,this),"focus.daterangepicker":e.proxy(this.show,this),"keyup.daterangepicker":e.proxy(this.elementChanged,this),"keydown.daterangepicker":e.proxy(this.keydown,this)}):(this.element.on("click.daterangepicker",e.proxy(this.toggle,this)),this.element.on("keydown.daterangepicker",e.proxy(this.toggle,this))),this.updateElement()};return a.prototype={constructor:a,setStartDate:function(e){"string"==typeof e&&(this.startDate=t(e,this.locale.format)),"object"==typeof e&&(this.startDate=t(e)),this.timePicker||(this.startDate=this.startDate.startOf("day")),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.maxDate&&this.startDate.isAfter(this.maxDate)&&(this.startDate=this.maxDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.floor(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.isShowing||this.updateElement(),this.updateMonthsInView()},setEndDate:function(e){"string"==typeof e&&(this.endDate=t(e,this.locale.format)),"object"==typeof e&&(this.endDate=t(e)),this.timePicker||(this.endDate=this.endDate.add(1,"d").startOf("day").subtract(1,"second")),this.timePicker&&this.timePickerIncrement&&this.endDate.minute(Math.round(this.endDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.endDate.isBefore(this.startDate)&&(this.endDate=this.startDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),this.maxSpan&&this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)&&(this.endDate=this.startDate.clone().add(this.maxSpan)),this.previousRightTime=this.endDate.clone(),this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.isShowing||this.updateElement(),this.updateMonthsInView()},isInvalidDate:function(){return!1},isCustomDate:function(){return!1},updateView:function(){this.timePicker&&(this.renderTimePicker("left"),this.renderTimePicker("right"),this.endDate?this.container.find(".right .calendar-time select").removeAttr("disabled").removeClass("disabled"):this.container.find(".right .calendar-time select").attr("disabled","disabled").addClass("disabled")),this.endDate&&this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.updateMonthsInView(),this.updateCalendars(),this.updateFormInputs()},updateMonthsInView:function(){if(this.endDate){if(!this.singleDatePicker&&this.leftCalendar.month&&this.rightCalendar.month&&(this.startDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.startDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM"))&&(this.endDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.endDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM")))return;this.leftCalendar.month=this.startDate.clone().date(2),this.linkedCalendars||this.endDate.month()==this.startDate.month()&&this.endDate.year()==this.startDate.year()?this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"):this.rightCalendar.month=this.endDate.clone().date(2)}else this.leftCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&this.rightCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&(this.leftCalendar.month=this.startDate.clone().date(2),this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"));this.maxDate&&this.linkedCalendars&&!this.singleDatePicker&&this.rightCalendar.month>this.maxDate&&(this.rightCalendar.month=this.maxDate.clone().date(2),this.leftCalendar.month=this.maxDate.clone().date(2).subtract(1,"month"))},updateCalendars:function(){if(this.timePicker){var t,e,a,i;if(this.endDate){if(t=parseInt(this.container.find(".left .hourselect").val(),10),e=parseInt(this.container.find(".left .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".left .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0)}else if(t=parseInt(this.container.find(".right .hourselect").val(),10),e=parseInt(this.container.find(".right .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".right .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0);this.leftCalendar.month.hour(t).minute(e).second(a),this.rightCalendar.month.hour(t).minute(e).second(a)}this.renderCalendar("left"),this.renderCalendar("right"),this.container.find(".ranges li").removeClass("active"),null!=this.endDate&&this.calculateChosenLabel()},renderCalendar:function(a){var i,s=(i="left"==a?this.leftCalendar:this.rightCalendar).month.month(),n=i.month.year(),r=i.month.hour(),o=i.month.minute(),h=i.month.second(),l=t([n,s]).daysInMonth(),c=t([n,s,1]),d=t([n,s,l]),m=t(c).subtract(1,"month").month(),f=t(c).subtract(1,"month").year(),p=t([f,m]).daysInMonth(),u=c.day();(i=[]).firstDay=c,i.lastDay=d;for(var D=0;D<6;D++)i[D]=[];var g=p-u+this.locale.firstDay+1;g>p&&(g-=7),u==this.locale.firstDay&&(g=p-6);for(var y=t([f,m,g,12,o,h]),k=(D=0,0),b=0;D<42;D++,k++,y=t(y).add(24,"hour"))D>0&&k%7==0&&(k=0,b++),i[b][k]=y.clone().hour(r).minute(o).second(h),y.hour(12),this.minDate&&i[b][k].format("YYYY-MM-DD")==this.minDate.format("YYYY-MM-DD")&&i[b][k].isBefore(this.minDate)&&"left"==a&&(i[b][k]=this.minDate.clone()),this.maxDate&&i[b][k].format("YYYY-MM-DD")==this.maxDate.format("YYYY-MM-DD")&&i[b][k].isAfter(this.maxDate)&&"right"==a&&(i[b][k]=this.maxDate.clone());"left"==a?this.leftCalendar.calendar=i:this.rightCalendar.calendar=i;var C="left"==a?this.minDate:this.startDate,v=this.maxDate,Y=("left"==a?this.startDate:this.endDate,this.locale.direction,'');Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=""),C&&!C.isBefore(i.firstDay)||this.linkedCalendars&&"left"!=a?Y+="":Y+='';var w=this.locale.monthNames[i[1][1].month()]+i[1][1].format(" YYYY");if(this.showDropdowns){for(var P=i[1][1].month(),x=i[1][1].year(),M=v&&v.year()||this.maxYear,S=C&&C.year()||this.minYear,I=x==S,B=x==M,A='";for(var E='")}if(Y+='",v&&!v.isAfter(i.lastDay)||this.linkedCalendars&&"right"!=a&&!this.singleDatePicker?Y+="":Y+='',Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+='"),e.each(this.locale.daysOfWeek,function(t,e){Y+=""}),Y+="",Y+="",Y+="",null==this.endDate&&this.maxSpan){var O=this.startDate.clone().add(this.maxSpan).endOf("day");v&&!O.isBefore(v)||(v=O)}for(b=0;b<6;b++){Y+="",this.showWeekNumbers?Y+='":this.showISOWeekNumbers&&(Y+='");for(k=0;k<7;k++){var N=[];i[b][k].isSame(new Date,"day")&&N.push("today"),i[b][k].isoWeekday()>5&&N.push("weekend"),i[b][k].month()!=i[1][1].month()&&N.push("off"),this.minDate&&i[b][k].isBefore(this.minDate,"day")&&N.push("off","disabled"),v&&i[b][k].isAfter(v,"day")&&N.push("off","disabled"),this.isInvalidDate(i[b][k])&&N.push("off","disabled"),i[b][k].format("YYYY-MM-DD")==this.startDate.format("YYYY-MM-DD")&&N.push("active","start-date"),null!=this.endDate&&i[b][k].format("YYYY-MM-DD")==this.endDate.format("YYYY-MM-DD")&&N.push("active","end-date"),null!=this.endDate&&i[b][k]>this.startDate&&i[b][k]'+i[b][k].date()+""}Y+=""}Y+="",Y+="
'+w+"
'+this.locale.weekLabel+""+e+"
'+i[b][0].week()+"'+i[b][0].isoWeek()+"
",this.container.find(".drp-calendar."+a+" .calendar-table").html(Y)},renderTimePicker:function(t){if("right"!=t||this.endDate){var e,a,i,s=this.maxDate;if(!this.maxSpan||this.maxDate&&!this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate)||(s=this.startDate.clone().add(this.maxSpan)),"left"==t)a=this.startDate.clone(),i=this.minDate;else if("right"==t){a=this.endDate.clone(),i=this.startDate;var n=this.container.find(".drp-calendar.right .calendar-time");if(""!=n.html()&&(a.hour(a.hour()||n.find(".hourselect option:selected").val()),a.minute(a.minute()||n.find(".minuteselect option:selected").val()),a.second(a.second()||n.find(".secondselect option:selected").val()),!this.timePicker24Hour)){var r=n.find(".ampmselect option:selected").val();"PM"===r&&a.hour()<12&&a.hour(a.hour()+12),"AM"===r&&12===a.hour()&&a.hour(0)}a.isBefore(this.startDate)&&(a=this.startDate.clone()),s&&a.isAfter(s)&&(a=s.clone())}e=' ",e+=': ",this.timePickerSeconds){e+=': "}if(!this.timePicker24Hour){e+='"}this.container.find(".drp-calendar."+t+" .calendar-time").html(e)}},updateFormInputs:function(){this.singleDatePicker||this.endDate&&(this.startDate.isBefore(this.endDate)||this.startDate.isSame(this.endDate))?this.container.find("button.applyBtn").removeAttr("disabled"):this.container.find("button.applyBtn").attr("disabled","disabled")},move:function(){var t,a={top:0,left:0},i=e(window).width();this.parentEl.is("body")||(a={top:this.parentEl.offset().top-this.parentEl.scrollTop(),left:this.parentEl.offset().left-this.parentEl.scrollLeft()},i=this.parentEl[0].clientWidth+this.parentEl.offset().left),t="up"==this.drops?this.element.offset().top-this.container.outerHeight()-a.top:this.element.offset().top+this.element.outerHeight()-a.top,this.container["up"==this.drops?"addClass":"removeClass"]("drop-up"),"left"==this.opens?(this.container.css({top:t,right:i-this.element.offset().left-this.element.outerWidth(),left:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):"center"==this.opens?(this.container.css({top:t,left:this.element.offset().left-a.left+this.element.outerWidth()/2-this.container.outerWidth()/2,right:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):(this.container.css({top:t,left:this.element.offset().left-a.left,right:"auto"}),this.container.offset().left+this.container.outerWidth()>e(window).width()&&this.container.css({left:"auto",right:0}))},show:function(t){this.isShowing||(this._outsideClickProxy=e.proxy(function(t){this.outsideClick(t)},this),e(document).on("mousedown.daterangepicker",this._outsideClickProxy).on("touchend.daterangepicker",this._outsideClickProxy).on("click.daterangepicker","[data-toggle=dropdown]",this._outsideClickProxy).on("focusin.daterangepicker",this._outsideClickProxy),e(window).on("resize.daterangepicker",e.proxy(function(t){this.move(t)},this)),this.oldStartDate=this.startDate.clone(),this.oldEndDate=this.endDate.clone(),this.previousRightTime=this.endDate.clone(),this.updateView(),this.container.show(),this.move(),this.element.trigger("show.daterangepicker",this),this.isShowing=!0)},hide:function(t){this.isShowing&&(this.endDate||(this.startDate=this.oldStartDate.clone(),this.endDate=this.oldEndDate.clone()),this.startDate.isSame(this.oldStartDate)&&this.endDate.isSame(this.oldEndDate)||this.callback(this.startDate.clone(),this.endDate.clone(),this.chosenLabel),this.updateElement(),e(document).off(".daterangepicker"),e(window).off(".daterangepicker"),this.container.hide(),this.element.trigger("hide.daterangepicker",this),this.isShowing=!1)},toggle:function(t){this.isShowing?this.hide():this.show()},outsideClick:function(t){var a=e(t.target);"focusin"==t.type||a.closest(this.element).length||a.closest(this.container).length||a.closest(".calendar-table").length||(this.hide(),this.element.trigger("outsideClick.daterangepicker",this))},showCalendars:function(){this.container.addClass("show-calendar"),this.move(),this.element.trigger("showCalendar.daterangepicker",this)},hideCalendars:function(){this.container.removeClass("show-calendar"),this.element.trigger("hideCalendar.daterangepicker",this)},clickRange:function(t){var e=t.target.getAttribute("data-range-key");if(this.chosenLabel=e,e==this.locale.customRangeLabel)this.showCalendars();else{var a=this.ranges[e];this.startDate=a[0],this.endDate=a[1],this.timePicker||(this.startDate.startOf("day"),this.endDate.endOf("day")),this.alwaysShowCalendars||this.hideCalendars(),this.clickApply()}},clickPrev:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?(this.leftCalendar.month.subtract(1,"month"),this.linkedCalendars&&this.rightCalendar.month.subtract(1,"month")):this.rightCalendar.month.subtract(1,"month"),this.updateCalendars()},clickNext:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.month.add(1,"month"):(this.rightCalendar.month.add(1,"month"),this.linkedCalendars&&this.leftCalendar.month.add(1,"month")),this.updateCalendars()},hoverDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s],r=this.leftCalendar,o=this.rightCalendar,h=this.startDate;this.endDate||this.container.find(".drp-calendar tbody td").each(function(t,a){if(!e(a).hasClass("week")){var i=e(a).attr("data-title"),s=i.substr(1,1),l=i.substr(3,1),c=e(a).parents(".drp-calendar").hasClass("left")?r.calendar[s][l]:o.calendar[s][l];c.isAfter(h)&&c.isBefore(n)||c.isSame(n,"day")?e(a).addClass("in-range"):e(a).removeClass("in-range")}})}},clickDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s];if(this.endDate||n.isBefore(this.startDate,"day")){if(this.timePicker){var r=parseInt(this.container.find(".left .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".left .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);var o=parseInt(this.container.find(".left .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.endDate=null,this.setStartDate(n.clone())}else if(!this.endDate&&n.isBefore(this.startDate))this.setEndDate(this.startDate.clone());else{if(this.timePicker){var l;r=parseInt(this.container.find(".right .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".right .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);o=parseInt(this.container.find(".right .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.setEndDate(n.clone()),this.autoApply&&(this.calculateChosenLabel(),this.clickApply())}this.singleDatePicker&&(this.setEndDate(this.startDate),this.timePicker||this.clickApply()),this.updateView(),t.stopPropagation()}},calculateChosenLabel:function(){var t=!0,e=0;for(var a in this.ranges){if(this.timePicker){var i=this.timePickerSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm";if(this.startDate.format(i)==this.ranges[a][0].format(i)&&this.endDate.format(i)==this.ranges[a][1].format(i)){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}}else if(this.startDate.format("YYYY-MM-DD")==this.ranges[a][0].format("YYYY-MM-DD")&&this.endDate.format("YYYY-MM-DD")==this.ranges[a][1].format("YYYY-MM-DD")){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}e++}t&&(this.showCustomRangeLabel?this.chosenLabel=this.container.find(".ranges li:last").addClass("active").attr("data-range-key"):this.chosenLabel=null,this.showCalendars())},clickApply:function(t){this.hide(),this.element.trigger("apply.daterangepicker",this)},clickCancel:function(t){this.startDate=this.oldStartDate,this.endDate=this.oldEndDate,this.hide(),this.element.trigger("cancel.daterangepicker",this)},monthOrYearChanged:function(t){var a=e(t.target).closest(".drp-calendar").hasClass("left"),i=a?"left":"right",s=this.container.find(".drp-calendar."+i),n=parseInt(s.find(".monthselect").val(),10),r=s.find(".yearselect").val();a||(rthis.maxDate.year()||r==this.maxDate.year()&&n>this.maxDate.month())&&(n=this.maxDate.month(),r=this.maxDate.year()),a?(this.leftCalendar.month.month(n).year(r),this.linkedCalendars&&(this.rightCalendar.month=this.leftCalendar.month.clone().add(1,"month"))):(this.rightCalendar.month.month(n).year(r),this.linkedCalendars&&(this.leftCalendar.month=this.rightCalendar.month.clone().subtract(1,"month"))),this.updateCalendars()},timeChanged:function(t){var a=e(t.target).closest(".drp-calendar"),i=a.hasClass("left"),s=parseInt(a.find(".hourselect").val(),10),n=parseInt(a.find(".minuteselect").val(),10),r=this.timePickerSeconds?parseInt(a.find(".secondselect").val(),10):0;if(!this.timePicker24Hour){var o=a.find(".ampmselect").val();"PM"===o&&s<12&&(s+=12),"AM"===o&&12===s&&(s=0)}if(i){var h=this.startDate.clone();h.hour(s),h.minute(n),h.second(r),this.setStartDate(h),this.singleDatePicker?this.endDate=this.startDate.clone():this.endDate&&this.endDate.format("YYYY-MM-DD")==h.format("YYYY-MM-DD")&&this.endDate.isBefore(h)&&this.setEndDate(h.clone())}else if(this.endDate){var l=this.endDate.clone();l.hour(s),l.minute(n),l.second(r),this.setEndDate(l)}this.updateCalendars(),this.updateFormInputs(),this.renderTimePicker("left"),this.renderTimePicker("right")},elementChanged:function(){if(this.element.is("input")&&this.element.val().length){var e=this.element.val().split(this.locale.separator),a=null,i=null;2===e.length&&(a=t(e[0],this.locale.format),i=t(e[1],this.locale.format)),(this.singleDatePicker||null===a||null===i)&&(i=a=t(this.element.val(),this.locale.format)),a.isValid()&&i.isValid()&&(this.setStartDate(a),this.setEndDate(i),this.updateView())}},keydown:function(t){9!==t.keyCode&&13!==t.keyCode||this.hide(),27===t.keyCode&&(t.preventDefault(),t.stopPropagation(),this.hide())},updateElement:function(){if(this.element.is("input")&&this.autoUpdateInput){var t=this.startDate.format(this.locale.format);this.singleDatePicker||(t+=this.locale.separator+this.endDate.format(this.locale.format)),t!==this.element.val()&&this.element.val(t).trigger("change")}},remove:function(){this.container.remove(),this.element.off(".daterangepicker"),this.element.removeData()}},e.fn.daterangepicker=function(t,i){var s=e.extend(!0,{},e.fn.daterangepicker.defaultOptions,t);return this.each(function(){var t=e(this);t.data("daterangepicker")&&t.data("daterangepicker").remove(),t.data("daterangepicker",new a(t,s,i))}),this},a}); \ No newline at end of file +/** + * @version: 3.0.3 + * @author: Dan Grossman http://www.dangrossman.info/ + * @copyright: Copyright (c) 2012-2018 Dan Grossman. All rights reserved. + * @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php + * @website: http://www.daterangepicker.com/ + */ +// Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Make globaly available as well + define(['moment', 'jquery'], function (moment, jquery) { + if (!jquery.fn) jquery.fn = {}; // webpack server rendering + if (typeof moment !== 'function' && moment.default) moment = moment.default + return factory(moment, jquery); + }); + } else if (typeof module === 'object' && module.exports) { + // Node / Browserify + //isomorphic issue + var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined; + if (!jQuery) { + jQuery = require('jquery'); + if (!jQuery.fn) jQuery.fn = {}; + } + var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); + module.exports = factory(moment, jQuery); + } else { + // Browser globals + root.daterangepicker = factory(root.moment, root.jQuery); + } +}(this, function(moment, $) { + var DateRangePicker = function(element, options, cb) { + + //default settings for options + this.parentEl = 'body'; + this.element = $(element); + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.maxSpan = false; + this.autoApply = false; + this.singleDatePicker = false; + this.showDropdowns = false; + this.minYear = moment().subtract(100, 'year').format('YYYY'); + this.maxYear = moment().add(100, 'year').format('YYYY'); + this.showWeekNumbers = false; + this.showISOWeekNumbers = false; + this.showCustomRangeLabel = true; + this.timePicker = false; + this.timePicker24Hour = false; + this.timePickerIncrement = 1; + this.timePickerSeconds = false; + this.linkedCalendars = true; + this.autoUpdateInput = true; + this.alwaysShowCalendars = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.drops = 'down'; + if (this.element.hasClass('dropup')) + this.drops = 'up'; + + this.buttonClasses = 'btn btn-sm'; + this.applyButtonClasses = 'btn-primary'; + this.cancelButtonClasses = 'btn-default'; + + this.locale = { + direction: 'ltr', + format: moment.localeData().longDateFormat('L'), + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment.weekdaysMin(), + monthNames: moment.monthsShort(), + firstDay: moment.localeData().firstDayOfWeek() + }; + + this.callback = function() { }; + + //some state information + this.isShowing = false; + this.leftCalendar = {}; + this.rightCalendar = {}; + + //custom options from user + if (typeof options !== 'object' || options === null) + options = {}; + + //allow setting options with data attributes + //data-api options will be overwritten with custom javascript options + options = $.extend(this.element.data(), options); + + //html template for the picker UI + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '' + + ' ' + + '
' + + '
'; + + this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(options.template).appendTo(this.parentEl); + + // + // handle all the possible options overriding defaults + // + + if (typeof options.locale === 'object') { + + if (typeof options.locale.direction === 'string') + this.locale.direction = options.locale.direction; + + if (typeof options.locale.format === 'string') + this.locale.format = options.locale.format; + + if (typeof options.locale.separator === 'string') + this.locale.separator = options.locale.separator; + + if (typeof options.locale.daysOfWeek === 'object') + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + + if (typeof options.locale.monthNames === 'object') + this.locale.monthNames = options.locale.monthNames.slice(); + + if (typeof options.locale.firstDay === 'number') + this.locale.firstDay = options.locale.firstDay; + + if (typeof options.locale.applyLabel === 'string') + this.locale.applyLabel = options.locale.applyLabel; + + if (typeof options.locale.cancelLabel === 'string') + this.locale.cancelLabel = options.locale.cancelLabel; + + if (typeof options.locale.weekLabel === 'string') + this.locale.weekLabel = options.locale.weekLabel; + + if (typeof options.locale.customRangeLabel === 'string'){ + //Support unicode chars in the custom range name. + var elem = document.createElement('textarea'); + elem.innerHTML = options.locale.customRangeLabel; + var rangeHtml = elem.value; + this.locale.customRangeLabel = rangeHtml; + } + } + this.container.addClass(this.locale.direction); + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.locale.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.locale.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.locale.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.locale.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + // sanity check for bad options + if (this.minDate && this.startDate.isBefore(this.minDate)) + this.startDate = this.minDate.clone(); + + // sanity check for bad options + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (typeof options.applyButtonClasses === 'string') + this.applyButtonClasses = options.applyButtonClasses; + + if (typeof options.applyClass === 'string') //backwards compat + this.applyButtonClasses = options.applyClass; + + if (typeof options.cancelButtonClasses === 'string') + this.cancelButtonClasses = options.cancelButtonClasses; + + if (typeof options.cancelClass === 'string') //backwards compat + this.cancelButtonClasses = options.cancelClass; + + if (typeof options.maxSpan === 'object') + this.maxSpan = options.maxSpan; + + if (typeof options.dateLimit === 'object') //backwards compat + this.maxSpan = options.dateLimit; + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') + this.showWeekNumbers = options.showWeekNumbers; + + if (typeof options.showISOWeekNumbers === 'boolean') + this.showISOWeekNumbers = options.showISOWeekNumbers; + + if (typeof options.buttonClasses === 'string') + this.buttonClasses = options.buttonClasses; + + if (typeof options.buttonClasses === 'object') + this.buttonClasses = options.buttonClasses.join(' '); + + if (typeof options.showDropdowns === 'boolean') + this.showDropdowns = options.showDropdowns; + + if (typeof options.minYear === 'number') + this.minYear = options.minYear; + + if (typeof options.maxYear === 'number') + this.maxYear = options.maxYear; + + if (typeof options.showCustomRangeLabel === 'boolean') + this.showCustomRangeLabel = options.showCustomRangeLabel; + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) + this.endDate = this.startDate.clone(); + } + + if (typeof options.timePicker === 'boolean') + this.timePicker = options.timePicker; + + if (typeof options.timePickerSeconds === 'boolean') + this.timePickerSeconds = options.timePickerSeconds; + + if (typeof options.timePickerIncrement === 'number') + this.timePickerIncrement = options.timePickerIncrement; + + if (typeof options.timePicker24Hour === 'boolean') + this.timePicker24Hour = options.timePicker24Hour; + + if (typeof options.autoApply === 'boolean') + this.autoApply = options.autoApply; + + if (typeof options.autoUpdateInput === 'boolean') + this.autoUpdateInput = options.autoUpdateInput; + + if (typeof options.linkedCalendars === 'boolean') + this.linkedCalendars = options.linkedCalendars; + + if (typeof options.isInvalidDate === 'function') + this.isInvalidDate = options.isInvalidDate; + + if (typeof options.isCustomDate === 'function') + this.isCustomDate = options.isCustomDate; + + if (typeof options.alwaysShowCalendars === 'boolean') + this.alwaysShowCalendars = options.alwaysShowCalendars; + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is(':text')) { + var val = $(this.element).val(), + split = val.split(this.locale.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.locale.format); + end = moment(split[1], this.locale.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.locale.format); + end = moment(val, this.locale.format); + } + if (start !== null && end !== null) { + this.setStartDate(start); + this.setEndDate(end); + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.locale.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.locale.format); + else + end = moment(options.ranges[range][1]); + + // If the start or end date exceed those allowed by the minDate or maxSpan + // options, shorten the range to the allowable period. + if (this.minDate && start.isBefore(this.minDate)) + start = this.minDate.clone(); + + var maxDate = this.maxDate; + if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate)) + maxDate = start.clone().add(this.maxSpan); + if (maxDate && end.isAfter(maxDate)) + end = maxDate.clone(); + + // If the end of the range is before the minimum or the start of the range is + // after the maximum, don't display this range option at all. + if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + continue; + + //Support unicode chars in the range names. + var elem = document.createElement('textarea'); + elem.innerHTML = range; + var rangeHtml = elem.value; + + this.ranges[rangeHtml] = [start, end]; + } + + var list = '
    '; + for (range in this.ranges) { + list += '
  • ' + range + '
  • '; + } + if (this.showCustomRangeLabel) { + list += '
  • ' + this.locale.customRangeLabel + '
  • '; + } + list += '
'; + this.container.find('.ranges').prepend(list); + } + + if (typeof cb === 'function') { + this.callback = cb; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + this.container.find('.calendar-time').hide(); + } + + //can't be used together for now + if (this.timePicker && this.autoApply) + this.autoApply = false; + + if (this.autoApply) { + this.container.addClass('auto-apply'); + } + + if (typeof options.ranges === 'object') + this.container.addClass('show-ranges'); + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.drp-calendar.left').addClass('single'); + this.container.find('.drp-calendar.left').show(); + this.container.find('.drp-calendar.right').hide(); + if (!this.timePicker) { + this.container.addClass('auto-apply'); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyButtonClasses.length) + this.container.find('.applyBtn').addClass(this.applyButtonClasses); + if (this.cancelButtonClasses.length) + this.container.find('.cancelBtn').addClass(this.cancelButtonClasses); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.drp-calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) + + this.container.find('.ranges') + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + + this.container.find('.drp-buttons') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + + if (this.element.is('input') || this.element.is('button')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.elementChanged, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); + } + + // + // if attached to a text input, set the initial value + // + + this.updateElement(); + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.locale.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.minDate && this.startDate.isBefore(this.minDate)) { + this.startDate = this.minDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (this.maxDate && this.startDate.isAfter(this.maxDate)) { + this.startDate = this.maxDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.locale.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); + + if (this.timePicker && this.timePickerIncrement) + this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.endDate.isBefore(this.startDate)) + this.endDate = this.startDate.clone(); + + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (this.maxSpan && this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.maxSpan); + + this.previousRightTime = this.endDate.clone(); + + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + isInvalidDate: function() { + return false; + }, + + isCustomDate: function() { + return false; + }, + + updateView: function() { + if (this.timePicker) { + this.renderTimePicker('left'); + this.renderTimePicker('right'); + if (!this.endDate) { + this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); + } else { + this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); + } + } + if (this.endDate) + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.updateMonthsInView(); + this.updateCalendars(); + this.updateFormInputs(); + }, + + updateMonthsInView: function() { + if (this.endDate) { + + //if both dates are visible already, do nothing + if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && + (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + && + (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + ) { + return; + } + + this.leftCalendar.month = this.startDate.clone().date(2); + if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { + this.rightCalendar.month = this.endDate.clone().date(2); + } else { + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + + } else { + if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { + this.leftCalendar.month = this.startDate.clone().date(2); + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + } + if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + } + }, + + updateCalendars: function() { + + if (this.timePicker) { + var hour, minute, second; + if (this.endDate) { + hour = parseInt(this.container.find('.left .hourselect').val(), 10); + minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } else { + hour = parseInt(this.container.find('.right .hourselect').val(), 10); + minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } + this.leftCalendar.month.hour(hour).minute(minute).second(second); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.renderCalendar('left'); + this.renderCalendar('right'); + + //highlight any predefined range matching the current start and end dates + this.container.find('.ranges li').removeClass('active'); + if (this.endDate == null) return; + + this.element.trigger('updateCalendar.daterangepicker', this); + this.calculateChosenLabel(); + }, + + renderCalendar: function(side) { + + // + // Build the matrix of dates that will populate the calendar + // + + var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; + var month = calendar.month.month(); + var year = calendar.month.year(); + var hour = calendar.month.hour(); + var minute = calendar.month.minute(); + var second = calendar.month.second(); + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); + + var col, row; + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + //make the calendar object available to hoverDate/clickDate + if (side == 'left') { + this.leftCalendar.calendar = calendar; + } else { + this.rightCalendar.calendar = calendar; + } + + // + // Display the calendar + // + + var minDate = side == 'left' ? this.minDate : this.startDate; + var maxDate = this.maxDate; + var selected = side == 'left' ? this.startDate : this.endDate; + var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; + + var html = ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + var currentMonth = calendar[1][1].month(); + var currentYear = calendar[1][1].year(); + var maxYear = (maxDate && maxDate.year()) || (this.maxYear); + var minYear = (minDate && minDate.year()) || (this.minYear); + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + var monthHtml = '"; + + var yearHtml = ''; + + dateHtml = monthHtml + yearHtml; + } + + html += ''; + if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + //adjust maxDate to reflect the maxSpan setting in order to + //grey out end dates beyond the maxSpan + if (this.endDate == null && this.maxSpan) { + var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day'); + if (!maxDate || maxLimit.isBefore(maxDate)) { + maxDate = maxLimit; + } + } + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + else if (this.showISOWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + + var classes = []; + + //highlight today's date + if (calendar[row][col].isSame(new Date(), "day")) + classes.push('today'); + + //highlight weekends + if (calendar[row][col].isoWeekday() > 5) + classes.push('weekend'); + + //grey out the dates in other months displayed at beginning and end of this calendar + if (calendar[row][col].month() != calendar[1][1].month()) + classes.push('off'); + + //don't allow selection of dates before the minimum date + if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of dates after the maximum date + if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of date if a custom function decides it's invalid + if (this.isInvalidDate(calendar[row][col])) + classes.push('off', 'disabled'); + + //highlight the currently selected start date + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) + classes.push('active', 'start-date'); + + //highlight the currently selected end date + if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) + classes.push('active', 'end-date'); + + //highlight dates in-between the selected dates + if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) + classes.push('in-range'); + + //apply custom classes for this date + var isCustom = this.isCustomDate(calendar[row][col]); + if (isCustom !== false) { + if (typeof isCustom === 'string') + classes.push(isCustom); + else + Array.prototype.push.apply(classes, isCustom); + } + + var cname = '', disabled = false; + for (var i = 0; i < classes.length; i++) { + cname += classes[i] + ' '; + if (classes[i] == 'disabled') + disabled = true; + } + if (!disabled) + cname += 'available'; + + html += ''; + + } + html += ''; + } + + html += ''; + html += '
' + dateHtml + '
' + this.locale.weekLabel + '' + dayOfWeek + '
' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
'; + + this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html); + + }, + + renderTimePicker: function(side) { + + // Don't bother updating the time picker if it's currently disabled + // because an end date hasn't been clicked yet + if (side == 'right' && !this.endDate) return; + + var html, selected, minDate, maxDate = this.maxDate; + + if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate))) + maxDate = this.startDate.clone().add(this.maxSpan); + + if (side == 'left') { + selected = this.startDate.clone(); + minDate = this.minDate; + } else if (side == 'right') { + selected = this.endDate.clone(); + minDate = this.startDate; + + //Preserve the time already selected + var timeSelector = this.container.find('.drp-calendar.right .calendar-time'); + if (timeSelector.html() != '') { + + selected.hour(selected.hour() || timeSelector.find('.hourselect option:selected').val()); + selected.minute(selected.minute() || timeSelector.find('.minuteselect option:selected').val()); + selected.second(selected.second() || timeSelector.find('.secondselect option:selected').val()); + + if (!this.timePicker24Hour) { + var ampm = timeSelector.find('.ampmselect option:selected').val(); + if (ampm === 'PM' && selected.hour() < 12) + selected.hour(selected.hour() + 12); + if (ampm === 'AM' && selected.hour() === 12) + selected.hour(0); + } + + } + + if (selected.isBefore(this.startDate)) + selected = this.startDate.clone(); + + if (maxDate && selected.isAfter(maxDate)) + selected = maxDate.clone(); + + } + + // + // hours + // + + html = ' '; + + // + // minutes + // + + html += ': '; + + // + // seconds + // + + if (this.timePickerSeconds) { + html += ': '; + } + + // + // AM/PM + // + + if (!this.timePicker24Hour) { + html += ''; + } + + this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html); + + }, + + updateFormInputs: function() { + + if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + + }, + + move: function() { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('drop-up'); + + if (this.opens == 'left') { + this.container.css({ + top: containerTop, + right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else if (this.opens == 'center') { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - this.container.outerWidth() / 2, + right: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + show: function(e) { + if (this.isShowing) return; + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); + + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + // Reposition the picker if the window is resized while it's open + $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.previousRightTime = this.endDate.clone(); + + this.updateView(); + this.container.show(); + this.move(); + this.element.trigger('show.daterangepicker', this); + this.isShowing = true; + }, + + hide: function(e) { + if (!this.isShowing) return; + + //incomplete date selection, revert to last values + if (!this.endDate) { + this.startDate = this.oldStartDate.clone(); + this.endDate = this.oldEndDate.clone(); + } + + //if a new date range was selected, invoke the user callback function + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel); + + //if picker is attached to a text input, update it + this.updateElement(); + + $(document).off('.daterangepicker'); + $(window).off('.daterangepicker'); + this.container.hide(); + this.element.trigger('hide.daterangepicker', this); + this.isShowing = false; + }, + + toggle: function(e) { + if (this.isShowing) { + this.hide(); + } else { + this.show(); + } + }, + + outsideClick: function(e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length + ) return; + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + clickRange: function(e) { + var label = e.target.getAttribute('data-range-key'); + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + if (!this.alwaysShowCalendars) + this.hideCalendars(); + this.clickApply(); + } + + }, + + clickPrev: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + if (this.linkedCalendars) + this.rightCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + this.element.trigger('prev.daterangepicker', this); + }, + + clickNext: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + if (this.linkedCalendars) + this.leftCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + this.element.trigger('next.daterangepicker', this); + }, + + hoverDate: function(e) { + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + //highlight the dates between the start date and the date being hovered as a potential end date + var leftCalendar = this.leftCalendar; + var rightCalendar = this.rightCalendar; + var startDate = this.startDate; + if (!this.endDate) { + this.container.find('.drp-calendar tbody td').each(function(index, el) { + + //skip week numbers, only look at dates + if ($(el).hasClass('week')) return; + + var title = $(el).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(el).parents('.drp-calendar'); + var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; + + if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { + $(el).addClass('in-range'); + } else { + $(el).removeClass('in-range'); + } + + }); + } + + }, + + clickDate: function(e) { + + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + // + // this function needs to do a few things: + // * alternate between selecting a start and end date for the range, + // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date + // * if autoapply is enabled, and an end date was chosen, apply the selection + // * if single date picker mode, and time picker isn't enabled, apply the selection immediately + // * if one of the inputs above the calendars was focused, cancel that manual input + // + + if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start + if (this.timePicker) { + var hour = parseInt(this.container.find('.left .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.endDate = null; + this.setStartDate(date.clone()); + } else if (!this.endDate && date.isBefore(this.startDate)) { + //special case: clicking the same date for start/end, + //but the time of the end date is before the start date + this.setEndDate(this.startDate.clone()); + } else { // picking end + if (this.timePicker) { + var hour = parseInt(this.container.find('.right .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.setEndDate(date.clone()); + if (this.autoApply) { + this.calculateChosenLabel(); + this.clickApply(); + } + } + + if (this.singleDatePicker) { + this.setEndDate(this.startDate); + if (!this.timePicker) + this.clickApply(); + } + + this.updateView(); + this.element.trigger('selectDate.daterangepicker', this); + //This is to cancel the blur event handler if the mouse was in one of the inputs + e.stopPropagation(); + + }, + + calculateChosenLabel: function () { + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD HH:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key'); + } else { + this.chosenLabel = null; + } + this.showCalendars(); + } + }, + + clickApply: function(e) { + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function(e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + monthOrYearChanged: function(e) { + var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.drp-calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); + } else { + this.rightCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); + } + this.updateCalendars(); + }, + + timeChanged: function(e) { + + var cal = $(e.target).closest('.drp-calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; + + if (!this.timePicker24Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.setStartDate(start); + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { + this.setEndDate(start.clone()); + } + } else if (this.endDate) { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.setEndDate(end); + } + + //update the calendars so all clickable dates reflect the new time component + this.updateCalendars(); + + //update the form inputs above the calendars with the new time + this.updateFormInputs(); + + //re-render the time pickers because changing one selection can affect what's enabled in another + this.renderTimePicker('left'); + this.renderTimePicker('right'); + + }, + + elementChanged: function() { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.locale.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.locale.format); + end = moment(dateString[1], this.locale.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.locale.format); + end = start; + } + + if (!start.isValid() || !end.isValid()) return; + + this.setStartDate(start); + this.setEndDate(end); + this.updateView(); + }, + + keydown: function(e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } + }, + + updateElement: function() { + if (this.element.is('input') && this.autoUpdateInput) { + var newValue = this.startDate.format(this.locale.format); + if (!this.singleDatePicker) { + newValue += this.locale.separator + this.endDate.format(this.locale.format); + } + if (newValue !== this.element.val()) { + this.element.val(newValue).trigger('change'); + } + } + }, + + remove: function() { + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData(); + } + + }; + + $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); + this.each(function() { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); + }); + return this; + }; + + return DateRangePicker; + +})); From 3c394eaba9894f2e8b2f8b7ca0717d8301a0400f Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 3 Dec 2018 13:47:44 +0800 Subject: [PATCH 060/247] More updates on Materialize theme + Mobile Support Date Range Widget --- .../client/daterange/DateRangePicker.java | 7 - .../css/daterangepicker-materialize.css | 135 +++++++++++++++- .../css/daterangepicker-materialize.min.css | 147 +----------------- 3 files changed, 129 insertions(+), 160 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 5e37327b7..872830841 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -17,8 +17,6 @@ import gwt.material.design.client.base.mixin.FieldTypeMixin; import gwt.material.design.client.base.mixin.ReadOnlyMixin; import gwt.material.design.client.base.mixin.StatusTextMixin; -import gwt.material.design.client.base.viewport.Resolution; -import gwt.material.design.client.base.viewport.ViewPort; import gwt.material.design.client.constants.*; import gwt.material.design.client.ui.MaterialIcon; import gwt.material.design.client.ui.MaterialLabel; @@ -30,7 +28,6 @@ import java.util.Date; -import static gwt.material.design.addins.client.moment.Moment.moment; import static gwt.material.design.incubator.client.daterange.js.JsDateRange.$; @@ -80,10 +77,6 @@ protected void load() { add(label); add(errorLabel); - ViewPort.when(Resolution.ALL_MOBILE).then(param1 -> { - setDropdownAlignment(DropdownAlignment.CENTER); - }); - getInputElement().daterangepicker(options, (param1, param2, param3) -> { //TODO Change event }); diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index 2428d27a1..78db0ac49 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -14,6 +14,31 @@ font-size: 1.2em; } +.daterangepicker .calendar-table table { + position: relative; +} + +.daterangepicker .calendar-table th.next, +.daterangepicker .calendar-table th.prev { + position: absolute; +} + +.daterangepicker .calendar-table th.next { + position: absolute; + right: 0; + top: 14px; +} + +.daterangepicker .calendar-table th.prev { + position: absolute; + top: 14px; + left: 0px; +} + +.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child { + display: none; +} + /** Calendar Day Item / Columns **/ .daterangepicker .calendar-table td.available { width: 36px !important; @@ -65,12 +90,6 @@ padding: 20px; } -/** Action Buttons **/ -.daterangepicker .calendar-table .prev { - left: -18px; - right: unset; -} - /** Month and Year Selection **/ .date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field { width: 100% !important; @@ -120,6 +139,16 @@ border-color: transparent transparent #9c9c9c !important; } +.date-range-picker .select2-container--open .select2-dropdown--above, +.date-range-picker .select2-container--open .select2-dropdown--below { + margin-top: -44px; +} + +/** Calendar Time Picker **/ +.daterangepicker .calendar-time select { + display: inline-block; +} + /** Calendar Footer **/ .daterangepicker .drp-buttons .btn { padding-left: 12px; @@ -143,4 +172,96 @@ button.cancelBtn { button.cancelBtn:hover { color: #ffffff; border: none; -} \ No newline at end of file +} + +/** Mobile Queries **/ +@media screen and (max-width: 600px) { + .daterangepicker:not(.single) .drp-selected { + display: none; + } + + .daterangepicker:not(.single) { + position: fixed; + top: 0px !important; + left: 0px !important; + width: 100%; + margin-top: 0px; + overflow: auto; + bottom: 0px; + padding-top: 12px; + padding-bottom: 56px; + } + + .daterangepicker:before:not(.single) { + display: none; + } + + .daterangepicker:not(.single) .drp-calendar.left, + .daterangepicker:not(.single) .drp-calendar.right { + display: block; + margin: auto; + float: none !important; + padding: 0px 10%; + border-bottom: 1px solid #e9e9e9; + } + + .daterangepicker:not(.single) .drp-calendar.right { + border-bottom: none; + margin-top: 4px; + } + + .daterangepicker:not(.single) .drp-buttons { + position: fixed; + bottom: 0; + width: 100%; + background: #fafafa; + } + + .daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1), + .daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2) { + height: 32px; + } + + .daterangepicker:not(.single) th.month { + position: absolute; + width: 100%; + text-align: center; + } + + .daterangepicker:not(.single) .drp-calendar.left { + padding-bottom: 20px; + } + + .daterangepicker:not(.single) .drp-calendar.right { + margin-top: 12px; + } + + .daterangepicker:not(.single) .calendar-table th.next, + .daterangepicker:not(.single) .calendar-table th.prev { + top: 0px; + position: fixed; + margin: 12px; + } + + .daterangepicker:not(.single) td.active, + .daterangepicker:not(.single) td.active:hover, + .daterangepicker:not(.single) td.in-range.active:not(.off) { + border-radius: 4px !important; + } + + /** Dropdown selection **/ + .daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered, + .daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow { + line-height: 24px; + } + + .daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after { + bottom: unset; + top: 8px; + } + + .date-range-picker .select2-container--open .select2-dropdown--above, + .date-range-picker .select2-container--open .select2-dropdown--below { + margin-top: -60px; + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index 2428d27a1..77c346e3e 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1,146 +1 @@ -/** Calendar **/ -.daterangepicker { - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12); -} - -/** Calendar Header **/ -.daterangepicker .calendar-table th, -.daterangepicker .calendar-table td { - padding: unset; -} - -.daterangepicker th.month { - color: #444; - font-size: 1.2em; -} - -/** Calendar Day Item / Columns **/ -.daterangepicker .calendar-table td.available { - width: 36px !important; - height: 36px !important; -} - -.daterangepicker td.active, -.daterangepicker td.active:hover, -.daterangepicker td.in-range.active:not(.off) { - background-color: #42a5f5; - border-color: transparent; - color: #fff; - border-radius: 100%; -} - -.daterangepicker td.start-date.end-date { - border-radius: 100%; -} - -.daterangepicker td.in-range, -.daterangepicker td.available.in-range:hover:not(.active) { - background-color: #e3f2fd; -} - -.daterangepicker td.available:hover { - position: relative; - background-color: white; -} - -.daterangepicker td.available:hover:after { - content: " "; - background: transparent; - width: 100%; - position: absolute; - height: 100%; - left: 0px; - top: 0px; - border-radius: 100%; - border: 2px solid #42a5f5; -} - -/** Calendar Container **/ -.daterangepicker .drp-calendar { - max-width: unset; -} - -.daterangepicker .drp-calendar.left, -.daterangepicker .drp-calendar.right { - padding: 20px; -} - -/** Action Buttons **/ -.daterangepicker .calendar-table .prev { - left: -18px; - right: unset; -} - -/** Month and Year Selection **/ -.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field { - width: 100% !important; - background: white; - border-radius: 0px; - border-top: none; - border-left: none; - border-right: none; - margin-bottom: 0px; - padding-left: 12px !important; - font-size: 1em; -} - -.date-range-picker .select2-results__option { - padding-top: 8px; - padding-bottom: 8px; - min-height: 20px; -} - -.date-range-picker .select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { - max-height: 240px !important; -} - -.date-range-picker .select2-container { - z-index: 10000; -} - -.daterangepicker .select2-container--default .select2-selection--single { - border-bottom: none; -} - -.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered { - line-height: 46px; - padding-left: 0; - font-size: 14px; -} - -.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after { - content: ""; - position: absolute; - right: 8px; - bottom: 23px; - width: 0; - height: 0; - border-style: solid; - border-width: 0 0 8px 8px; - border-color: transparent transparent #9c9c9c !important; -} - -/** Calendar Footer **/ -.daterangepicker .drp-buttons .btn { - padding-left: 12px; - padding-right: 12px; - line-height: 20px; -} - -.daterangepicker .drp-selected { - float: left; - padding: 12px; - font-size: 1em; -} - -button.cancelBtn { - background: none; - color: #42a5f5; - box-shadow: none; - border: 1px solid; -} - -button.cancelBtn:hover { - color: #ffffff; - border: none; -} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table th,.daterangepicker .calendar-table td{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:14px}.daterangepicker .calendar-table th.prev{position:absolute;top:14px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.in-range,.daterangepicker td.available.in-range:hover:not(.active){background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:white}.daterangepicker td.available:hover:after{content:" ";background:transparent;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:white;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown--above,.date-range-picker .select2-container--open .select2-dropdown--below{margin-top:-44px}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:none;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}@media screen and (max-width:600px){.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0px!important;left:0px!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 10%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.date-range-picker .select2-container--open .select2-dropdown--above,.date-range-picker .select2-container--open .select2-dropdown--below{margin-top:-60px}} \ No newline at end of file From 369b73eee3fa55486ebab35b60fa61961f63acb1 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 3 Dec 2018 20:59:58 +0800 Subject: [PATCH 061/247] DateRange - Fixed JSOverlay update for LocaleString --- .../design/incubator/client/daterange/js/LocaleString.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java index 3084fae0e..122355870 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java @@ -9,9 +9,7 @@ public class LocaleString { @JsConstructor - public LocaleString(String value) { - this.value = value; - } + public LocaleString(String value) {} @JsProperty public String value; From 1a6d00bc2984992414e8a9b557771178dd4d709e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 10 Dec 2018 18:22:11 +0800 Subject: [PATCH 062/247] Initial Event handling on DateRange Picker --- .utility/deploy.sh | 2 +- .../design/addins/client/moment/Moment.java | 19 ++++++ .../moment/resources/MomentClientBundle.java | 19 ++++++ .../resources/MomentClientDebugBundle.java | 19 ++++++ .../daterange/DateRangeClientBundle.java | 19 ++++++ .../daterange/DateRangeClientDebugBundle.java | 19 ++++++ .../client/daterange/DateRangePicker.java | 40 ++++++++--- .../client/daterange/events/ApplyEvent.java | 4 +- .../client/daterange/events/CancelEvent.java | 4 +- .../daterange/events/CloseCalendarEvent.java | 4 +- .../daterange/events/DateRangeEvents.java | 19 ++++++ .../events/HasDateRangeHandlers.java | 19 ++++++ .../client/daterange/events/NextEvent.java | 67 +++++++++++++++++++ .../daterange/events/OpenCalendarEvent.java | 4 +- .../daterange/events/PreviousEvent.java | 67 +++++++++++++++++++ .../daterange/events/SelectionEvent.java | 67 +++++++++++++++++++ .../client/daterange/js/DateRangeLocale.java | 19 ++++++ .../client/daterange/js/DateRangeOptions.java | 19 ++++++ .../daterange/js/DropdownAlignment.java | 19 ++++++ .../client/daterange/js/DropdownPosition.java | 19 ++++++ .../daterange/js/HasDateRangeOptions.java | 19 ++++++ .../client/daterange/js/JsDateRange.java | 19 ++++++ .../client/daterange/js/LocaleString.java | 19 ++++++ .../client/daterange/js/RangeOption.java | 19 ++++++ .../incubator/client/daterange/js/Today.java | 19 ++++++ 25 files changed, 544 insertions(+), 19 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/events/SelectionEvent.java diff --git a/.utility/deploy.sh b/.utility/deploy.sh index 31d4a12b0..134c6eeed 100644 --- a/.utility/deploy.sh +++ b/.utility/deploy.sh @@ -2,5 +2,5 @@ set -ev if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.2" ]; then echo "ossrh\${env.OSSRH_USER}\${env.OSSRH_PASS}" > ~/settings.xml - mvn deploy --settings ~/settings.xml + mvn deploy -DskipTests --settings ~/settings.xml fi \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/moment/Moment.java b/src/main/java/gwt/material/design/addins/client/moment/Moment.java index d9d84b623..3902da932 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/Moment.java +++ b/src/main/java/gwt/material/design/addins/client/moment/Moment.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.moment; import jsinterop.annotations.JsMethod; diff --git a/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java index 728e30255..852f4b6f3 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientBundle.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.moment.resources; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java index 0a3bc8960..c3805ee13 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java +++ b/src/main/java/gwt/material/design/addins/client/moment/resources/MomentClientDebugBundle.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.moment.resources; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java index 67955be16..d7633ee0a 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java index 97709c8ca..40e7806cd 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 872830841..c5d39e1b1 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange; import com.google.gwt.dom.client.Document; @@ -23,6 +42,7 @@ import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.daterange.events.*; +import gwt.material.design.incubator.client.daterange.events.SelectionEvent; import gwt.material.design.incubator.client.daterange.js.*; import gwt.material.design.jquery.client.api.Functions; @@ -82,56 +102,56 @@ protected void load() { }); getInputElement().on(DateRangeEvents.UPDATE_CALENDAR, (e, picker) -> { - // OpenEvent.fire(this, picker); + OpenEvent.fire(this, picker); toggleTypeAssist(); return true; }); getInputElement().on(DateRangeEvents.NEXT, (e, picker) -> { - // OpenEvent.fire(this, picker); + OpenEvent.fire(this, picker); toggleTypeAssist(); return true; }); getInputElement().on(DateRangeEvents.PREV, (e, picker) -> { - // OpenEvent.fire(this, picker); + PreviousEvent.fire(this, picker); toggleTypeAssist(); return true; }); getInputElement().on(DateRangeEvents.SELECT, (e, picker) -> { - // OpenEvent.fire(this, picker); + SelectionEvent.fire(this, picker); toggleTypeAssist(); return true; }); getInputElement().on(DateRangeEvents.OPEN, (e, picker) -> { - // OpenEvent.fire(this, picker); + OpenEvent.fire(this, picker); return true; }); getInputElement().on(DateRangeEvents.CLOSE, (e, picker) -> { - // CloseEvent.fire(this, picker); + CloseEvent.fire(this, picker); return true; }); getInputElement().on(DateRangeEvents.CLOSE_CALENDAR, (e, picker) -> { - // CloseCalendarEvent.fire(this, picker); + CloseCalendarEvent.fire(this, picker); return true; }); getInputElement().on(DateRangeEvents.OPEN_CALENDAR, (e, picker) -> { - // OpenCalendarEvent.fire(this, picker); + OpenCalendarEvent.fire(this, picker); return true; }); getInputElement().on(DateRangeEvents.APPLY, (e, picker) -> { - // ApplyEvent.fire(this, picker); + ApplyEvent.fire(this, picker); return true; }); getInputElement().on(DateRangeEvents.CANCEL, (e, picker) -> { - // CancelEvent.fire(this, picker); + CancelEvent.fire(this, picker); return true; }); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java index 786b2e9ba..aea39fca9 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/ApplyEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java index 6fad72ff7..1bff5360d 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/CancelEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java index fe12703ad..9bbd3062c 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/CloseCalendarEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java index 648c521be..d83db4594 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.events; public interface DateRangeEvents { diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java index 9c3f446e4..ed70189fd 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.events; import com.google.gwt.event.logical.shared.HasCloseHandlers; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java new file mode 100644 index 000000000..5a28af3a5 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java @@ -0,0 +1,67 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; + +/** + * Triggered when the Next button is pressed to proceed to the next calendar + * + * @author kevzlou7979 + */ +public class NextEvent extends GwtEvent { + + public interface NextEventHandler extends EventHandler { + void onNextEvent(NextEvent event); + } + + public static final Type TYPE = new Type<>(); + + private JsDateRange dateRange; + + public NextEvent(JsDateRange dateRange) { + this.dateRange = dateRange; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new NextEvent(dateRange)); + } + + public JsDateRange getDateRange() { + return dateRange; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(NextEvent.NextEventHandler handler) { + handler.onNextEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java index 9f2c1484d..13579d1d1 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/OpenCalendarEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java new file mode 100644 index 000000000..914d5aa50 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java @@ -0,0 +1,67 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; + +/** + * Triggered when the Previous button is pressed to proceed to the previous calendar + * + * @author kevzlou7979 + */ +public class PreviousEvent extends GwtEvent { + + public interface PreviousEventHandler extends EventHandler { + void onPreviousEvent(PreviousEvent event); + } + + public static final Type TYPE = new Type<>(); + + private JsDateRange dateRange; + + public PreviousEvent(JsDateRange dateRange) { + this.dateRange = dateRange; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new PreviousEvent(dateRange)); + } + + public JsDateRange getDateRange() { + return dateRange; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(PreviousEvent.PreviousEventHandler handler) { + handler.onPreviousEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/SelectionEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/SelectionEvent.java new file mode 100644 index 000000000..033dca76c --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/SelectionEvent.java @@ -0,0 +1,67 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2016 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.daterange.js.JsDateRange; + +/** + * Triggered when the Selection button is pressed to proceed to the next calendar + * + * @author kevzlou7979 + */ +public class SelectionEvent extends GwtEvent { + + public interface SelectionEventHandler extends EventHandler { + void onSelectionEvent(SelectionEvent event); + } + + public static final Type TYPE = new Type<>(); + + private JsDateRange dateRange; + + public SelectionEvent(JsDateRange dateRange) { + this.dateRange = dateRange; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, JsDateRange dateRange) { + source.fireEvent(new SelectionEvent(dateRange)); + } + + public JsDateRange getDateRange() { + return dateRange; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SelectionEvent.SelectionEventHandler handler) { + handler.onSelectionEvent(this); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java index 9a79b83a5..bf755c39e 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java index 6ecf1ce35..c6139d035 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import gwt.material.design.addins.client.moment.Moment; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java index bf41153ce..229ce4572 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownAlignment.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import gwt.material.design.client.base.helper.EnumHelper; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java index 97025c6ed..9a1ba7de5 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import gwt.material.design.client.base.helper.EnumHelper; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index 24b9bb5a9..661c518e8 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import gwt.material.design.addins.client.moment.Moment; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java index 200f87f39..afc934833 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import com.google.gwt.dom.client.Element; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java index 122355870..1eda104f0 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/LocaleString.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import jsinterop.annotations.JsConstructor; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java index 29de81765..79082a392 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import gwt.material.design.addins.client.moment.Moment; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java index ba5ab81e2..2c7fe5de1 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/Today.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; import jsinterop.annotations.JsPackage; From 9f32ab65116ded1b549a727ed3346d21772fc873 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 11 Dec 2018 12:26:41 +0800 Subject: [PATCH 063/247] Supported Moment Js --- .../design/addins/client/moment/Moment.java | 892 +++++++++++++++++- .../client/moment/option/CalendarFormat.java | 27 + .../client/moment/option/CreationData.java | 24 + .../addins/client/moment/option/Duration.java | 156 +++ .../client/daterange/DateRangePicker.java | 21 +- .../events/HasDateRangeHandlers.java | 7 +- ...{NextEvent.java => NextCalendarEvent.java} | 20 +- ...sEvent.java => PreviousCalendarEvent.java} | 20 +- .../client/daterange/js/DateRangeOptions.java | 8 +- .../daterange/js/HasDateRangeOptions.java | 2 +- 10 files changed, 1140 insertions(+), 37 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java create mode 100644 src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java create mode 100644 src/main/java/gwt/material/design/addins/client/moment/option/Duration.java rename src/main/java/gwt/material/design/incubator/client/daterange/events/{NextEvent.java => NextCalendarEvent.java} (68%) rename src/main/java/gwt/material/design/incubator/client/daterange/events/{PreviousEvent.java => PreviousCalendarEvent.java} (66%) diff --git a/src/main/java/gwt/material/design/addins/client/moment/Moment.java b/src/main/java/gwt/material/design/addins/client/moment/Moment.java index 3902da932..7dd894793 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/Moment.java +++ b/src/main/java/gwt/material/design/addins/client/moment/Moment.java @@ -7,9 +7,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. @@ -19,22 +19,900 @@ */ package gwt.material.design.addins.client.moment; -import jsinterop.annotations.JsMethod; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsType; +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.core.client.JsDate; +import gwt.material.design.addins.client.moment.option.CalendarFormat; +import gwt.material.design.addins.client.moment.option.CreationData; +import gwt.material.design.addins.client.moment.option.Duration; +import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.*; @JsType(isNative = true, namespace = JsPackage.GLOBAL) public class Moment { - @JsMethod(namespace = JsPackage.GLOBAL) + @JsOverlay + public static JavaScriptObject ISO_8601; + + @JsOverlay + public static JavaScriptObject RFC_2822; + + @JsProperty + public Functions.Func1 parseTwoDigitYear; + + // Parse : Now + + @JsMethod public static native Moment moment(); @JsMethod - public native Moment subtract(int number, String duration); + public static native Moment moment(String[] arr); + + // Parse : String + + @JsMethod + public static native Moment moment(String value); + + // Parse : String + Format + + @JsMethod + public static native Moment moment(String date, String format); + + @JsMethod + public static native Moment moment(String date, String format, String locale); + + @JsMethod + public static native Moment moment(String date, String format, Boolean strict); + + @JsMethod + public static native Moment moment(String date, String format, String locale, Boolean strict); + + // Parse : String + Formats + + @JsMethod + public static native Moment moment(String date, String[] format); + + @JsMethod + public static native Moment moment(String date, String[] format, String locale); + + @JsMethod + public static native Moment moment(String date, String[] format, Boolean strict); + + @JsMethod + public static native Moment moment(String date, String[] format, String locale, Boolean strict); + + @JsMethod + public static native Moment moment(String s, JavaScriptObject special_format); + + // Parse : Special Formats + + @JsMethod + public static native Moment moment(JavaScriptObject object); + + // Parse : Unix Timestamp (milliseconds) + + @JsMethod + public static native Moment moment(double milliseconds); + + // Parse : Unix Timestamp (seconds) + + @JsMethod + public static native Moment unix(double seconds); + + // Parse : Date + + @JsMethod + public static native Moment moment(JsDate date); + + // Parse : Arrays + @JsMethod + public static native Moment moment(int[] arr); + + // Parse : Moment Clone + @JsMethod + public static native Moment moment(Moment clone); + + // Parse : UTC + @JsMethod + public native Moment utc(); + + @JsMethod + public native Moment utc(int param); + + @JsMethod + public native Moment utc(int[] arr); + + @JsMethod + public native Moment utc(String param); + + @JsMethod + public native Moment utc(String date, String format); + + @JsMethod + public native Moment utc(String date, String[] format); + + @JsMethod + public native Moment utc(String date, String format, String locale); + + @JsMethod + public native Moment utc(String date, String format, boolean strict); + + @JsMethod + public native Moment utc(String date, String format, String locale, Boolean strict); + + @JsMethod + public native Moment utc(Moment clone); + + @JsMethod + public native Moment utc(JsDate date); + + // Parse : Zone + @JsMethod + public native Moment parseZone(); + + @JsMethod + public native Moment parseZone(String param); + + @JsMethod + public native Moment parseZone(String date, String format); + + @JsMethod + public native Moment parseZone(String date, String[] format); + + @JsMethod + public native Moment parseZone(String date, String format, boolean strict); + + @JsMethod + public native Moment parseZone(String date, String format, String locale, Boolean strict); + + // Parse : Validation + + @JsMethod + public native boolean isValid(); + + @JsMethod + public native int invalidAt(); + + // Parse : Creation Data + + @JsMethod + public native CreationData creationData(); + + // Parse : Defaults + + @JsMethod + public static native Moment moment(int val, String unit); + + @JsMethod + public static native Moment moment(Duration duration); + + // Get + Set : Milliseconds + + @JsMethod + public native Moment millisecond(int val); + + @JsMethod + public native int millisecond(); + + @JsMethod + public native Moment milliseconds(int val); + + @JsMethod + public native int milliseconds(); + + // Get + Set : Seconds + + @JsMethod + public native Moment second(int val); + + @JsMethod + public native int second(); + + @JsMethod + public native Moment seconds(int val); + + @JsMethod + public native int seconds(); + + // Get + Set : Minute + + @JsMethod + public native Moment minute(int val); + + @JsMethod + public native int minute(); // Number + + @JsMethod + public native Moment minutes(int val); + + @JsMethod + public native int minutes(); // Number + + // Get + Set : Hour + + @JsMethod + public native Moment hour(int val); + + @JsMethod + public native int hour(); // Number + + @JsMethod + public native Moment hours(int val); + + @JsMethod + public native int hours(); // Number + + // Get + Set : Date of Month + + @JsMethod + public native Moment date(int val); + + @JsMethod + public native int date(); // Number + + @JsMethod + public native Moment dates(int val); + + @JsMethod + public native int dates(); // Number + + // Get + Set : Day of Week + + @JsMethod + public native Moment day(Object val); + + @JsMethod + public native int day(); // Number + + @JsMethod + public native Moment days(Object val); + + @JsMethod + public native int days(); // Number + + // Get + Set : Day of Week (Locale Aware) + + @JsMethod + public native Moment weekday(int val); + + @JsMethod + public native int weekday(); // Number + + // Get + Set : ISO Day of Week + @JsMethod + public native Moment isoWeekday(int val); + + @JsMethod + public native int isoWeekday(); + + // Get + Set : Day of Year + + @JsMethod + public native Moment dayOfYear(int val); + + @JsMethod + public native int dayOfYear(); // Number + + // Get + Set : Week of Year + + @JsMethod + public native Moment week(int val); + + @JsMethod + public native int week(); // Number + + @JsMethod + public native Moment weeks(int val); + + @JsMethod + public native int weeks(); // Number + + // Get + Set : Week of Year (ISO) + + @JsMethod + public native Moment isoWeek(int val); + + @JsMethod + public native int isoWeek(); // Number + + @JsMethod + public native Moment isoWeeks(int val); + + @JsMethod + public native int isoWeeks(); // Number + + // Get + Set : Month + + @JsMethod + public native Moment month(Object val); + + @JsMethod + public native int month(); // Number + + @JsMethod + public native Moment months(Object val); + + @JsMethod + public native int months(); // Number + + // Get + Set : Quarter + + @JsMethod + public native int quarter(); // Number + + @JsMethod + public native Moment quarter(int val); + + @JsMethod + public native int quarters(); // Number + + @JsMethod + public native Moment quarters(int val); + + // Get + Set : Year + + @JsMethod + public native Moment year(int val); + + @JsMethod + public native int year(); // Number + + @JsMethod + public native Moment years(int val); + + @JsMethod + public native int years(); // Number + + // Get + Set : Week Year + + @JsMethod + public native Moment weekYear(int val); + + @JsMethod + public native int weekYear(); // Number + + // Get + Set : Week Year (ISO) + + @JsMethod + public native Moment isoWeekYear(int val); + + @JsMethod + public native int isoWeekYear(); // Number + + // Get + Set : Weeks in Year + + @JsMethod + public native Moment weeksInYear(); + + // Get + Set : Weeks in Year ISO + + @JsMethod + public native Moment isoWeeksInYear(); + + // Get + Set : Get + + @JsMethod + public native Moment get(String duration); + + // Get + Set : Set + + @JsMethod + public native Moment set(String duration, int value); + + // Get + Set : Max / Min + + @JsMethod + public static native int max(Moment[] moments); + + @JsMethod + public static native int min(Moment[] moments); + + // Manipulate : Add + + @JsMethod + public native Moment add(int value, String duration); + + @JsMethod + public native Moment add(Duration duration); + + @JsMethod + public native Moment add(Object param); + + // Manipulate : Subtract + + @JsMethod + public native Moment subtract(int value, String duration); + + @JsMethod + public native Moment subtract(Duration duration); + + @JsMethod + public native Moment subtract(Object param); + + // Manipulate : Start of Time @JsMethod public native Moment startOf(String duration); + // Manipulate : End of Time + @JsMethod public native Moment endOf(String duration); + + // Manipulate : Locale + + @JsMethod + public native Moment local(); + + + // Manipulate : UTC Offset + + @JsMethod + public native Moment utcOffset(); + + @JsMethod + public native Moment utcOffset(int value, boolean strict); + + @JsMethod + public native Moment utcOffset(String value, boolean strict); + + // Manipulate : TimeZone Offset + + @JsMethod + public native Moment zone(); + + @JsMethod + public native Moment zone(int val); + + @JsMethod + public native Moment zone(String val); + + // Display : Format + + @JsMethod + public native String format(); + + @JsMethod + public native String format(String param); + + // Display : Time From now + + @JsMethod + public native String fromNow(); + + @JsMethod + public native String fromNow(Boolean param); + + // Display : Time From X + + @JsMethod + public native String from(Moment moment); + + @JsMethod + public native String from(Moment moment, boolean noSuffix); + + @JsMethod + public native String from(String value); + + @JsMethod + public native String from(String value, boolean noSuffix); + + @JsMethod + public native String from(int value); + + @JsMethod + public native String from(int value, boolean noSuffix); + + @JsMethod + public native String from(JsDate value); + + @JsMethod + public native String from(JsDate value, boolean noSuffix); + + @JsMethod + public native String from(int[] values); + + @JsMethod + public native String from(int[] values, boolean noSuffix); + + // Display : Time To Now + + @JsMethod + public native String toNow(); + + @JsMethod + public native String toNow(boolean param); + + // Display : Time To X + + @JsMethod + public native String to(Moment moment); + + @JsMethod + public native String to(Moment moment, boolean noSuffix); + + @JsMethod + public native String to(String value); + + @JsMethod + public native String to(String value, boolean noSuffix); + + @JsMethod + public native String to(int value); + + @JsMethod + public native String to(int value, boolean noSuffix); + + @JsMethod + public native String to(JsDate value); + + @JsMethod + public native String to(JsDate value, boolean noSuffix); + + @JsMethod + public native String to(int[] values); + + @JsMethod + public native String to(int[] values, boolean noSuffix); + + // Display : Calendar Time + + @JsMethod + public native String calendar(); + + @JsMethod + public native String calendar(Moment referenceTime); + + @JsMethod + public native String calendar(Moment referenceTime, CalendarFormat formats); + + // Display : Difference + + @JsMethod + public native double diff(Moment moment); + + @JsMethod + public native double diff(Moment moment, String s); + + @JsMethod + public native double diff(Moment moment, String s, boolean noSuffix); + + @JsMethod + public native double diff(String value); + + @JsMethod + public native double diff(String value, String s); + + @JsMethod + public native double diff(String value, boolean noSuffix); + + @JsMethod + public native double diff(int value); + + @JsMethod + public native double diff(int value, String s); + + @JsMethod + public native double diff(int value, boolean noSuffix); + + @JsMethod + public native double diff(JsDate value); + + @JsMethod + public native double diff(JsDate value, String s); + + @JsMethod + public native double diff(JsDate value, String s, boolean noSuffix); + + @JsMethod + public native double diff(int[] values); + + @JsMethod + public native double diff(int[] values, String s); + + @JsMethod + public native double diff(int[] values, String s, boolean noSuffix); + + // Display : Unix Timestamp (milliseconds) + + @JsMethod + public native double valueOf(); + + // Display : Unix Timestamp (seconds) + @JsMethod + public native double unix(); + + // Display : Days in Month + + @JsMethod + public native int daysInMonth(); + + // Display : As Javascript Date + + @JsMethod + public native JsDate toDate(); + + // Display : As Array + + @JsMethod + public native int[] toArray(); + + // Display : As Json + + @JsMethod + public native String toJSON(); + + // Display : As ISO 8601 String + + @JsMethod + public native String toISOString(); + + @JsMethod + public native String toISOString(boolean keepOffset); // from 2.20.0 + + // Display : As Object + + @JsMethod + public native JavaScriptObject toObject(); + + + // Display : Inspect + @JsMethod + public native Moment inspect(); + + // Query : Is Before + + @JsMethod + public native boolean isBefore(Moment moment); + + @JsMethod + public native boolean isBefore(Moment moment, String s); + + @JsMethod + public native boolean isBefore(String value); + + @JsMethod + public native boolean isBefore(String value, String s); + + @JsMethod + public native boolean isBefore(double value); + + @JsMethod + public native boolean isBefore(double value, String s); + + @JsMethod + public native boolean isBefore(JsDate date); + + @JsMethod + public native boolean isBefore(JsDate date, String s); + + @JsMethod + public native boolean isBefore(int[] values); + + @JsMethod + public native boolean isBefore(int[] values, String s); + + // Query : Is Same + + @JsMethod + public native boolean isSame(Moment moment); + + @JsMethod + public native boolean isSame(Moment moment, String s); + + @JsMethod + public native boolean isSame(String value); + + @JsMethod + public native boolean isSame(String value, String s); + + @JsMethod + public native boolean isSame(double value); + + @JsMethod + public native boolean isSame(double value, String s); + + @JsMethod + public native boolean isSame(JsDate date); + + @JsMethod + public native boolean isSame(JsDate date, String s); + + @JsMethod + public native boolean isSame(int[] values); + + @JsMethod + public native boolean isSame(int[] values, String s); + + // Query : Is After + + @JsMethod + public native boolean isAfter(Moment moment); + + @JsMethod + public native boolean isAfter(Moment moment, String s); + + @JsMethod + public native boolean isAfter(String value); + + @JsMethod + public native boolean isAfter(String value, String s); + + @JsMethod + public native boolean isAfter(double value); + + @JsMethod + public native boolean isAfter(double value, String s); + + @JsMethod + public native boolean isAfter(JsDate date); + + @JsMethod + public native boolean isAfter(JsDate date, String s); + + @JsMethod + public native boolean isAfter(int[] values); + + @JsMethod + public native boolean isAfter(int[] values, String s); + + // Query : Is Same or Before + + @JsMethod + public native boolean isSameOrBefore(Moment moment); + + @JsMethod + public native boolean isSameOrBefore(Moment moment, String s); + + @JsMethod + public native boolean isSameOrBefore(String value); + + @JsMethod + public native boolean isSameOrBefore(String value, String s); + + @JsMethod + public native boolean isSameOrBefore(double value); + + @JsMethod + public native boolean isSameOrBefore(double value, String s); + + @JsMethod + public native boolean isSameOrBefore(JsDate date); + + @JsMethod + public native boolean isSameOrBefore(JsDate date, String s); + + @JsMethod + public native boolean isSameOrBefore(int[] values); + + @JsMethod + public native boolean isSameOrBefore(int[] values, String s); + + // Query : Is Same or After + + @JsMethod + public native boolean isSameOrAfter(Moment moment); + + @JsMethod + public native boolean isSameOrAfter(Moment moment, String s); + + @JsMethod + public native boolean isSameOrAfter(String value); + + @JsMethod + public native boolean isSameOrAfter(String value, String s); + + @JsMethod + public native boolean isSameOrAfter(double value); + + @JsMethod + public native boolean isSameOrAfter(double value, String s); + + @JsMethod + public native boolean isSameOrAfter(JsDate date); + + @JsMethod + public native boolean isSameOrAfter(JsDate date, String s); + + @JsMethod + public native boolean isSameOrAfter(int[] values); + + @JsMethod + public native boolean isSameOrAfter(int[] values, String s); + + // Query : Is Between + + @JsMethod + public native boolean isBetween(Moment moment, Moment moment2); + + @JsMethod + public native boolean isBetween(Moment moment, Moment moment2, String s); + + @JsMethod + public native boolean isBetween(String value, String value2); + + @JsMethod + public native boolean isBetween(String value, String value2, String s); + + @JsMethod + public native boolean isBetween(double value, double value2); + + @JsMethod + public native boolean isBetween(double value, double value2, String s); + + @JsMethod + public native boolean isBetween(JsDate date1, JsDate date2); + + @JsMethod + public native boolean isBetween(JsDate date1, JsDate date2, String s); + + @JsMethod + public native boolean isBetween(int[] values, int[] values2); + + @JsMethod + public native boolean isBetween(int[] values, int[] values2, String s); + + // Query : Is Daylight Saving Time + + @JsMethod + public native boolean isDST(); + + // Query : Is Leap Year + + @JsMethod + public native boolean isLeapYear(); + + // Is a Moment + + @JsMethod + public native boolean isMoment(Object obj); + + // I18n + + @JsMethod + public native Moment locale(String param); + + @JsMethod + public native Moment locale(boolean reset); + + @JsMethod + public native Moment locale(String[] param); + + @JsMethod + public native Moment locale(String param, Object param2); + + // I18n : list + + @JsMethod + public native String[] monthsShort(); + + @JsMethod + public native String[] weekdays(); + + @JsMethod + public native String[] weekdaysShort(); + + @JsMethod + public native String[] weekdaysMin(); + + // Duration + + @JsMethod + public native Duration duration(Number value, String timeunit); + + @JsMethod + public native Duration duration(Number value); + + @JsMethod + public native Duration duration(Object value); + + @JsMethod + public native Duration duration(String value); + + // Utilities + + @JsMethod + public native static Moment normalizeUnits(String unit); + + @JsMethod + public native static Moment invalid(Object object); } diff --git a/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java b/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java new file mode 100644 index 000000000..448115e47 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java @@ -0,0 +1,27 @@ +package gwt.material.design.addins.client.moment.option; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class CalendarFormat { + + @JsProperty + public String sameDay; + + @JsProperty + public String nextDay; + + @JsProperty + public String nextWeek; + + @JsProperty + public String lastDay; + + @JsProperty + public String lastWeek; + + @JsProperty + public String sameElse; +} diff --git a/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java b/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java new file mode 100644 index 000000000..19325abc9 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java @@ -0,0 +1,24 @@ +package gwt.material.design.addins.client.moment.option; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class CreationData { + + @JsProperty + public String input; + + @JsProperty + public String format; + + @JsProperty + public Object locale; + + @JsProperty + public boolean isUTC; + + @JsProperty + public boolean strict; +} diff --git a/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java b/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java new file mode 100644 index 000000000..5c8bb4594 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java @@ -0,0 +1,156 @@ +package gwt.material.design.addins.client.moment.option; + +import com.google.gwt.core.client.JavaScriptObject; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class Duration { + + @JsProperty + public int hour; + + @JsProperty + public int minute; + + @JsProperty + public int seconds; + + @JsProperty + public int milliseconds; + + // Clone + + @JsMethod + public native Duration clone(); + + // Humanize + + @JsMethod + public native String humanize(); + + @JsMethod + public native String humanize(boolean suffix); + + // Milliseconds + + @JsMethod + public native int milliseconds(); + + @JsMethod + public native int asMilliseconds(); + + // Seconds + + @JsMethod + public native int seconds(); + + @JsMethod + public native int asSeconds(); + + // Minutes + + @JsMethod + public native int minutes(); + + @JsMethod + public native int asMinutes(); + + // Hours + + @JsMethod + public native int hours(); + + @JsMethod + public native int asHours(); + + // Days + + @JsMethod + public native int days(); + + @JsMethod + public native int asDays(); + + // Weeks + + @JsMethod + public native int weeks(); + + @JsMethod + public native int asWeeks(); + + // Months + + @JsMethod + public native int months(); + + @JsMethod + public native int asMonths(); + + // Years + + @JsMethod + public native int years(); + + @JsMethod + public native int asYears(); + + // Add Time + + @JsMethod + public native Duration add(int amount, String key); + + @JsMethod + public native Duration add(int amount); + + @JsMethod + public native Duration add(Duration duration); + + @JsMethod + public native Duration add(JavaScriptObject object); + + // Subtract Time + + @JsMethod + public native Duration substract(int amount, String key); + + @JsMethod + public native Duration substract(int amount); + + @JsMethod + public native Duration substract(Duration duration); + + @JsMethod + public native Duration substract(JavaScriptObject object); + + // As Unit of Time + + @JsMethod + public native Duration as(String unit); + + // Get Unit of Time + + @JsMethod + public native Duration get(String unit); + + // As JSON + + @JsMethod + public native String toJSON(); + + // As ISO 8601 String + + @JsMethod + public native String toISOString(); + + // Locale + + @JsMethod + public native Duration locale(); + + @JsMethod + public native Duration locale(String s); +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index c5d39e1b1..e6a7ddb0e 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -114,7 +114,7 @@ protected void load() { }); getInputElement().on(DateRangeEvents.PREV, (e, picker) -> { - PreviousEvent.fire(this, picker); + PreviousCalendarEvent.fire(this, picker); toggleTypeAssist(); return true; }); @@ -198,13 +198,13 @@ public JsDateRange getInputElement() { } @Override - public Moment getStartDate() { + public Date getStartDate() { return options.getStartDate(); } @Override public void setStartDate(Moment startDate) { - options.setStartDate(startDate); + options.setStartDate(new Date()); } @Override @@ -620,11 +620,26 @@ public HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendar return addHandler(handler, OpenCalendarEvent.getType()); } + @Override + public HandlerRegistration addPreviousCalendarHandler(PreviousCalendarEvent.PreviousCalendarEventHandler handler) { + return addHandler(handler, PreviousCalendarEvent.getType()); + } + + @Override + public HandlerRegistration addSelectionHandler(SelectionEvent.SelectionEventHandler handler) { + return addHandler(handler, SelectionEvent.getType()); + } + @Override public HandlerRegistration addCloseCalendarHandler(CloseCalendarEvent.CloseCalendarEventHandler handler) { return addHandler(handler, CloseCalendarEvent.getType()); } + @Override + public HandlerRegistration addNextCalendarHandler(NextCalendarEvent.NextCalendarEventHandler handler) { + return addHandler(handler, NextCalendarEvent.getType()); + } + @Override public HandlerRegistration addApplyHandler(ApplyEvent.ApplyEventHandler handler) { return addHandler(handler, ApplyEvent.getType()); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java index ed70189fd..3e044cf46 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/HasDateRangeHandlers.java @@ -26,8 +26,11 @@ public interface HasDateRangeHandlers extends HasOpenHandlers, HasCloseHandlers { - HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendarEventHandler handler); - HandlerRegistration addCloseCalendarHandler(CloseCalendarEvent.CloseCalendarEventHandler handler); HandlerRegistration addApplyHandler(ApplyEvent.ApplyEventHandler handler); HandlerRegistration addCancelHandler(CancelEvent.CancelEventHandler handler); + HandlerRegistration addCloseCalendarHandler(CloseCalendarEvent.CloseCalendarEventHandler handler); + HandlerRegistration addNextCalendarHandler(NextCalendarEvent.NextCalendarEventHandler handler); + HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendarEventHandler handler); + HandlerRegistration addPreviousCalendarHandler(PreviousCalendarEvent.PreviousCalendarEventHandler handler); + HandlerRegistration addSelectionHandler(SelectionEvent.SelectionEventHandler handler); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/NextCalendarEvent.java similarity index 68% rename from src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java rename to src/main/java/gwt/material/design/incubator/client/daterange/events/NextCalendarEvent.java index 5a28af3a5..40bef5bad 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/NextEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/NextCalendarEvent.java @@ -29,26 +29,26 @@ * * @author kevzlou7979 */ -public class NextEvent extends GwtEvent { +public class NextCalendarEvent extends GwtEvent { - public interface NextEventHandler extends EventHandler { - void onNextEvent(NextEvent event); + public interface NextCalendarEventHandler extends EventHandler { + void onNextCalendarEvent(NextCalendarEvent event); } - public static final Type TYPE = new Type<>(); + public static final Type TYPE = new Type<>(); private JsDateRange dateRange; - public NextEvent(JsDateRange dateRange) { + public NextCalendarEvent(JsDateRange dateRange) { this.dateRange = dateRange; } - public static Type getType() { + public static Type getType() { return TYPE; } public static void fire(HasHandlers source, JsDateRange dateRange) { - source.fireEvent(new NextEvent(dateRange)); + source.fireEvent(new NextCalendarEvent(dateRange)); } public JsDateRange getDateRange() { @@ -56,12 +56,12 @@ public JsDateRange getDateRange() { } @Override - public Type getAssociatedType() { + public Type getAssociatedType() { return TYPE; } @Override - protected void dispatch(NextEvent.NextEventHandler handler) { - handler.onNextEvent(this); + protected void dispatch(NextCalendarEventHandler handler) { + handler.onNextCalendarEvent(this); } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousCalendarEvent.java similarity index 66% rename from src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java rename to src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousCalendarEvent.java index 914d5aa50..0cb1376c3 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/PreviousCalendarEvent.java @@ -29,26 +29,26 @@ * * @author kevzlou7979 */ -public class PreviousEvent extends GwtEvent { +public class PreviousCalendarEvent extends GwtEvent { - public interface PreviousEventHandler extends EventHandler { - void onPreviousEvent(PreviousEvent event); + public interface PreviousCalendarEventHandler extends EventHandler { + void onPreviousCalendarEvent(PreviousCalendarEvent event); } - public static final Type TYPE = new Type<>(); + public static final Type TYPE = new Type<>(); private JsDateRange dateRange; - public PreviousEvent(JsDateRange dateRange) { + public PreviousCalendarEvent(JsDateRange dateRange) { this.dateRange = dateRange; } - public static Type getType() { + public static Type getType() { return TYPE; } public static void fire(HasHandlers source, JsDateRange dateRange) { - source.fireEvent(new PreviousEvent(dateRange)); + source.fireEvent(new PreviousCalendarEvent(dateRange)); } public JsDateRange getDateRange() { @@ -56,12 +56,12 @@ public JsDateRange getDateRange() { } @Override - public Type getAssociatedType() { + public Type getAssociatedType() { return TYPE; } @Override - protected void dispatch(PreviousEvent.PreviousEventHandler handler) { - handler.onPreviousEvent(this); + protected void dispatch(PreviousCalendarEventHandler handler) { + handler.onPreviousCalendarEvent(this); } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java index c6139d035..7cb208968 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java @@ -125,13 +125,13 @@ public class DateRangeOptions { private String parentEl; @JsOverlay - public final Moment getStartDate() { - return startDate; + public final Date getStartDate() { + return new Date(startDate.format().toString()); } @JsOverlay - public final void setStartDate(Moment startDate) { - this.startDate = startDate; + public final void setStartDate(Date startDate) { + this.startDate = null; } @JsOverlay diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index 661c518e8..71b8848f1 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -31,7 +31,7 @@ */ public interface HasDateRangeOptions { - Moment getStartDate(); + Date getStartDate(); /** * The beginning date of the initially selected date range. If you provide a string, it must match the date format From d30f396db9724e8c3bd2440ee4cc65e964c774b4 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 11 Dec 2018 15:24:08 +0800 Subject: [PATCH 064/247] DateRangePicker - Standardization of Events --- .../inputmask/MaterialDateInputMask.java | 5 +- .../inputmask/base/DateInputParser.java | 2 + .../daterange/{js => }/DateRangeOptions.java | 226 ++++-------------- .../client/daterange/DateRangePicker.java | 216 ++++------------- .../client/daterange/js/DateRangeLocale.java | 56 ----- .../client/daterange/js/DropdownPosition.java | 7 +- .../daterange/js/HasDateRangeOptions.java | 79 +----- .../client/daterange/js/JsDateRange.java | 4 +- 8 files changed, 114 insertions(+), 481 deletions(-) rename src/main/java/gwt/material/design/incubator/client/daterange/{js => }/DateRangeOptions.java (56%) diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java index 2372a4d9e..53c7d2084 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java @@ -41,7 +41,10 @@ public Date getValue() { @Override public void setMask(String mask) { - this.format = mask; + this.format = mask + .replace("m", "M") + .replace("Y", "y") + .replace("D", "d"); parseFormatToMask(mask); } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java index 28b7e86a7..b8e13cbce 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java @@ -21,6 +21,7 @@ import com.google.gwt.i18n.client.DateTimeFormat; import gwt.material.design.addins.client.inputmask.MaterialInputMask; +import gwt.material.design.client.ui.MaterialToast; import java.util.Date; @@ -35,6 +36,7 @@ public DateInputParser(T valuebox) { public Date parseDate(String format) { if (isValid(format)) { valuebox.clearStatusText(); + MaterialToast.fireToast(format); return DateTimeFormat.getFormat(format).parse(valuebox.getText()); } return null; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeOptions.java similarity index 56% rename from src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java rename to src/main/java/gwt/material/design/incubator/client/daterange/DateRangeOptions.java index 7cb208968..2e3ab33d4 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeOptions.java @@ -17,9 +17,12 @@ * limitations under the License. * #L% */ -package gwt.material.design.incubator.client.daterange.js; +package gwt.material.design.incubator.client.daterange; +import com.google.gwt.core.client.JsDate; import gwt.material.design.addins.client.moment.Moment; +import gwt.material.design.client.ui.MaterialToast; +import gwt.material.design.incubator.client.daterange.js.DropdownAlignment; import gwt.material.design.jquery.client.api.Functions; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; @@ -28,145 +31,123 @@ import java.util.Date; +import static gwt.material.design.addins.client.moment.Moment.moment; + @JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) public class DateRangeOptions { @JsProperty - private Moment startDate; + protected JsDate startDate; @JsProperty - private Date endDate; + protected JsDate endDate; @JsProperty - private Date minDate; + protected JsDate minDate; @JsProperty - private Date maxDate; + protected JsDate maxDate; @JsProperty - private Object maxSpan; + protected Object maxSpan; @JsProperty - private boolean showDropdowns; + protected boolean showDropdowns; @JsProperty - private int minYear; + protected int minYear; @JsProperty - private int maxYear; + protected int maxYear; @JsProperty - private boolean showWeekNumbers; + protected boolean showWeekNumbers; @JsProperty - private boolean showISOWeekNumbers; + protected boolean showISOWeekNumbers; @JsProperty - private boolean timePicker; + protected boolean timePicker; @JsProperty - private int timePickerIncrement; + protected int timePickerIncrement; @JsProperty - private boolean timePicker24Hour; + protected boolean timePicker24Hour; @JsProperty - private boolean timePickerSeconds; + protected boolean timePickerSeconds; @JsProperty - private Object ranges; + protected Object ranges; @JsProperty - private boolean showCustomRangeLabel; + protected boolean showCustomRangeLabel; @JsProperty - private boolean alwaysShowCalendars; + protected boolean alwaysShowCalendars; /** * @see DropdownAlignment */ @JsProperty - private String opens; + protected String opens; @JsProperty - private String drops; + protected String drops; @JsProperty - private String buttonClasses; + protected String buttonClasses; @JsProperty - private String applyButtonClasses; + protected String applyButtonClasses; @JsProperty - private String cancelButtonClasses; + protected String cancelButtonClasses; @JsProperty - private Object locale; + protected Object locale; @JsProperty - private boolean singleDatePicker; + protected boolean singleDatePicker; @JsProperty - private boolean autoApply; + protected boolean autoApply; @JsProperty - private boolean linkedCalendars; + protected boolean linkedCalendars; @JsProperty - private Functions.FuncRet1 isInvalidDate; + protected Functions.FuncRet1 isInvalidDate; @JsProperty - private Functions.FuncRet1 isCustomDate; + protected Functions.FuncRet1 isCustomDate; @JsProperty - private boolean autoUpdateInput; + protected boolean autoUpdateInput; @JsProperty - private String parentEl; - - @JsOverlay - public final Date getStartDate() { - return new Date(startDate.format().toString()); - } + protected String parentEl; + @JsOverlay public final void setStartDate(Date startDate) { - this.startDate = null; - } - - @JsOverlay - public final Date getEndDate() { - return endDate; + this.startDate = JsDate.create(startDate.getTime()); } @JsOverlay public final void setEndDate(Date endDate) { - this.endDate = endDate; - } - - @JsOverlay - public final Date getMinDate() { - return minDate; + this.endDate = JsDate.create(endDate.getTime()); } @JsOverlay public final void setMinDate(Date minDate) { - this.minDate = minDate; - } - - @JsOverlay - public final Date getMaxDate() { - return maxDate; + this.minDate = JsDate.create(minDate.getTime()); } @JsOverlay public final void setMaxDate(Date maxDate) { - this.maxDate = maxDate; - } - - @JsOverlay - public final Object getMaxSpan() { - return maxSpan; + this.maxDate = JsDate.create(maxDate.getTime()); } @JsOverlay @@ -174,251 +155,126 @@ public final void setMaxSpan(Object maxSpan) { this.maxSpan = maxSpan; } - @JsOverlay - public final boolean isShowDropdowns() { - return showDropdowns; - } - @JsOverlay public final void setShowDropdowns(boolean showDropdowns) { this.showDropdowns = showDropdowns; } - @JsOverlay - public final int getMinYear() { - return minYear; - } - @JsOverlay public final void setMinYear(int minYear) { this.minYear = minYear; } - @JsOverlay - public final int getMaxYear() { - return maxYear; - } - @JsOverlay public final void setMaxYear(int maxYear) { this.maxYear = maxYear; } - @JsOverlay - public final boolean isShowWeekNumbers() { - return showWeekNumbers; - } - @JsOverlay public final void setShowWeekNumbers(boolean showWeekNumbers) { this.showWeekNumbers = showWeekNumbers; } - @JsOverlay - public final boolean isShowISOWeekNumbers() { - return showISOWeekNumbers; - } - @JsOverlay public final void setShowISOWeekNumbers(boolean showISOWeekNumbers) { this.showISOWeekNumbers = showISOWeekNumbers; } - @JsOverlay - public final boolean isTimePicker() { - return timePicker; - } - @JsOverlay public final void setTimePicker(boolean timePicker) { this.timePicker = timePicker; } - @JsOverlay - public final int getTimePickerIncrement() { - return timePickerIncrement; - } - @JsOverlay public final void setTimePickerIncrement(int timePickerIncrement) { this.timePickerIncrement = timePickerIncrement; } - @JsOverlay - public final boolean isTimePicker24Hour() { - return timePicker24Hour; - } - @JsOverlay public final void setTimePicker24Hour(boolean timePicker24Hour) { this.timePicker24Hour = timePicker24Hour; } - @JsOverlay - public final boolean isTimePickerSeconds() { - return timePickerSeconds; - } - @JsOverlay public final void setTimePickerSeconds(boolean timePickerSeconds) { this.timePickerSeconds = timePickerSeconds; } - @JsOverlay - public final Object getRanges() { - return ranges; - } - @JsOverlay public final void setRanges(Object ranges) { this.ranges = ranges; } - @JsOverlay - public final boolean isShowCustomRangeLabel() { - return showCustomRangeLabel; - } - @JsOverlay public final void setShowCustomRangeLabel(boolean showCustomRangeLabel) { this.showCustomRangeLabel = showCustomRangeLabel; } - @JsOverlay - public final boolean isAlwaysShowCalendars() { - return alwaysShowCalendars; - } - @JsOverlay public final void setAlwaysShowCalendars(boolean alwaysShowCalendars) { this.alwaysShowCalendars = alwaysShowCalendars; } - @JsOverlay - public final String getOpens() { - return opens; - } - @JsOverlay public final void setOpens(String opens) { this.opens = opens; } - @JsOverlay - public final String getDrops() { - return drops; - } - @JsOverlay public final void setDrops(String drops) { this.drops = drops; } - @JsOverlay - public final String getButtonClasses() { - return buttonClasses; - } - @JsOverlay public final void setButtonClasses(String buttonClasses) { this.buttonClasses = buttonClasses; } - @JsOverlay - public final String getApplyButtonClasses() { - return applyButtonClasses; - } - @JsOverlay public final void setApplyButtonClasses(String applyButtonClasses) { this.applyButtonClasses = applyButtonClasses; } - @JsOverlay - public final String getCancelButtonClasses() { - return cancelButtonClasses; - } - @JsOverlay public final void setCancelButtonClasses(String cancelButtonClasses) { this.cancelButtonClasses = cancelButtonClasses; } - @JsOverlay - public final Object getLocale() { - return locale; - } - @JsOverlay public final void setLocale(Object locale) { this.locale = locale; } - @JsOverlay - public final boolean isSingleDatePicker() { - return singleDatePicker; - } - @JsOverlay public final void setSingleDatePicker(boolean singleDatePicker) { this.singleDatePicker = singleDatePicker; } - @JsOverlay - public final boolean isAutoApply() { - return autoApply; - } - @JsOverlay public final void setAutoApply(boolean autoApply) { this.autoApply = autoApply; } - @JsOverlay - public final boolean isLinkedCalendars() { - return linkedCalendars; - } - @JsOverlay public final void setLinkedCalendars(boolean linkedCalendars) { this.linkedCalendars = linkedCalendars; } - @JsOverlay - public final Functions.FuncRet1 isInvalidDate() { - return isInvalidDate; - } - @JsOverlay public final void setInvalidDate(Functions.FuncRet1 isInvalidDate) { this.isInvalidDate = isInvalidDate; } - @JsOverlay - public final Functions.FuncRet1 isCustomDate() { - return isCustomDate; - } - @JsOverlay public final void setCustomDate(Functions.FuncRet1 isCustomDate) { this.isCustomDate = isCustomDate; } - @JsOverlay - public final boolean isAutoUpdateInput() { - return autoUpdateInput; - } - @JsOverlay public final void setAutoUpdateInput(boolean autoUpdateInput) { this.autoUpdateInput = autoUpdateInput; } - @JsOverlay - public final String getParentEl() { - return parentEl; - } - @JsOverlay public final void setParentEl(String parentEl) { this.parentEl = parentEl; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index e6a7ddb0e..8cf321f2d 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -28,7 +28,6 @@ import gwt.material.design.addins.client.combobox.MaterialComboBoxDebugClientBundle; import gwt.material.design.addins.client.combobox.js.JsComboBox; import gwt.material.design.addins.client.combobox.js.JsComboBoxOptions; -import gwt.material.design.addins.client.moment.Moment; import gwt.material.design.addins.client.moment.resources.MomentClientBundle; import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; import gwt.material.design.client.MaterialDesignBase; @@ -51,7 +50,7 @@ import static gwt.material.design.incubator.client.daterange.js.JsDateRange.$; -public class DateRangePicker extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, +public class DateRangePicker extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder { static { @@ -79,6 +78,9 @@ public class DateRangePicker extends AbstractValueWidget implements HasDat private DateRangeOptions options = new DateRangeOptions(); private StatusTextMixin statusTextMixin; private ReadOnlyMixin readOnlyMixin; + private Date startDate; + private Date endDate; + private Date[] value; public DateRangePicker() { super(Document.get().createDivElement(), CssName.INPUT_FIELD, DATE_RANGE_STYLENAME); @@ -97,18 +99,17 @@ protected void load() { add(label); add(errorLabel); - getInputElement().daterangepicker(options, (param1, param2, param3) -> { - //TODO Change event + getInputElement().daterangepicker(options, (startDate, endDate) -> { + setValue(new Date[]{new Date(startDate.format()), new Date(endDate.format())}, true); }); getInputElement().on(DateRangeEvents.UPDATE_CALENDAR, (e, picker) -> { - OpenEvent.fire(this, picker); toggleTypeAssist(); return true; }); getInputElement().on(DateRangeEvents.NEXT, (e, picker) -> { - OpenEvent.fire(this, picker); + NextCalendarEvent.fire(this, picker); toggleTypeAssist(); return true; }); @@ -159,7 +160,7 @@ protected void load() { } protected void toggleTypeAssist() { - if (isShowDropdowns()) { + if (options.showDropdowns) { JsComboBox monthSelect = JsComboBox.$(".monthselect"); JsComboBox yearSelect = JsComboBox.$(".yearselect"); JsComboBoxOptions op = JsComboBoxOptions.create(); @@ -198,18 +199,8 @@ public JsDateRange getInputElement() { } @Override - public Date getStartDate() { - return options.getStartDate(); - } - - @Override - public void setStartDate(Moment startDate) { - options.setStartDate(new Date()); - } - - @Override - public Date getEndDate() { - return options.getEndDate(); + public void setStartDate(Date startDate) { + options.setStartDate(startDate); } @Override @@ -217,293 +208,188 @@ public void setEndDate(Date endDate) { options.setEndDate(endDate); } - @Override - public Date getMinDate() { - return options.getMinDate(); - } - @Override public void setMinDate(Date minDate) { options.setMinDate(minDate); } - @Override - public Date getMaxDate() { - return options.getMaxDate(); - } - @Override public void setMaxDate(Date maxDate) { options.setMaxDate(maxDate); } - @Override - public Object getMaxSpan() { - return options.getMaxSpan(); - } - @Override public void setMaxSpan(Object maxSpan) { options.setMaxSpan(maxSpan); } - @Override - public boolean isShowDropdowns() { - return options.isShowDropdowns(); - } - @Override public void setShowDropdowns(boolean showDropdowns) { options.setShowDropdowns(showDropdowns); } - @Override - public int getMinYear() { - return options.getMinYear(); - } - @Override public void setMinYear(int minYear) { options.setMinYear(minYear); } - @Override - public int getMaxYear() { - return options.getMaxYear(); - } - @Override public void setMaxYear(int maxYear) { options.setMaxYear(maxYear); } - @Override - public boolean isShowWeekNumbers() { - return options.isShowWeekNumbers(); - } - @Override public void setShowWeekNumbers(boolean showWeekNumbers) { options.setShowWeekNumbers(showWeekNumbers); } - @Override - public boolean isShowISOWeekNumbers() { - return options.isShowISOWeekNumbers(); - } - @Override public void setShowISOWeekNumbers(boolean showISOWeekNumbers) { options.setShowISOWeekNumbers(showISOWeekNumbers); } - @Override - public boolean isTimePicker() { - return options.isTimePicker(); - } - @Override public void setTimePicker(boolean timePicker) { options.setTimePicker(timePicker); } - @Override - public int getTimePickerIncrement() { - return options.getTimePickerIncrement(); - } - @Override public void setTimePickerIncrement(int timePickerIncrement) { options.setTimePickerIncrement(timePickerIncrement); } - @Override - public boolean isTimePicker24Hour() { - return options.isTimePicker24Hour(); - } - @Override public void setTimePicker24Hour(boolean timePicker24Hour) { options.setTimePicker24Hour(timePicker24Hour); } - @Override - public boolean isTimePickerSeconds() { - return options.isTimePickerSeconds(); - } - @Override public void setTimePickerSeconds(boolean timePickerSeconds) { options.setTimePickerSeconds(timePickerSeconds); } - @Override - public Object getRanges() { - return options.getRanges(); - } - @Override public void setRanges(Object ranges) { options.setRanges(ranges); } - @Override - public boolean isShowCustomRangeLabel() { - return options.isShowCustomRangeLabel(); - } - @Override public void setShowCustomRangeLabel(boolean showCustomRangeLabel) { options.setShowCustomRangeLabel(showCustomRangeLabel); } - @Override - public boolean isAlwaysShowCalendars() { - return options.isAlwaysShowCalendars(); - } - @Override public void setAlwaysShowCalendars(boolean alwaysShowCalendars) { options.setAlwaysShowCalendars(alwaysShowCalendars); } - @Override - public DropdownAlignment getDropdownAlignment() { - return options.getOpens() != null ? DropdownAlignment.fromStyleName(options.getOpens()) : null; - } - @Override public void setDropdownAlignment(DropdownAlignment alignment) { options.setOpens(alignment.getCssName()); } - @Override - public DropdownPosition getDropdownPosition() { - return options.getDrops() != null ? DropdownPosition.fromStyleName(options.getDrops()) : null; - } - @Override public void setDropdownPosition(DropdownPosition dropdownPosition) { options.setDrops(dropdownPosition.getCssName()); } - @Override - public String getButtonClasses() { - return options.getButtonClasses(); - } - @Override public void setButtonClasses(String buttonClasses) { options.setButtonClasses(buttonClasses); } - @Override - public String getApplyButtonClasses() { - return options.getApplyButtonClasses(); - } - @Override public void setApplyButtonClasses(String applyButtonClasses) { options.setApplyButtonClasses(applyButtonClasses); } - @Override - public String getCancelButtonClasses() { - return options.getCancelButtonClasses(); - } - @Override public void setCancelButtonClasses(String cancelButtonClasses) { options.setCancelButtonClasses(cancelButtonClasses); } - @Override - public DateRangeLocale getLocale() { - return options.getLocale() != null ? (DateRangeLocale) options.getLocale() : null; - } - @Override public void setLocale(DateRangeLocale locale) { options.setLocale(locale != null ? locale : false); } - @Override - public boolean isSingleDatePicker() { - return options.isSingleDatePicker(); - } - @Override public void setSingleDatePicker(boolean singleDatePicker) { options.setSingleDatePicker(singleDatePicker); } - @Override - public boolean isAutoApply() { - return options.isAutoApply(); - } - @Override public void setAutoApply(boolean autoApply) { options.setAutoApply(autoApply); } - @Override - public boolean isLinkedCalendars() { - return options.isLinkedCalendars(); - } - @Override public void setLinkedCalendars(boolean linkedCalendars) { options.setLinkedCalendars(linkedCalendars); } - @Override - public Functions.FuncRet1 isInvalidDate() { - return options.isInvalidDate(); - } - @Override public void setInvalidDate(Functions.FuncRet1 invalidDate) { options.setInvalidDate(invalidDate); } - @Override - public Functions.FuncRet1 isCustomDate() { - return options.isCustomDate(); - } - @Override public void setCustomDate(Functions.FuncRet1 customDate) { options.setCustomDate(customDate); } - @Override - public boolean isAutoUpdateInput() { - return options.isAutoUpdateInput(); - } - @Override public void setAutoUpdateInput(boolean autoUpdateInput) { options.setAutoUpdateInput(autoUpdateInput); } @Override - public String getParentEl() { - return options.getParentEl(); + public void setParentEl(String parentEl) { + options.setParentEl(parentEl); } @Override - public void setParentEl(String parentEl) { - options.setParentEl(parentEl); + public void setValue(Date[] value, boolean fireEvents) { + this.value = value; + + if (value.length >= 1) { + this.startDate = value[0]; + + if (value.length >= 2) { + this.endDate = value[1]; + } + } + + super.setValue(value, fireEvents); } @Override - public Date getValue() { - /*Date date = null; - if (getInputElement().val() != null) { - date = (Date) getInputElement().val(); - }*/ - return null; + public Date[] getValue() { + return value; + } + + public TextBox getDateInput() { + return dateInput; + } + + public Label getLabel() { + return label; + } + + public MaterialLabel getErrorLabel() { + return errorLabel; + } + + public DateRangeOptions getOptions() { + return options; + } + + public Date getStartDate() { + return startDate; + } + + public Date getEndDate() { + return endDate; } @Override @@ -661,7 +547,7 @@ public HandlerRegistration addOpenHandler(OpenHandler handler) { } @Override - public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { + public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { return addHandler(handler, ValueChangeEvent.getType()); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java index bf755c39e..7a6aadeb0 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DateRangeLocale.java @@ -69,101 +69,51 @@ public class DateRangeLocale { @JsProperty private String firstDay; - @JsOverlay - public final String getFormat() { - return format; - } - @JsOverlay public final void setFormat(String format) { this.format = format; } - @JsOverlay - public final String getSeparator() { - return separator; - } - @JsOverlay public final void setSeparator(String separator) { this.separator = separator; } - @JsOverlay - public final String getApplyLabel() { - return applyLabel; - } - @JsOverlay public final void setApplyLabel(String applyLabel) { this.applyLabel = applyLabel; } - @JsOverlay - public final String getCancelLabel() { - return cancelLabel; - } - @JsOverlay public final void setCancelLabel(String cancelLabel) { this.cancelLabel = cancelLabel; } - @JsOverlay - public final String getFromLabel() { - return fromLabel; - } - @JsOverlay public final void setFromLabel(String fromLabel) { this.fromLabel = fromLabel; } - @JsOverlay - public final String getToLabel() { - return toLabel; - } - @JsOverlay public final void setToLabel(String toLabel) { this.toLabel = toLabel; } - @JsOverlay - public final String getCustomRangeLabel() { - return customRangeLabel; - } - @JsOverlay public final void setCustomRangeLabel(String customRangeLabel) { this.customRangeLabel = customRangeLabel; } - @JsOverlay - public final String getWeekLabel() { - return weekLabel; - } - @JsOverlay public final void setWeekLabel(String weekLabel) { this.weekLabel = weekLabel; } - @JsOverlay - public final LocaleString[] getDaysOfWeek() { - return daysOfWeek; - } - @JsOverlay public final void setDaysOfWeek(LocaleString[] daysOfWeek) { this.daysOfWeek = daysOfWeek; } - @JsOverlay - public final LocaleString[] getMonthNames() { - return monthNames; - } - @JsOverlay public final void setMonthNames(LocaleString[] monthNames) { if (monthNames.length == 12) { @@ -172,12 +122,6 @@ public final void setMonthNames(LocaleString[] monthNames) { GWT.log("Months must be equal to seven (12) months", new IllegalArgumentException()); } } - - @JsOverlay - public final String getFirstDay() { - return firstDay; - } - @JsOverlay public final void setFirstDay(String firstDay) { this.firstDay = firstDay; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java index 9a1ba7de5..24f966798 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/DropdownPosition.java @@ -29,9 +29,8 @@ */ public enum DropdownPosition implements CssType { - LEFT("left"), - RIGHT("right"), - CENTER("center"); + DOWN("down"), + UP("up"); private final String cssClass; @@ -45,6 +44,6 @@ public String getCssName() { } public static DropdownPosition fromStyleName(final String styleName) { - return EnumHelper.fromStyleName(styleName, DropdownPosition.class, LEFT); + return EnumHelper.fromStyleName(styleName, DropdownPosition.class, DOWN); } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index 71b8848f1..bbb03a0b8 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -7,9 +7,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. @@ -19,7 +19,6 @@ */ package gwt.material.design.incubator.client.daterange.js; -import gwt.material.design.addins.client.moment.Moment; import gwt.material.design.jquery.client.api.Functions; import java.util.Date; @@ -31,116 +30,84 @@ */ public interface HasDateRangeOptions { - Date getStartDate(); - /** * The beginning date of the initially selected date range. If you provide a string, it must match the date format * string set in your locale setting. */ - void setStartDate(Moment startDate); - - Date getEndDate(); + void setStartDate(Date startDate); /** * The end date of the initially selected date range. */ void setEndDate(Date endDate); - Date getMinDate(); - /** * The earliest date a user may select. */ void setMinDate(Date minDate); - Date getMaxDate(); - /** * The latest date a user may select. */ void setMaxDate(Date maxDate); - Object getMaxSpan(); - /** * The maximum span between the selected start and end dates. Check off maxSpan in the configuration generator for * an example of how to use this. You can provide any object the moment library would let you add to a date. */ void setMaxSpan(Object maxSpan); - boolean isShowDropdowns(); - /** * Show year and month select boxes above calendars to jump to a specific month and year. */ void setShowDropdowns(boolean showDropdowns); - int getMinYear(); - /** * The minimum year shown in the dropdowns when showDropdowns is set to true. */ void setMinYear(int minYear); - int getMaxYear(); - /** * The maximum year shown in the dropdowns when showDropdowns is set to true. */ void setMaxYear(int maxYear); - boolean isShowWeekNumbers(); - /** * Show localized week numbers at the start of each week on the calendars. */ void setShowWeekNumbers(boolean showWeekNumbers); - boolean isShowISOWeekNumbers(); - /** * Show ISO week numbers at the start of each week on the calendars. */ void setShowISOWeekNumbers(boolean showISOWeekNumbers); - boolean isTimePicker(); - /** * Adds select boxes to choose times in addition to dates. */ void setTimePicker(boolean timePicker); - int getTimePickerIncrement(); - /** * Increment of the minutes selection list for times (i.e. 30 to allow only selection of times ending in 0 or 30). */ void setTimePickerIncrement(int timePickerIncrement); - boolean isTimePicker24Hour(); - /** * Use 24-hour instead of 12-hour times, removing the AM/PM selection. */ void setTimePicker24Hour(boolean timePicker24Hour); - boolean isTimePickerSeconds(); - /** * Show seconds in the timePicker. */ void setTimePickerSeconds(boolean timePickerSeconds); - Object getRanges(); - /** * Set predefined date ranges the user can select from. Each key is the label for the range, and its value an array * with two dates representing the bounds of the range. Click ranges in the configuration generator for examples. */ void setRanges(Object ranges); - boolean isShowCustomRangeLabel(); - /** * Displays "Custom Range" at the end of the list of predefined ranges, when the ranges option is used. This option * will be highlighted whenever the current date range selection does not match one of the predefined ranges. @@ -148,112 +115,86 @@ public interface HasDateRangeOptions { */ void setShowCustomRangeLabel(boolean showCustomRangeLabel); - boolean isAlwaysShowCalendars(); - /** - * Normally, if you use the ranges option to specify pre-defined date ranges, calendars for choosing a custom date - * range are not shown until the user clicks "Custom Range". When this option is set to true, the calendars for - * choosing a custom date range are always shown instead. + * Normally, if you use the ranges option to specify pre-defined date ranges, calendars for choosing a custom date + * range are not shown until the user clicks "Custom Range". When this option is set to true, the calendars for + * choosing a custom date range are always shown instead. */ void setAlwaysShowCalendars(boolean alwaysShowCalendars); - DropdownAlignment getDropdownAlignment(); - /** * Whether the picker appears aligned to the left, to the right, or centered under the HTML element it's attached to. + * * @see DropdownAlignment */ void setDropdownAlignment(DropdownAlignment alignment); - DropdownPosition getDropdownPosition(); - /** * Whether the picker appears below (default) or above the HTML element it's attached to. + * * @see DropdownPosition */ void setDropdownPosition(DropdownPosition position); - String getButtonClasses(); - /** * CSS class names that will be added to both the apply and cancel buttons. */ void setButtonClasses(String buttonClasses); - String getApplyButtonClasses(); - /** * CSS class names that will be added only to the apply button. */ void setApplyButtonClasses(String applyButtonClasses); - String getCancelButtonClasses(); - /** * CSS class names that will be added only to the cancel button. */ void setCancelButtonClasses(String cancelButtonClasses); - DateRangeLocale getLocale(); - /** * Allows you to provide localized strings for buttons and labels, customize the date format, and change the first * day of week for the calendars. Check off locale in the configuration generator to see how to customize these options. */ void setLocale(DateRangeLocale locale); - boolean isSingleDatePicker(); - /** * Show only a single calendar to choose one date, instead of a range picker with two calendars. * The start and end dates provided to your callback will be the same single date chosen. */ void setSingleDatePicker(boolean singleDatePicker); - boolean isAutoApply(); - /** * Hide the apply and cancel buttons, and automatically apply a new date range as soon as two dates are clicked. */ void setAutoApply(boolean autoApply); - boolean isLinkedCalendars(); - /** * When enabled, the two calendars displayed will always be for two sequential months (i.e. January and February), * and both will be advanced when clicking the left or right arrows above the calendars. When disabled, the two calendars can be individually advanced and display any month/year. */ void setLinkedCalendars(boolean linkedCalendars); - Functions.FuncRet1 isInvalidDate(); - /** * A function that is passed each date in the two calendars before they are displayed, and may return true or false * to indicate whether that date should be available for selection or not. */ void setInvalidDate(Functions.FuncRet1 isInvalidDate); - Functions.FuncRet1 isCustomDate(); - /** * A function that is passed each date in the two calendars before they are displayed, and may return a string or * array of CSS class names to apply to that date's calendar cell. */ void setCustomDate(Functions.FuncRet1 isCustomDate); - boolean isAutoUpdateInput(); - /** * Indicates whether the date range picker should automatically update the value of the element it's * attached to at initialization and when the selected dates change. */ void setAutoUpdateInput(boolean autoUpdateInput); - String getParentEl(); - /** - * jQuery selector of the parent element that the date range picker will be added to, if not provided this will be - * 'body' + * jQuery selector of the parent element that the date range picker will be added to, if not provided this will be + * 'body' */ void setParentEl(String parentEl); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java index afc934833..f2fefc923 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java @@ -20,6 +20,8 @@ package gwt.material.design.incubator.client.daterange.js; import com.google.gwt.dom.client.Element; +import gwt.material.design.addins.client.moment.Moment; +import gwt.material.design.incubator.client.daterange.DateRangeOptions; import gwt.material.design.jquery.client.api.Functions; import gwt.material.design.jquery.client.api.JQueryElement; import jsinterop.annotations.JsMethod; @@ -49,7 +51,7 @@ public class JsDateRange extends DateRangeOptions { public native void daterangepicker(DateRangeOptions options); @JsMethod - public native void daterangepicker(DateRangeOptions options, Functions.Func3 callback); + public native void daterangepicker(DateRangeOptions options, Functions.Func2 callback); @JsMethod public native void daterangepicker(); From 568ae34e130681cb9256d430996c9e7f7b58ea09 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 14 Dec 2018 13:29:46 +0800 Subject: [PATCH 065/247] Style updates + Standardiation on API. --- .../design/addins/client/moment/Moment.java | 32 +- .../client/daterange/DateRangePicker.java | 41 +- .../constants/DateRangeElementSelector.java | 11 + .../daterange/events/DateRangeEvents.java | 1 + .../client/daterange/js/RangeBuilder.java | 4 + .../css/daterangepicker-materialize.css | 77 +- .../css/daterangepicker-materialize.min.css | 2 +- .../daterange/resources/js/daterangepicker.js | 9 +- .../resources/js/daterangepicker.min.js | 1531 +---------------- 9 files changed, 143 insertions(+), 1565 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java diff --git a/src/main/java/gwt/material/design/addins/client/moment/Moment.java b/src/main/java/gwt/material/design/addins/client/moment/Moment.java index 7dd894793..b670c91f2 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/Moment.java +++ b/src/main/java/gwt/material/design/addins/client/moment/Moment.java @@ -41,56 +41,56 @@ public class Moment { // Parse : Now - @JsMethod + @JsMethod(namespace = JsPackage.GLOBAL) public static native Moment moment(); - @JsMethod + @JsMethod(namespace = JsPackage.GLOBAL) public static native Moment moment(String[] arr); // Parse : String - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String value); // Parse : String + Format - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String format); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String format, String locale); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String format, Boolean strict); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String format, String locale, Boolean strict); // Parse : String + Formats - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String[] format); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String[] format, String locale); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String[] format, Boolean strict); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String date, String[] format, String locale, Boolean strict); - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(String s, JavaScriptObject special_format); // Parse : Special Formats - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(JavaScriptObject object); // Parse : Unix Timestamp (milliseconds) - @JsMethod + @JsMethod(namespace = "moment") public static native Moment moment(double milliseconds); // Parse : Unix Timestamp (seconds) @@ -649,7 +649,7 @@ public class Moment { @JsMethod public native String toISOString(boolean keepOffset); // from 2.20.0 - // Display : As Object + // Display : As Object @JsMethod public native JavaScriptObject toObject(); @@ -866,7 +866,7 @@ public class Moment { @JsMethod public native boolean isMoment(Object obj); - // I18n + // I18n @JsMethod public native Moment locale(String param); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 8cf321f2d..6227bb134 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -40,10 +40,13 @@ import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.daterange.constants.DateRangeElementSelector; import gwt.material.design.incubator.client.daterange.events.*; import gwt.material.design.incubator.client.daterange.events.SelectionEvent; import gwt.material.design.incubator.client.daterange.js.*; import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jquery.client.api.JQuery; +import gwt.material.design.jquery.client.api.JQueryElement; import java.util.Date; @@ -156,17 +159,43 @@ protected void load() { return true; }); + getInputElement().on(DateRangeEvents.TIME_CHANGED, (e, picker) -> { + toggleTimePickerTypeAssist(); + return true; + }); + setId(DOM.createUniqueId()); } protected void toggleTypeAssist() { if (options.showDropdowns) { - JsComboBox monthSelect = JsComboBox.$(".monthselect"); - JsComboBox yearSelect = JsComboBox.$(".yearselect"); - JsComboBoxOptions op = JsComboBoxOptions.create(); - op.dropdownParent = JsComboBox.$(getElement()); - monthSelect.select2(op); - yearSelect.select2(op); + toggleMonthYearTypeAssist(); + } + toggleTimePickerTypeAssist(); + } + + protected void toggleMonthYearTypeAssist() { + if (options.showDropdowns) { + toggleTypeAssistSelector(DateRangeElementSelector.MONTH_SELECT, DateRangeElementSelector.YEAR_SELECT); + } + } + + protected void toggleTimePickerTypeAssist() { + if (options.timePicker) { + toggleTypeAssistSelector(DateRangeElementSelector.HOUR_SELECT, DateRangeElementSelector.MINUTE_SELECT, DateRangeElementSelector.AM_PM_SELECT); + if (options.timePickerSeconds) { + toggleTypeAssistSelector(DateRangeElementSelector.SECONDS_SELECT); + } + } + } + + protected void toggleTypeAssistSelector(String... selectors) { + for (String selector : selectors) { + JQueryElement parent = JsComboBox.$(getElement()); + JsComboBox selectElement = JsComboBox.$(selector); + JsComboBoxOptions option = JsComboBoxOptions.create(); + option.dropdownParent = parent; + selectElement.select2(option); } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java b/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java new file mode 100644 index 000000000..f527eee85 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java @@ -0,0 +1,11 @@ +package gwt.material.design.incubator.client.daterange.constants; + +public interface DateRangeElementSelector { + + String MONTH_SELECT = ".monthselect"; + String YEAR_SELECT = ".yearselect"; + String HOUR_SELECT = ".hourselect"; + String MINUTE_SELECT = ".minuteselect"; + String AM_PM_SELECT = ".ampmselect"; + String SECONDS_SELECT = ".secondselect"; +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java index d83db4594..3b20ca202 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/events/DateRangeEvents.java @@ -31,4 +31,5 @@ public interface DateRangeEvents { String UPDATE_CALENDAR = "updateCalendar.daterangepicker"; String NEXT = "next.daterangepicker"; String PREV = "prev.daterangepicker"; + String TIME_CHANGED = "timeChanged.daterangepicker"; } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java new file mode 100644 index 000000000..4c6638ff9 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java @@ -0,0 +1,4 @@ +package gwt.material.design.incubator.client.daterange.js; + +public class RangeBuilder { +} diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index 78db0ac49..fc866d1c6 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -26,12 +26,12 @@ .daterangepicker .calendar-table th.next { position: absolute; right: 0; - top: 14px; + top: 12px; } .daterangepicker .calendar-table th.prev { position: absolute; - top: 14px; + top: 12px; left: 0px; } @@ -139,9 +139,8 @@ border-color: transparent transparent #9c9c9c !important; } -.date-range-picker .select2-container--open .select2-dropdown--above, -.date-range-picker .select2-container--open .select2-dropdown--below { - margin-top: -44px; +.date-range-picker .select2-container--open .select2-dropdown { + margin-top: -12px !important; } /** Calendar Time Picker **/ @@ -174,6 +173,29 @@ button.cancelBtn:hover { border: none; } +/** Ranges **/ +.daterangepicker.show-calendar .ranges { + margin-top: 0px; +} + +.daterangepicker .ranges li.active { + background-color: #42a5f5; +} + +.daterangepicker .ranges li { + padding-top: 11px; + padding-bottom: 11px; +} + +/** Time Pickerr **/ +.daterangepicker .calendar-time .select2 { + width: 60px !important; +} + +.daterangepicker .calendar-time { + background: #f7f5f5; +} + /** Mobile Queries **/ @media screen and (max-width: 600px) { .daterangepicker:not(.single) .drp-selected { @@ -201,7 +223,7 @@ button.cancelBtn:hover { display: block; margin: auto; float: none !important; - padding: 0px 10%; + padding: 0px 5%; border-bottom: 1px solid #e9e9e9; } @@ -215,6 +237,7 @@ button.cancelBtn:hover { bottom: 0; width: 100%; background: #fafafa; + padding-right: 10%; } .daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1), @@ -260,8 +283,44 @@ button.cancelBtn:hover { top: 8px; } - .date-range-picker .select2-container--open .select2-dropdown--above, - .date-range-picker .select2-container--open .select2-dropdown--below { - margin-top: -60px; + /** Time Picker **/ + .daterangepicker .calendar-time .select2 { + margin-top: 4px; + } + + .daterangepicker .calendar-time { + height: 32px; + color: transparent; + } + + /** Range Definitions **/ + .daterangepicker .ranges { + position: fixed; + background: #fff; + z-index: 999; + bottom: 0; + margin: 8px; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + margin-left: 5%; + } + + .daterangepicker .ranges:hover ul li { + display: block !important; + } + + .daterangepicker .ranges ul li { + padding-left: 20px; + padding-right: 20px; + display: none; + } + + .daterangepicker .ranges ul li.active { + display: block; + text-transform: uppercase; + font-weight: bold; + } + + .daterangepicker:not(.single) .drp-buttons { + padding-right: 5%; } } diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index 77c346e3e..fcd6f369b 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1 +1 @@ -.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table th,.daterangepicker .calendar-table td{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:14px}.daterangepicker .calendar-table th.prev{position:absolute;top:14px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.in-range,.daterangepicker td.available.in-range:hover:not(.active){background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:white}.daterangepicker td.available:hover:after{content:" ";background:transparent;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:white;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown--above,.date-range-picker .select2-container--open .select2-dropdown--below{margin-top:-44px}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:none;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}@media screen and (max-width:600px){.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0px!important;left:0px!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 10%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.date-range-picker .select2-container--open .select2-dropdown--above,.date-range-picker .select2-container--open .select2-dropdown--below{margin-top:-60px}} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table th,.daterangepicker .calendar-table td{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.in-range,.daterangepicker td.available.in-range:hover:not(.active){background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:white}.daterangepicker td.available:hover:after{content:" ";background:transparent;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:white;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:none;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#f7f5f5}@media screen and (max-width:600px){.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0px!important;left:0px!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:10%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}.daterangepicker .ranges{position:fixed;background:#fff;z-index:999;bottom:0;margin:8px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin-left:5%}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}.daterangepicker:not(.single) .drp-buttons{padding-right:5%}} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js index aa58c5d5c..b8557d776 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js @@ -1137,6 +1137,7 @@ outsideClick: function(e) { var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button // itself then call this.hide() if ( @@ -1144,7 +1145,10 @@ e.type == "focusin" || target.closest(this.element).length || target.closest(this.container).length || - target.closest('.calendar-table').length + target.closest('.calendar-table').length || + target.hasClass("select2-search__field") || + target.hasClass("select2-results__option") + ) return; this.hide(); this.element.trigger('outsideClick.daterangepicker', this); @@ -1427,7 +1431,6 @@ var start = this.startDate.clone(); start.hour(hour); start.minute(minute); - start.second(second); this.setStartDate(start); if (this.singleDatePicker) { this.endDate = this.startDate.clone(); @@ -1451,7 +1454,7 @@ //re-render the time pickers because changing one selection can affect what's enabled in another this.renderTimePicker('left'); this.renderTimePicker('right'); - + this.element.trigger('timeChanged.daterangepicker', this); }, elementChanged: function() { diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js index aa58c5d5c..1bd06d16b 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js @@ -1,1530 +1 @@ -/** - * @version: 3.0.3 - * @author: Dan Grossman http://www.dangrossman.info/ - * @copyright: Copyright (c) 2012-2018 Dan Grossman. All rights reserved. - * @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php - * @website: http://www.daterangepicker.com/ - */ -// Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Make globaly available as well - define(['moment', 'jquery'], function (moment, jquery) { - if (!jquery.fn) jquery.fn = {}; // webpack server rendering - if (typeof moment !== 'function' && moment.default) moment = moment.default - return factory(moment, jquery); - }); - } else if (typeof module === 'object' && module.exports) { - // Node / Browserify - //isomorphic issue - var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined; - if (!jQuery) { - jQuery = require('jquery'); - if (!jQuery.fn) jQuery.fn = {}; - } - var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); - module.exports = factory(moment, jQuery); - } else { - // Browser globals - root.daterangepicker = factory(root.moment, root.jQuery); - } -}(this, function(moment, $) { - var DateRangePicker = function(element, options, cb) { - - //default settings for options - this.parentEl = 'body'; - this.element = $(element); - this.startDate = moment().startOf('day'); - this.endDate = moment().endOf('day'); - this.minDate = false; - this.maxDate = false; - this.maxSpan = false; - this.autoApply = false; - this.singleDatePicker = false; - this.showDropdowns = false; - this.minYear = moment().subtract(100, 'year').format('YYYY'); - this.maxYear = moment().add(100, 'year').format('YYYY'); - this.showWeekNumbers = false; - this.showISOWeekNumbers = false; - this.showCustomRangeLabel = true; - this.timePicker = false; - this.timePicker24Hour = false; - this.timePickerIncrement = 1; - this.timePickerSeconds = false; - this.linkedCalendars = true; - this.autoUpdateInput = true; - this.alwaysShowCalendars = false; - this.ranges = {}; - - this.opens = 'right'; - if (this.element.hasClass('pull-right')) - this.opens = 'left'; - - this.drops = 'down'; - if (this.element.hasClass('dropup')) - this.drops = 'up'; - - this.buttonClasses = 'btn btn-sm'; - this.applyButtonClasses = 'btn-primary'; - this.cancelButtonClasses = 'btn-default'; - - this.locale = { - direction: 'ltr', - format: moment.localeData().longDateFormat('L'), - separator: ' - ', - applyLabel: 'Apply', - cancelLabel: 'Cancel', - weekLabel: 'W', - customRangeLabel: 'Custom Range', - daysOfWeek: moment.weekdaysMin(), - monthNames: moment.monthsShort(), - firstDay: moment.localeData().firstDayOfWeek() - }; - - this.callback = function() { }; - - //some state information - this.isShowing = false; - this.leftCalendar = {}; - this.rightCalendar = {}; - - //custom options from user - if (typeof options !== 'object' || options === null) - options = {}; - - //allow setting options with data attributes - //data-api options will be overwritten with custom javascript options - options = $.extend(this.element.data(), options); - - //html template for the picker UI - if (typeof options.template !== 'string' && !(options.template instanceof $)) - options.template = - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '' + - '' + - ' ' + - '
' + - '
'; - - this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); - this.container = $(options.template).appendTo(this.parentEl); - - // - // handle all the possible options overriding defaults - // - - if (typeof options.locale === 'object') { - - if (typeof options.locale.direction === 'string') - this.locale.direction = options.locale.direction; - - if (typeof options.locale.format === 'string') - this.locale.format = options.locale.format; - - if (typeof options.locale.separator === 'string') - this.locale.separator = options.locale.separator; - - if (typeof options.locale.daysOfWeek === 'object') - this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); - - if (typeof options.locale.monthNames === 'object') - this.locale.monthNames = options.locale.monthNames.slice(); - - if (typeof options.locale.firstDay === 'number') - this.locale.firstDay = options.locale.firstDay; - - if (typeof options.locale.applyLabel === 'string') - this.locale.applyLabel = options.locale.applyLabel; - - if (typeof options.locale.cancelLabel === 'string') - this.locale.cancelLabel = options.locale.cancelLabel; - - if (typeof options.locale.weekLabel === 'string') - this.locale.weekLabel = options.locale.weekLabel; - - if (typeof options.locale.customRangeLabel === 'string'){ - //Support unicode chars in the custom range name. - var elem = document.createElement('textarea'); - elem.innerHTML = options.locale.customRangeLabel; - var rangeHtml = elem.value; - this.locale.customRangeLabel = rangeHtml; - } - } - this.container.addClass(this.locale.direction); - - if (typeof options.startDate === 'string') - this.startDate = moment(options.startDate, this.locale.format); - - if (typeof options.endDate === 'string') - this.endDate = moment(options.endDate, this.locale.format); - - if (typeof options.minDate === 'string') - this.minDate = moment(options.minDate, this.locale.format); - - if (typeof options.maxDate === 'string') - this.maxDate = moment(options.maxDate, this.locale.format); - - if (typeof options.startDate === 'object') - this.startDate = moment(options.startDate); - - if (typeof options.endDate === 'object') - this.endDate = moment(options.endDate); - - if (typeof options.minDate === 'object') - this.minDate = moment(options.minDate); - - if (typeof options.maxDate === 'object') - this.maxDate = moment(options.maxDate); - - // sanity check for bad options - if (this.minDate && this.startDate.isBefore(this.minDate)) - this.startDate = this.minDate.clone(); - - // sanity check for bad options - if (this.maxDate && this.endDate.isAfter(this.maxDate)) - this.endDate = this.maxDate.clone(); - - if (typeof options.applyButtonClasses === 'string') - this.applyButtonClasses = options.applyButtonClasses; - - if (typeof options.applyClass === 'string') //backwards compat - this.applyButtonClasses = options.applyClass; - - if (typeof options.cancelButtonClasses === 'string') - this.cancelButtonClasses = options.cancelButtonClasses; - - if (typeof options.cancelClass === 'string') //backwards compat - this.cancelButtonClasses = options.cancelClass; - - if (typeof options.maxSpan === 'object') - this.maxSpan = options.maxSpan; - - if (typeof options.dateLimit === 'object') //backwards compat - this.maxSpan = options.dateLimit; - - if (typeof options.opens === 'string') - this.opens = options.opens; - - if (typeof options.drops === 'string') - this.drops = options.drops; - - if (typeof options.showWeekNumbers === 'boolean') - this.showWeekNumbers = options.showWeekNumbers; - - if (typeof options.showISOWeekNumbers === 'boolean') - this.showISOWeekNumbers = options.showISOWeekNumbers; - - if (typeof options.buttonClasses === 'string') - this.buttonClasses = options.buttonClasses; - - if (typeof options.buttonClasses === 'object') - this.buttonClasses = options.buttonClasses.join(' '); - - if (typeof options.showDropdowns === 'boolean') - this.showDropdowns = options.showDropdowns; - - if (typeof options.minYear === 'number') - this.minYear = options.minYear; - - if (typeof options.maxYear === 'number') - this.maxYear = options.maxYear; - - if (typeof options.showCustomRangeLabel === 'boolean') - this.showCustomRangeLabel = options.showCustomRangeLabel; - - if (typeof options.singleDatePicker === 'boolean') { - this.singleDatePicker = options.singleDatePicker; - if (this.singleDatePicker) - this.endDate = this.startDate.clone(); - } - - if (typeof options.timePicker === 'boolean') - this.timePicker = options.timePicker; - - if (typeof options.timePickerSeconds === 'boolean') - this.timePickerSeconds = options.timePickerSeconds; - - if (typeof options.timePickerIncrement === 'number') - this.timePickerIncrement = options.timePickerIncrement; - - if (typeof options.timePicker24Hour === 'boolean') - this.timePicker24Hour = options.timePicker24Hour; - - if (typeof options.autoApply === 'boolean') - this.autoApply = options.autoApply; - - if (typeof options.autoUpdateInput === 'boolean') - this.autoUpdateInput = options.autoUpdateInput; - - if (typeof options.linkedCalendars === 'boolean') - this.linkedCalendars = options.linkedCalendars; - - if (typeof options.isInvalidDate === 'function') - this.isInvalidDate = options.isInvalidDate; - - if (typeof options.isCustomDate === 'function') - this.isCustomDate = options.isCustomDate; - - if (typeof options.alwaysShowCalendars === 'boolean') - this.alwaysShowCalendars = options.alwaysShowCalendars; - - // update day names order to firstDay - if (this.locale.firstDay != 0) { - var iterator = this.locale.firstDay; - while (iterator > 0) { - this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); - iterator--; - } - } - - var start, end, range; - - //if no start/end dates set, check if an input element contains initial values - if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { - if ($(this.element).is(':text')) { - var val = $(this.element).val(), - split = val.split(this.locale.separator); - - start = end = null; - - if (split.length == 2) { - start = moment(split[0], this.locale.format); - end = moment(split[1], this.locale.format); - } else if (this.singleDatePicker && val !== "") { - start = moment(val, this.locale.format); - end = moment(val, this.locale.format); - } - if (start !== null && end !== null) { - this.setStartDate(start); - this.setEndDate(end); - } - } - } - - if (typeof options.ranges === 'object') { - for (range in options.ranges) { - - if (typeof options.ranges[range][0] === 'string') - start = moment(options.ranges[range][0], this.locale.format); - else - start = moment(options.ranges[range][0]); - - if (typeof options.ranges[range][1] === 'string') - end = moment(options.ranges[range][1], this.locale.format); - else - end = moment(options.ranges[range][1]); - - // If the start or end date exceed those allowed by the minDate or maxSpan - // options, shorten the range to the allowable period. - if (this.minDate && start.isBefore(this.minDate)) - start = this.minDate.clone(); - - var maxDate = this.maxDate; - if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate)) - maxDate = start.clone().add(this.maxSpan); - if (maxDate && end.isAfter(maxDate)) - end = maxDate.clone(); - - // If the end of the range is before the minimum or the start of the range is - // after the maximum, don't display this range option at all. - if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) - || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) - continue; - - //Support unicode chars in the range names. - var elem = document.createElement('textarea'); - elem.innerHTML = range; - var rangeHtml = elem.value; - - this.ranges[rangeHtml] = [start, end]; - } - - var list = '
    '; - for (range in this.ranges) { - list += '
  • ' + range + '
  • '; - } - if (this.showCustomRangeLabel) { - list += '
  • ' + this.locale.customRangeLabel + '
  • '; - } - list += '
'; - this.container.find('.ranges').prepend(list); - } - - if (typeof cb === 'function') { - this.callback = cb; - } - - if (!this.timePicker) { - this.startDate = this.startDate.startOf('day'); - this.endDate = this.endDate.endOf('day'); - this.container.find('.calendar-time').hide(); - } - - //can't be used together for now - if (this.timePicker && this.autoApply) - this.autoApply = false; - - if (this.autoApply) { - this.container.addClass('auto-apply'); - } - - if (typeof options.ranges === 'object') - this.container.addClass('show-ranges'); - - if (this.singleDatePicker) { - this.container.addClass('single'); - this.container.find('.drp-calendar.left').addClass('single'); - this.container.find('.drp-calendar.left').show(); - this.container.find('.drp-calendar.right').hide(); - if (!this.timePicker) { - this.container.addClass('auto-apply'); - } - } - - if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { - this.container.addClass('show-calendar'); - } - - this.container.addClass('opens' + this.opens); - - //apply CSS classes and labels to buttons - this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); - if (this.applyButtonClasses.length) - this.container.find('.applyBtn').addClass(this.applyButtonClasses); - if (this.cancelButtonClasses.length) - this.container.find('.cancelBtn').addClass(this.cancelButtonClasses); - this.container.find('.applyBtn').html(this.locale.applyLabel); - this.container.find('.cancelBtn').html(this.locale.cancelLabel); - - // - // event listeners - // - - this.container.find('.drp-calendar') - .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) - .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) - .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) - .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) - .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) - .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) - .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) - - this.container.find('.ranges') - .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) - - this.container.find('.drp-buttons') - .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) - .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) - - if (this.element.is('input') || this.element.is('button')) { - this.element.on({ - 'click.daterangepicker': $.proxy(this.show, this), - 'focus.daterangepicker': $.proxy(this.show, this), - 'keyup.daterangepicker': $.proxy(this.elementChanged, this), - 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility - }); - } else { - this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); - this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); - } - - // - // if attached to a text input, set the initial value - // - - this.updateElement(); - - }; - - DateRangePicker.prototype = { - - constructor: DateRangePicker, - - setStartDate: function(startDate) { - if (typeof startDate === 'string') - this.startDate = moment(startDate, this.locale.format); - - if (typeof startDate === 'object') - this.startDate = moment(startDate); - - if (!this.timePicker) - this.startDate = this.startDate.startOf('day'); - - if (this.timePicker && this.timePickerIncrement) - this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); - - if (this.minDate && this.startDate.isBefore(this.minDate)) { - this.startDate = this.minDate.clone(); - if (this.timePicker && this.timePickerIncrement) - this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); - } - - if (this.maxDate && this.startDate.isAfter(this.maxDate)) { - this.startDate = this.maxDate.clone(); - if (this.timePicker && this.timePickerIncrement) - this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); - } - - if (!this.isShowing) - this.updateElement(); - - this.updateMonthsInView(); - }, - - setEndDate: function(endDate) { - if (typeof endDate === 'string') - this.endDate = moment(endDate, this.locale.format); - - if (typeof endDate === 'object') - this.endDate = moment(endDate); - - if (!this.timePicker) - this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); - - if (this.timePicker && this.timePickerIncrement) - this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); - - if (this.endDate.isBefore(this.startDate)) - this.endDate = this.startDate.clone(); - - if (this.maxDate && this.endDate.isAfter(this.maxDate)) - this.endDate = this.maxDate.clone(); - - if (this.maxSpan && this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)) - this.endDate = this.startDate.clone().add(this.maxSpan); - - this.previousRightTime = this.endDate.clone(); - - this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); - - if (!this.isShowing) - this.updateElement(); - - this.updateMonthsInView(); - }, - - isInvalidDate: function() { - return false; - }, - - isCustomDate: function() { - return false; - }, - - updateView: function() { - if (this.timePicker) { - this.renderTimePicker('left'); - this.renderTimePicker('right'); - if (!this.endDate) { - this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); - } else { - this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); - } - } - if (this.endDate) - this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); - this.updateMonthsInView(); - this.updateCalendars(); - this.updateFormInputs(); - }, - - updateMonthsInView: function() { - if (this.endDate) { - - //if both dates are visible already, do nothing - if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && - (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) - && - (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) - ) { - return; - } - - this.leftCalendar.month = this.startDate.clone().date(2); - if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { - this.rightCalendar.month = this.endDate.clone().date(2); - } else { - this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); - } - - } else { - if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { - this.leftCalendar.month = this.startDate.clone().date(2); - this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); - } - } - if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { - this.rightCalendar.month = this.maxDate.clone().date(2); - this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); - } - }, - - updateCalendars: function() { - - if (this.timePicker) { - var hour, minute, second; - if (this.endDate) { - hour = parseInt(this.container.find('.left .hourselect').val(), 10); - minute = parseInt(this.container.find('.left .minuteselect').val(), 10); - second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; - if (!this.timePicker24Hour) { - var ampm = this.container.find('.left .ampmselect').val(); - if (ampm === 'PM' && hour < 12) - hour += 12; - if (ampm === 'AM' && hour === 12) - hour = 0; - } - } else { - hour = parseInt(this.container.find('.right .hourselect').val(), 10); - minute = parseInt(this.container.find('.right .minuteselect').val(), 10); - second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; - if (!this.timePicker24Hour) { - var ampm = this.container.find('.right .ampmselect').val(); - if (ampm === 'PM' && hour < 12) - hour += 12; - if (ampm === 'AM' && hour === 12) - hour = 0; - } - } - this.leftCalendar.month.hour(hour).minute(minute).second(second); - this.rightCalendar.month.hour(hour).minute(minute).second(second); - } - - this.renderCalendar('left'); - this.renderCalendar('right'); - - //highlight any predefined range matching the current start and end dates - this.container.find('.ranges li').removeClass('active'); - if (this.endDate == null) return; - - this.element.trigger('updateCalendar.daterangepicker', this); - this.calculateChosenLabel(); - }, - - renderCalendar: function(side) { - - // - // Build the matrix of dates that will populate the calendar - // - - var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; - var month = calendar.month.month(); - var year = calendar.month.year(); - var hour = calendar.month.hour(); - var minute = calendar.month.minute(); - var second = calendar.month.second(); - var daysInMonth = moment([year, month]).daysInMonth(); - var firstDay = moment([year, month, 1]); - var lastDay = moment([year, month, daysInMonth]); - var lastMonth = moment(firstDay).subtract(1, 'month').month(); - var lastYear = moment(firstDay).subtract(1, 'month').year(); - var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); - var dayOfWeek = firstDay.day(); - - //initialize a 6 rows x 7 columns array for the calendar - var calendar = []; - calendar.firstDay = firstDay; - calendar.lastDay = lastDay; - - for (var i = 0; i < 6; i++) { - calendar[i] = []; - } - - //populate the calendar with date objects - var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; - if (startDay > daysInLastMonth) - startDay -= 7; - - if (dayOfWeek == this.locale.firstDay) - startDay = daysInLastMonth - 6; - - var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); - - var col, row; - for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { - if (i > 0 && col % 7 === 0) { - col = 0; - row++; - } - calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); - curDate.hour(12); - - if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { - calendar[row][col] = this.minDate.clone(); - } - - if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { - calendar[row][col] = this.maxDate.clone(); - } - - } - - //make the calendar object available to hoverDate/clickDate - if (side == 'left') { - this.leftCalendar.calendar = calendar; - } else { - this.rightCalendar.calendar = calendar; - } - - // - // Display the calendar - // - - var minDate = side == 'left' ? this.minDate : this.startDate; - var maxDate = this.maxDate; - var selected = side == 'left' ? this.startDate : this.endDate; - var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; - - var html = ''; - html += ''; - html += ''; - - // add empty cell for week number - if (this.showWeekNumbers || this.showISOWeekNumbers) - html += ''; - - if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { - html += ''; - } else { - html += ''; - } - - var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); - - if (this.showDropdowns) { - var currentMonth = calendar[1][1].month(); - var currentYear = calendar[1][1].year(); - var maxYear = (maxDate && maxDate.year()) || (this.maxYear); - var minYear = (minDate && minDate.year()) || (this.minYear); - var inMinYear = currentYear == minYear; - var inMaxYear = currentYear == maxYear; - - var monthHtml = '"; - - var yearHtml = ''; - - dateHtml = monthHtml + yearHtml; - } - - html += ''; - if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { - html += ''; - } else { - html += ''; - } - - html += ''; - html += ''; - - // add week number label - if (this.showWeekNumbers || this.showISOWeekNumbers) - html += ''; - - $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { - html += ''; - }); - - html += ''; - html += ''; - html += ''; - - //adjust maxDate to reflect the maxSpan setting in order to - //grey out end dates beyond the maxSpan - if (this.endDate == null && this.maxSpan) { - var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day'); - if (!maxDate || maxLimit.isBefore(maxDate)) { - maxDate = maxLimit; - } - } - - for (var row = 0; row < 6; row++) { - html += ''; - - // add week number - if (this.showWeekNumbers) - html += ''; - else if (this.showISOWeekNumbers) - html += ''; - - for (var col = 0; col < 7; col++) { - - var classes = []; - - //highlight today's date - if (calendar[row][col].isSame(new Date(), "day")) - classes.push('today'); - - //highlight weekends - if (calendar[row][col].isoWeekday() > 5) - classes.push('weekend'); - - //grey out the dates in other months displayed at beginning and end of this calendar - if (calendar[row][col].month() != calendar[1][1].month()) - classes.push('off'); - - //don't allow selection of dates before the minimum date - if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) - classes.push('off', 'disabled'); - - //don't allow selection of dates after the maximum date - if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) - classes.push('off', 'disabled'); - - //don't allow selection of date if a custom function decides it's invalid - if (this.isInvalidDate(calendar[row][col])) - classes.push('off', 'disabled'); - - //highlight the currently selected start date - if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) - classes.push('active', 'start-date'); - - //highlight the currently selected end date - if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) - classes.push('active', 'end-date'); - - //highlight dates in-between the selected dates - if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) - classes.push('in-range'); - - //apply custom classes for this date - var isCustom = this.isCustomDate(calendar[row][col]); - if (isCustom !== false) { - if (typeof isCustom === 'string') - classes.push(isCustom); - else - Array.prototype.push.apply(classes, isCustom); - } - - var cname = '', disabled = false; - for (var i = 0; i < classes.length; i++) { - cname += classes[i] + ' '; - if (classes[i] == 'disabled') - disabled = true; - } - if (!disabled) - cname += 'available'; - - html += ''; - - } - html += ''; - } - - html += ''; - html += '
' + dateHtml + '
' + this.locale.weekLabel + '' + dayOfWeek + '
' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
'; - - this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html); - - }, - - renderTimePicker: function(side) { - - // Don't bother updating the time picker if it's currently disabled - // because an end date hasn't been clicked yet - if (side == 'right' && !this.endDate) return; - - var html, selected, minDate, maxDate = this.maxDate; - - if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate))) - maxDate = this.startDate.clone().add(this.maxSpan); - - if (side == 'left') { - selected = this.startDate.clone(); - minDate = this.minDate; - } else if (side == 'right') { - selected = this.endDate.clone(); - minDate = this.startDate; - - //Preserve the time already selected - var timeSelector = this.container.find('.drp-calendar.right .calendar-time'); - if (timeSelector.html() != '') { - - selected.hour(selected.hour() || timeSelector.find('.hourselect option:selected').val()); - selected.minute(selected.minute() || timeSelector.find('.minuteselect option:selected').val()); - selected.second(selected.second() || timeSelector.find('.secondselect option:selected').val()); - - if (!this.timePicker24Hour) { - var ampm = timeSelector.find('.ampmselect option:selected').val(); - if (ampm === 'PM' && selected.hour() < 12) - selected.hour(selected.hour() + 12); - if (ampm === 'AM' && selected.hour() === 12) - selected.hour(0); - } - - } - - if (selected.isBefore(this.startDate)) - selected = this.startDate.clone(); - - if (maxDate && selected.isAfter(maxDate)) - selected = maxDate.clone(); - - } - - // - // hours - // - - html = ' '; - - // - // minutes - // - - html += ': '; - - // - // seconds - // - - if (this.timePickerSeconds) { - html += ': '; - } - - // - // AM/PM - // - - if (!this.timePicker24Hour) { - html += ''; - } - - this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html); - - }, - - updateFormInputs: function() { - - if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { - this.container.find('button.applyBtn').removeAttr('disabled'); - } else { - this.container.find('button.applyBtn').attr('disabled', 'disabled'); - } - - }, - - move: function() { - var parentOffset = { top: 0, left: 0 }, - containerTop; - var parentRightEdge = $(window).width(); - if (!this.parentEl.is('body')) { - parentOffset = { - top: this.parentEl.offset().top - this.parentEl.scrollTop(), - left: this.parentEl.offset().left - this.parentEl.scrollLeft() - }; - parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; - } - - if (this.drops == 'up') - containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; - else - containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; - this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('drop-up'); - - if (this.opens == 'left') { - this.container.css({ - top: containerTop, - right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), - left: 'auto' - }); - if (this.container.offset().left < 0) { - this.container.css({ - right: 'auto', - left: 9 - }); - } - } else if (this.opens == 'center') { - this.container.css({ - top: containerTop, - left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 - - this.container.outerWidth() / 2, - right: 'auto' - }); - if (this.container.offset().left < 0) { - this.container.css({ - right: 'auto', - left: 9 - }); - } - } else { - this.container.css({ - top: containerTop, - left: this.element.offset().left - parentOffset.left, - right: 'auto' - }); - if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { - this.container.css({ - left: 'auto', - right: 0 - }); - } - } - }, - - show: function(e) { - if (this.isShowing) return; - - // Create a click proxy that is private to this instance of datepicker, for unbinding - this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); - - // Bind global datepicker mousedown for hiding and - $(document) - .on('mousedown.daterangepicker', this._outsideClickProxy) - // also support mobile devices - .on('touchend.daterangepicker', this._outsideClickProxy) - // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them - .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) - // and also close when focus changes to outside the picker (eg. tabbing between controls) - .on('focusin.daterangepicker', this._outsideClickProxy); - - // Reposition the picker if the window is resized while it's open - $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); - - this.oldStartDate = this.startDate.clone(); - this.oldEndDate = this.endDate.clone(); - this.previousRightTime = this.endDate.clone(); - - this.updateView(); - this.container.show(); - this.move(); - this.element.trigger('show.daterangepicker', this); - this.isShowing = true; - }, - - hide: function(e) { - if (!this.isShowing) return; - - //incomplete date selection, revert to last values - if (!this.endDate) { - this.startDate = this.oldStartDate.clone(); - this.endDate = this.oldEndDate.clone(); - } - - //if a new date range was selected, invoke the user callback function - if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) - this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel); - - //if picker is attached to a text input, update it - this.updateElement(); - - $(document).off('.daterangepicker'); - $(window).off('.daterangepicker'); - this.container.hide(); - this.element.trigger('hide.daterangepicker', this); - this.isShowing = false; - }, - - toggle: function(e) { - if (this.isShowing) { - this.hide(); - } else { - this.show(); - } - }, - - outsideClick: function(e) { - var target = $(e.target); - // if the page is clicked anywhere except within the daterangerpicker/button - // itself then call this.hide() - if ( - // ie modal dialog fix - e.type == "focusin" || - target.closest(this.element).length || - target.closest(this.container).length || - target.closest('.calendar-table').length - ) return; - this.hide(); - this.element.trigger('outsideClick.daterangepicker', this); - }, - - showCalendars: function() { - this.container.addClass('show-calendar'); - this.move(); - this.element.trigger('showCalendar.daterangepicker', this); - }, - - hideCalendars: function() { - this.container.removeClass('show-calendar'); - this.element.trigger('hideCalendar.daterangepicker', this); - }, - - clickRange: function(e) { - var label = e.target.getAttribute('data-range-key'); - this.chosenLabel = label; - if (label == this.locale.customRangeLabel) { - this.showCalendars(); - } else { - var dates = this.ranges[label]; - this.startDate = dates[0]; - this.endDate = dates[1]; - - if (!this.timePicker) { - this.startDate.startOf('day'); - this.endDate.endOf('day'); - } - - if (!this.alwaysShowCalendars) - this.hideCalendars(); - this.clickApply(); - } - - }, - - clickPrev: function(e) { - var cal = $(e.target).parents('.drp-calendar'); - if (cal.hasClass('left')) { - this.leftCalendar.month.subtract(1, 'month'); - if (this.linkedCalendars) - this.rightCalendar.month.subtract(1, 'month'); - } else { - this.rightCalendar.month.subtract(1, 'month'); - } - this.updateCalendars(); - this.element.trigger('prev.daterangepicker', this); - }, - - clickNext: function(e) { - var cal = $(e.target).parents('.drp-calendar'); - if (cal.hasClass('left')) { - this.leftCalendar.month.add(1, 'month'); - } else { - this.rightCalendar.month.add(1, 'month'); - if (this.linkedCalendars) - this.leftCalendar.month.add(1, 'month'); - } - this.updateCalendars(); - this.element.trigger('next.daterangepicker', this); - }, - - hoverDate: function(e) { - - //ignore dates that can't be selected - if (!$(e.target).hasClass('available')) return; - - var title = $(e.target).attr('data-title'); - var row = title.substr(1, 1); - var col = title.substr(3, 1); - var cal = $(e.target).parents('.drp-calendar'); - var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; - - //highlight the dates between the start date and the date being hovered as a potential end date - var leftCalendar = this.leftCalendar; - var rightCalendar = this.rightCalendar; - var startDate = this.startDate; - if (!this.endDate) { - this.container.find('.drp-calendar tbody td').each(function(index, el) { - - //skip week numbers, only look at dates - if ($(el).hasClass('week')) return; - - var title = $(el).attr('data-title'); - var row = title.substr(1, 1); - var col = title.substr(3, 1); - var cal = $(el).parents('.drp-calendar'); - var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; - - if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { - $(el).addClass('in-range'); - } else { - $(el).removeClass('in-range'); - } - - }); - } - - }, - - clickDate: function(e) { - - if (!$(e.target).hasClass('available')) return; - - var title = $(e.target).attr('data-title'); - var row = title.substr(1, 1); - var col = title.substr(3, 1); - var cal = $(e.target).parents('.drp-calendar'); - var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; - - // - // this function needs to do a few things: - // * alternate between selecting a start and end date for the range, - // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date - // * if autoapply is enabled, and an end date was chosen, apply the selection - // * if single date picker mode, and time picker isn't enabled, apply the selection immediately - // * if one of the inputs above the calendars was focused, cancel that manual input - // - - if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start - if (this.timePicker) { - var hour = parseInt(this.container.find('.left .hourselect').val(), 10); - if (!this.timePicker24Hour) { - var ampm = this.container.find('.left .ampmselect').val(); - if (ampm === 'PM' && hour < 12) - hour += 12; - if (ampm === 'AM' && hour === 12) - hour = 0; - } - var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); - var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; - date = date.clone().hour(hour).minute(minute).second(second); - } - this.endDate = null; - this.setStartDate(date.clone()); - } else if (!this.endDate && date.isBefore(this.startDate)) { - //special case: clicking the same date for start/end, - //but the time of the end date is before the start date - this.setEndDate(this.startDate.clone()); - } else { // picking end - if (this.timePicker) { - var hour = parseInt(this.container.find('.right .hourselect').val(), 10); - if (!this.timePicker24Hour) { - var ampm = this.container.find('.right .ampmselect').val(); - if (ampm === 'PM' && hour < 12) - hour += 12; - if (ampm === 'AM' && hour === 12) - hour = 0; - } - var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); - var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; - date = date.clone().hour(hour).minute(minute).second(second); - } - this.setEndDate(date.clone()); - if (this.autoApply) { - this.calculateChosenLabel(); - this.clickApply(); - } - } - - if (this.singleDatePicker) { - this.setEndDate(this.startDate); - if (!this.timePicker) - this.clickApply(); - } - - this.updateView(); - this.element.trigger('selectDate.daterangepicker', this); - //This is to cancel the blur event handler if the mouse was in one of the inputs - e.stopPropagation(); - - }, - - calculateChosenLabel: function () { - var customRange = true; - var i = 0; - for (var range in this.ranges) { - if (this.timePicker) { - var format = this.timePickerSeconds ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD HH:mm"; - //ignore times when comparing dates if time picker seconds is not enabled - if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { - customRange = false; - this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); - break; - } - } else { - //ignore times when comparing dates if time picker is not enabled - if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { - customRange = false; - this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); - break; - } - } - i++; - } - if (customRange) { - if (this.showCustomRangeLabel) { - this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key'); - } else { - this.chosenLabel = null; - } - this.showCalendars(); - } - }, - - clickApply: function(e) { - this.hide(); - this.element.trigger('apply.daterangepicker', this); - }, - - clickCancel: function(e) { - this.startDate = this.oldStartDate; - this.endDate = this.oldEndDate; - this.hide(); - this.element.trigger('cancel.daterangepicker', this); - }, - - monthOrYearChanged: function(e) { - var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'), - leftOrRight = isLeft ? 'left' : 'right', - cal = this.container.find('.drp-calendar.'+leftOrRight); - - // Month must be Number for new moment versions - var month = parseInt(cal.find('.monthselect').val(), 10); - var year = cal.find('.yearselect').val(); - - if (!isLeft) { - if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { - month = this.startDate.month(); - year = this.startDate.year(); - } - } - - if (this.minDate) { - if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { - month = this.minDate.month(); - year = this.minDate.year(); - } - } - - if (this.maxDate) { - if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { - month = this.maxDate.month(); - year = this.maxDate.year(); - } - } - - if (isLeft) { - this.leftCalendar.month.month(month).year(year); - if (this.linkedCalendars) - this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); - } else { - this.rightCalendar.month.month(month).year(year); - if (this.linkedCalendars) - this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); - } - this.updateCalendars(); - }, - - timeChanged: function(e) { - - var cal = $(e.target).closest('.drp-calendar'), - isLeft = cal.hasClass('left'); - - var hour = parseInt(cal.find('.hourselect').val(), 10); - var minute = parseInt(cal.find('.minuteselect').val(), 10); - var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; - - if (!this.timePicker24Hour) { - var ampm = cal.find('.ampmselect').val(); - if (ampm === 'PM' && hour < 12) - hour += 12; - if (ampm === 'AM' && hour === 12) - hour = 0; - } - - if (isLeft) { - var start = this.startDate.clone(); - start.hour(hour); - start.minute(minute); - start.second(second); - this.setStartDate(start); - if (this.singleDatePicker) { - this.endDate = this.startDate.clone(); - } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { - this.setEndDate(start.clone()); - } - } else if (this.endDate) { - var end = this.endDate.clone(); - end.hour(hour); - end.minute(minute); - end.second(second); - this.setEndDate(end); - } - - //update the calendars so all clickable dates reflect the new time component - this.updateCalendars(); - - //update the form inputs above the calendars with the new time - this.updateFormInputs(); - - //re-render the time pickers because changing one selection can affect what's enabled in another - this.renderTimePicker('left'); - this.renderTimePicker('right'); - - }, - - elementChanged: function() { - if (!this.element.is('input')) return; - if (!this.element.val().length) return; - - var dateString = this.element.val().split(this.locale.separator), - start = null, - end = null; - - if (dateString.length === 2) { - start = moment(dateString[0], this.locale.format); - end = moment(dateString[1], this.locale.format); - } - - if (this.singleDatePicker || start === null || end === null) { - start = moment(this.element.val(), this.locale.format); - end = start; - } - - if (!start.isValid() || !end.isValid()) return; - - this.setStartDate(start); - this.setEndDate(end); - this.updateView(); - }, - - keydown: function(e) { - //hide on tab or enter - if ((e.keyCode === 9) || (e.keyCode === 13)) { - this.hide(); - } - - //hide on esc and prevent propagation - if (e.keyCode === 27) { - e.preventDefault(); - e.stopPropagation(); - - this.hide(); - } - }, - - updateElement: function() { - if (this.element.is('input') && this.autoUpdateInput) { - var newValue = this.startDate.format(this.locale.format); - if (!this.singleDatePicker) { - newValue += this.locale.separator + this.endDate.format(this.locale.format); - } - if (newValue !== this.element.val()) { - this.element.val(newValue).trigger('change'); - } - } - }, - - remove: function() { - this.container.remove(); - this.element.off('.daterangepicker'); - this.element.removeData(); - } - - }; - - $.fn.daterangepicker = function(options, callback) { - var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); - this.each(function() { - var el = $(this); - if (el.data('daterangepicker')) - el.data('daterangepicker').remove(); - el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); - }); - return this; - }; - - return DateRangePicker; - -})); +!function(t,e){if("function"==typeof define&&define.amd)define(["moment","jquery"],function(t,a){return a.fn||(a.fn={}),"function"!=typeof t&&t.default&&(t=t.default),e(t,a)});else if("object"==typeof module&&module.exports){var a="undefined"!=typeof window?window.jQuery:void 0;a||(a=require("jquery")).fn||(a.fn={});var i="undefined"!=typeof window&&void 0!==window.moment?window.moment:require("moment");module.exports=e(i,a)}else t.daterangepicker=e(t.moment,t.jQuery)}(this,function(t,e){var a=function(a,i,s){if(this.parentEl="body",this.element=e(a),this.startDate=t().startOf("day"),this.endDate=t().endOf("day"),this.minDate=!1,this.maxDate=!1,this.maxSpan=!1,this.autoApply=!1,this.singleDatePicker=!1,this.showDropdowns=!1,this.minYear=t().subtract(100,"year").format("YYYY"),this.maxYear=t().add(100,"year").format("YYYY"),this.showWeekNumbers=!1,this.showISOWeekNumbers=!1,this.showCustomRangeLabel=!0,this.timePicker=!1,this.timePicker24Hour=!1,this.timePickerIncrement=1,this.timePickerSeconds=!1,this.linkedCalendars=!0,this.autoUpdateInput=!0,this.alwaysShowCalendars=!1,this.ranges={},this.opens="right",this.element.hasClass("pull-right")&&(this.opens="left"),this.drops="down",this.element.hasClass("dropup")&&(this.drops="up"),this.buttonClasses="btn btn-sm",this.applyButtonClasses="btn-primary",this.cancelButtonClasses="btn-default",this.locale={direction:"ltr",format:t.localeData().longDateFormat("L"),separator:" - ",applyLabel:"Apply",cancelLabel:"Cancel",weekLabel:"W",customRangeLabel:"Custom Range",daysOfWeek:t.weekdaysMin(),monthNames:t.monthsShort(),firstDay:t.localeData().firstDayOfWeek()},this.callback=function(){},this.isShowing=!1,this.leftCalendar={},this.rightCalendar={},"object"==typeof i&&null!==i||(i={}),"string"==typeof(i=e.extend(this.element.data(),i)).template||i.template instanceof e||(i.template='
'),this.parentEl=i.parentEl&&e(i.parentEl).length?e(i.parentEl):e(this.parentEl),this.container=e(i.template).appendTo(this.parentEl),"object"==typeof i.locale&&("string"==typeof i.locale.direction&&(this.locale.direction=i.locale.direction),"string"==typeof i.locale.format&&(this.locale.format=i.locale.format),"string"==typeof i.locale.separator&&(this.locale.separator=i.locale.separator),"object"==typeof i.locale.daysOfWeek&&(this.locale.daysOfWeek=i.locale.daysOfWeek.slice()),"object"==typeof i.locale.monthNames&&(this.locale.monthNames=i.locale.monthNames.slice()),"number"==typeof i.locale.firstDay&&(this.locale.firstDay=i.locale.firstDay),"string"==typeof i.locale.applyLabel&&(this.locale.applyLabel=i.locale.applyLabel),"string"==typeof i.locale.cancelLabel&&(this.locale.cancelLabel=i.locale.cancelLabel),"string"==typeof i.locale.weekLabel&&(this.locale.weekLabel=i.locale.weekLabel),"string"==typeof i.locale.customRangeLabel)){(f=document.createElement("textarea")).innerHTML=i.locale.customRangeLabel;var n=f.value;this.locale.customRangeLabel=n}if(this.container.addClass(this.locale.direction),"string"==typeof i.startDate&&(this.startDate=t(i.startDate,this.locale.format)),"string"==typeof i.endDate&&(this.endDate=t(i.endDate,this.locale.format)),"string"==typeof i.minDate&&(this.minDate=t(i.minDate,this.locale.format)),"string"==typeof i.maxDate&&(this.maxDate=t(i.maxDate,this.locale.format)),"object"==typeof i.startDate&&(this.startDate=t(i.startDate)),"object"==typeof i.endDate&&(this.endDate=t(i.endDate)),"object"==typeof i.minDate&&(this.minDate=t(i.minDate)),"object"==typeof i.maxDate&&(this.maxDate=t(i.maxDate)),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),"string"==typeof i.applyButtonClasses&&(this.applyButtonClasses=i.applyButtonClasses),"string"==typeof i.applyClass&&(this.applyButtonClasses=i.applyClass),"string"==typeof i.cancelButtonClasses&&(this.cancelButtonClasses=i.cancelButtonClasses),"string"==typeof i.cancelClass&&(this.cancelButtonClasses=i.cancelClass),"object"==typeof i.maxSpan&&(this.maxSpan=i.maxSpan),"object"==typeof i.dateLimit&&(this.maxSpan=i.dateLimit),"string"==typeof i.opens&&(this.opens=i.opens),"string"==typeof i.drops&&(this.drops=i.drops),"boolean"==typeof i.showWeekNumbers&&(this.showWeekNumbers=i.showWeekNumbers),"boolean"==typeof i.showISOWeekNumbers&&(this.showISOWeekNumbers=i.showISOWeekNumbers),"string"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses),"object"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses.join(" ")),"boolean"==typeof i.showDropdowns&&(this.showDropdowns=i.showDropdowns),"number"==typeof i.minYear&&(this.minYear=i.minYear),"number"==typeof i.maxYear&&(this.maxYear=i.maxYear),"boolean"==typeof i.showCustomRangeLabel&&(this.showCustomRangeLabel=i.showCustomRangeLabel),"boolean"==typeof i.singleDatePicker&&(this.singleDatePicker=i.singleDatePicker,this.singleDatePicker&&(this.endDate=this.startDate.clone())),"boolean"==typeof i.timePicker&&(this.timePicker=i.timePicker),"boolean"==typeof i.timePickerSeconds&&(this.timePickerSeconds=i.timePickerSeconds),"number"==typeof i.timePickerIncrement&&(this.timePickerIncrement=i.timePickerIncrement),"boolean"==typeof i.timePicker24Hour&&(this.timePicker24Hour=i.timePicker24Hour),"boolean"==typeof i.autoApply&&(this.autoApply=i.autoApply),"boolean"==typeof i.autoUpdateInput&&(this.autoUpdateInput=i.autoUpdateInput),"boolean"==typeof i.linkedCalendars&&(this.linkedCalendars=i.linkedCalendars),"function"==typeof i.isInvalidDate&&(this.isInvalidDate=i.isInvalidDate),"function"==typeof i.isCustomDate&&(this.isCustomDate=i.isCustomDate),"boolean"==typeof i.alwaysShowCalendars&&(this.alwaysShowCalendars=i.alwaysShowCalendars),0!=this.locale.firstDay)for(var r=this.locale.firstDay;r>0;)this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),r--;var o,h,l;if(void 0===i.startDate&&void 0===i.endDate&&e(this.element).is(":text")){var c=e(this.element).val(),d=c.split(this.locale.separator);o=h=null,2==d.length?(o=t(d[0],this.locale.format),h=t(d[1],this.locale.format)):this.singleDatePicker&&""!==c&&(o=t(c,this.locale.format),h=t(c,this.locale.format)),null!==o&&null!==h&&(this.setStartDate(o),this.setEndDate(h))}if("object"==typeof i.ranges){for(l in i.ranges){o="string"==typeof i.ranges[l][0]?t(i.ranges[l][0],this.locale.format):t(i.ranges[l][0]),h="string"==typeof i.ranges[l][1]?t(i.ranges[l][1],this.locale.format):t(i.ranges[l][1]),this.minDate&&o.isBefore(this.minDate)&&(o=this.minDate.clone());var m=this.maxDate;if(this.maxSpan&&m&&o.clone().add(this.maxSpan).isAfter(m)&&(m=o.clone().add(this.maxSpan)),m&&h.isAfter(m)&&(h=m.clone()),!(this.minDate&&h.isBefore(this.minDate,this.timepicker?"minute":"day")||m&&o.isAfter(m,this.timepicker?"minute":"day"))){var f;(f=document.createElement("textarea")).innerHTML=l;n=f.value;this.ranges[n]=[o,h]}}var p="
    ";for(l in this.ranges)p+='
  • '+l+"
  • ";this.showCustomRangeLabel&&(p+='
  • '+this.locale.customRangeLabel+"
  • "),p+="
",this.container.find(".ranges").prepend(p)}"function"==typeof s&&(this.callback=s),this.timePicker||(this.startDate=this.startDate.startOf("day"),this.endDate=this.endDate.endOf("day"),this.container.find(".calendar-time").hide()),this.timePicker&&this.autoApply&&(this.autoApply=!1),this.autoApply&&this.container.addClass("auto-apply"),"object"==typeof i.ranges&&this.container.addClass("show-ranges"),this.singleDatePicker&&(this.container.addClass("single"),this.container.find(".drp-calendar.left").addClass("single"),this.container.find(".drp-calendar.left").show(),this.container.find(".drp-calendar.right").hide(),this.timePicker||this.container.addClass("auto-apply")),(void 0===i.ranges&&!this.singleDatePicker||this.alwaysShowCalendars)&&this.container.addClass("show-calendar"),this.container.addClass("opens"+this.opens),this.container.find(".applyBtn, .cancelBtn").addClass(this.buttonClasses),this.applyButtonClasses.length&&this.container.find(".applyBtn").addClass(this.applyButtonClasses),this.cancelButtonClasses.length&&this.container.find(".cancelBtn").addClass(this.cancelButtonClasses),this.container.find(".applyBtn").html(this.locale.applyLabel),this.container.find(".cancelBtn").html(this.locale.cancelLabel),this.container.find(".drp-calendar").on("click.daterangepicker",".prev",e.proxy(this.clickPrev,this)).on("click.daterangepicker",".next",e.proxy(this.clickNext,this)).on("mousedown.daterangepicker","td.available",e.proxy(this.clickDate,this)).on("mouseenter.daterangepicker","td.available",e.proxy(this.hoverDate,this)).on("change.daterangepicker","select.yearselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.monthselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.hourselect,select.minuteselect,select.secondselect,select.ampmselect",e.proxy(this.timeChanged,this)),this.container.find(".ranges").on("click.daterangepicker","li",e.proxy(this.clickRange,this)),this.container.find(".drp-buttons").on("click.daterangepicker","button.applyBtn",e.proxy(this.clickApply,this)).on("click.daterangepicker","button.cancelBtn",e.proxy(this.clickCancel,this)),this.element.is("input")||this.element.is("button")?this.element.on({"click.daterangepicker":e.proxy(this.show,this),"focus.daterangepicker":e.proxy(this.show,this),"keyup.daterangepicker":e.proxy(this.elementChanged,this),"keydown.daterangepicker":e.proxy(this.keydown,this)}):(this.element.on("click.daterangepicker",e.proxy(this.toggle,this)),this.element.on("keydown.daterangepicker",e.proxy(this.toggle,this))),this.updateElement()};return a.prototype={constructor:a,setStartDate:function(e){"string"==typeof e&&(this.startDate=t(e,this.locale.format)),"object"==typeof e&&(this.startDate=t(e)),this.timePicker||(this.startDate=this.startDate.startOf("day")),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.maxDate&&this.startDate.isAfter(this.maxDate)&&(this.startDate=this.maxDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.floor(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.isShowing||this.updateElement(),this.updateMonthsInView()},setEndDate:function(e){"string"==typeof e&&(this.endDate=t(e,this.locale.format)),"object"==typeof e&&(this.endDate=t(e)),this.timePicker||(this.endDate=this.endDate.add(1,"d").startOf("day").subtract(1,"second")),this.timePicker&&this.timePickerIncrement&&this.endDate.minute(Math.round(this.endDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.endDate.isBefore(this.startDate)&&(this.endDate=this.startDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),this.maxSpan&&this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)&&(this.endDate=this.startDate.clone().add(this.maxSpan)),this.previousRightTime=this.endDate.clone(),this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.isShowing||this.updateElement(),this.updateMonthsInView()},isInvalidDate:function(){return!1},isCustomDate:function(){return!1},updateView:function(){this.timePicker&&(this.renderTimePicker("left"),this.renderTimePicker("right"),this.endDate?this.container.find(".right .calendar-time select").removeAttr("disabled").removeClass("disabled"):this.container.find(".right .calendar-time select").attr("disabled","disabled").addClass("disabled")),this.endDate&&this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.updateMonthsInView(),this.updateCalendars(),this.updateFormInputs()},updateMonthsInView:function(){if(this.endDate){if(!this.singleDatePicker&&this.leftCalendar.month&&this.rightCalendar.month&&(this.startDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.startDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM"))&&(this.endDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.endDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM")))return;this.leftCalendar.month=this.startDate.clone().date(2),this.linkedCalendars||this.endDate.month()==this.startDate.month()&&this.endDate.year()==this.startDate.year()?this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"):this.rightCalendar.month=this.endDate.clone().date(2)}else this.leftCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&this.rightCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&(this.leftCalendar.month=this.startDate.clone().date(2),this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"));this.maxDate&&this.linkedCalendars&&!this.singleDatePicker&&this.rightCalendar.month>this.maxDate&&(this.rightCalendar.month=this.maxDate.clone().date(2),this.leftCalendar.month=this.maxDate.clone().date(2).subtract(1,"month"))},updateCalendars:function(){if(this.timePicker){var t,e,a,i;if(this.endDate){if(t=parseInt(this.container.find(".left .hourselect").val(),10),e=parseInt(this.container.find(".left .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".left .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0)}else if(t=parseInt(this.container.find(".right .hourselect").val(),10),e=parseInt(this.container.find(".right .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".right .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0);this.leftCalendar.month.hour(t).minute(e).second(a),this.rightCalendar.month.hour(t).minute(e).second(a)}this.renderCalendar("left"),this.renderCalendar("right"),this.container.find(".ranges li").removeClass("active"),null!=this.endDate&&(this.element.trigger("updateCalendar.daterangepicker",this),this.calculateChosenLabel())},renderCalendar:function(a){var i,s=(i="left"==a?this.leftCalendar:this.rightCalendar).month.month(),n=i.month.year(),r=i.month.hour(),o=i.month.minute(),h=i.month.second(),l=t([n,s]).daysInMonth(),c=t([n,s,1]),d=t([n,s,l]),m=t(c).subtract(1,"month").month(),f=t(c).subtract(1,"month").year(),p=t([f,m]).daysInMonth(),u=c.day();(i=[]).firstDay=c,i.lastDay=d;for(var D=0;D<6;D++)i[D]=[];var g=p-u+this.locale.firstDay+1;g>p&&(g-=7),u==this.locale.firstDay&&(g=p-6);for(var k=t([f,m,g,12,o,h]),y=(D=0,0),b=0;D<42;D++,y++,k=t(k).add(24,"hour"))D>0&&y%7==0&&(y=0,b++),i[b][y]=k.clone().hour(r).minute(o).second(h),k.hour(12),this.minDate&&i[b][y].format("YYYY-MM-DD")==this.minDate.format("YYYY-MM-DD")&&i[b][y].isBefore(this.minDate)&&"left"==a&&(i[b][y]=this.minDate.clone()),this.maxDate&&i[b][y].format("YYYY-MM-DD")==this.maxDate.format("YYYY-MM-DD")&&i[b][y].isAfter(this.maxDate)&&"right"==a&&(i[b][y]=this.maxDate.clone());"left"==a?this.leftCalendar.calendar=i:this.rightCalendar.calendar=i;var C="left"==a?this.minDate:this.startDate,v=this.maxDate,Y=("left"==a?this.startDate:this.endDate,this.locale.direction,'');Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=""),C&&!C.isBefore(i.firstDay)||this.linkedCalendars&&"left"!=a?Y+="":Y+='';var w=this.locale.monthNames[i[1][1].month()]+i[1][1].format(" YYYY");if(this.showDropdowns){for(var P=i[1][1].month(),x=i[1][1].year(),M=v&&v.year()||this.maxYear,S=C&&C.year()||this.minYear,I=x==S,B=x==M,A='";for(var E='")}if(Y+='",v&&!v.isAfter(i.lastDay)||this.linkedCalendars&&"right"!=a&&!this.singleDatePicker?Y+="":Y+='',Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+='"),e.each(this.locale.daysOfWeek,function(t,e){Y+=""}),Y+="",Y+="",Y+="",null==this.endDate&&this.maxSpan){var O=this.startDate.clone().add(this.maxSpan).endOf("day");v&&!O.isBefore(v)||(v=O)}for(b=0;b<6;b++){Y+="",this.showWeekNumbers?Y+='":this.showISOWeekNumbers&&(Y+='");for(y=0;y<7;y++){var N=[];i[b][y].isSame(new Date,"day")&&N.push("today"),i[b][y].isoWeekday()>5&&N.push("weekend"),i[b][y].month()!=i[1][1].month()&&N.push("off"),this.minDate&&i[b][y].isBefore(this.minDate,"day")&&N.push("off","disabled"),v&&i[b][y].isAfter(v,"day")&&N.push("off","disabled"),this.isInvalidDate(i[b][y])&&N.push("off","disabled"),i[b][y].format("YYYY-MM-DD")==this.startDate.format("YYYY-MM-DD")&&N.push("active","start-date"),null!=this.endDate&&i[b][y].format("YYYY-MM-DD")==this.endDate.format("YYYY-MM-DD")&&N.push("active","end-date"),null!=this.endDate&&i[b][y]>this.startDate&&i[b][y]'+i[b][y].date()+""}Y+=""}Y+="",Y+="
'+w+"
'+this.locale.weekLabel+""+e+"
'+i[b][0].week()+"'+i[b][0].isoWeek()+"
",this.container.find(".drp-calendar."+a+" .calendar-table").html(Y)},renderTimePicker:function(t){if("right"!=t||this.endDate){var e,a,i,s=this.maxDate;if(!this.maxSpan||this.maxDate&&!this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate)||(s=this.startDate.clone().add(this.maxSpan)),"left"==t)a=this.startDate.clone(),i=this.minDate;else if("right"==t){a=this.endDate.clone(),i=this.startDate;var n=this.container.find(".drp-calendar.right .calendar-time");if(""!=n.html()&&(a.hour(a.hour()||n.find(".hourselect option:selected").val()),a.minute(a.minute()||n.find(".minuteselect option:selected").val()),a.second(a.second()||n.find(".secondselect option:selected").val()),!this.timePicker24Hour)){var r=n.find(".ampmselect option:selected").val();"PM"===r&&a.hour()<12&&a.hour(a.hour()+12),"AM"===r&&12===a.hour()&&a.hour(0)}a.isBefore(this.startDate)&&(a=this.startDate.clone()),s&&a.isAfter(s)&&(a=s.clone())}e=' ",e+=': ",this.timePickerSeconds){e+=': "}if(!this.timePicker24Hour){e+='"}this.container.find(".drp-calendar."+t+" .calendar-time").html(e)}},updateFormInputs:function(){this.singleDatePicker||this.endDate&&(this.startDate.isBefore(this.endDate)||this.startDate.isSame(this.endDate))?this.container.find("button.applyBtn").removeAttr("disabled"):this.container.find("button.applyBtn").attr("disabled","disabled")},move:function(){var t,a={top:0,left:0},i=e(window).width();this.parentEl.is("body")||(a={top:this.parentEl.offset().top-this.parentEl.scrollTop(),left:this.parentEl.offset().left-this.parentEl.scrollLeft()},i=this.parentEl[0].clientWidth+this.parentEl.offset().left),t="up"==this.drops?this.element.offset().top-this.container.outerHeight()-a.top:this.element.offset().top+this.element.outerHeight()-a.top,this.container["up"==this.drops?"addClass":"removeClass"]("drop-up"),"left"==this.opens?(this.container.css({top:t,right:i-this.element.offset().left-this.element.outerWidth(),left:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):"center"==this.opens?(this.container.css({top:t,left:this.element.offset().left-a.left+this.element.outerWidth()/2-this.container.outerWidth()/2,right:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):(this.container.css({top:t,left:this.element.offset().left-a.left,right:"auto"}),this.container.offset().left+this.container.outerWidth()>e(window).width()&&this.container.css({left:"auto",right:0}))},show:function(t){this.isShowing||(this._outsideClickProxy=e.proxy(function(t){this.outsideClick(t)},this),e(document).on("mousedown.daterangepicker",this._outsideClickProxy).on("touchend.daterangepicker",this._outsideClickProxy).on("click.daterangepicker","[data-toggle=dropdown]",this._outsideClickProxy).on("focusin.daterangepicker",this._outsideClickProxy),e(window).on("resize.daterangepicker",e.proxy(function(t){this.move(t)},this)),this.oldStartDate=this.startDate.clone(),this.oldEndDate=this.endDate.clone(),this.previousRightTime=this.endDate.clone(),this.updateView(),this.container.show(),this.move(),this.element.trigger("show.daterangepicker",this),this.isShowing=!0)},hide:function(t){this.isShowing&&(this.endDate||(this.startDate=this.oldStartDate.clone(),this.endDate=this.oldEndDate.clone()),this.startDate.isSame(this.oldStartDate)&&this.endDate.isSame(this.oldEndDate)||this.callback(this.startDate.clone(),this.endDate.clone(),this.chosenLabel),this.updateElement(),e(document).off(".daterangepicker"),e(window).off(".daterangepicker"),this.container.hide(),this.element.trigger("hide.daterangepicker",this),this.isShowing=!1)},toggle:function(t){this.isShowing?this.hide():this.show()},outsideClick:function(t){var a=e(t.target);"focusin"==t.type||a.closest(this.element).length||a.closest(this.container).length||a.closest(".calendar-table").length||a.hasClass("select2-search__field")||a.hasClass("select2-results__option")||(this.hide(),this.element.trigger("outsideClick.daterangepicker",this))},showCalendars:function(){this.container.addClass("show-calendar"),this.move(),this.element.trigger("showCalendar.daterangepicker",this)},hideCalendars:function(){this.container.removeClass("show-calendar"),this.element.trigger("hideCalendar.daterangepicker",this)},clickRange:function(t){var e=t.target.getAttribute("data-range-key");if(this.chosenLabel=e,e==this.locale.customRangeLabel)this.showCalendars();else{var a=this.ranges[e];this.startDate=a[0],this.endDate=a[1],this.timePicker||(this.startDate.startOf("day"),this.endDate.endOf("day")),this.alwaysShowCalendars||this.hideCalendars(),this.clickApply()}},clickPrev:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?(this.leftCalendar.month.subtract(1,"month"),this.linkedCalendars&&this.rightCalendar.month.subtract(1,"month")):this.rightCalendar.month.subtract(1,"month"),this.updateCalendars(),this.element.trigger("prev.daterangepicker",this)},clickNext:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.month.add(1,"month"):(this.rightCalendar.month.add(1,"month"),this.linkedCalendars&&this.leftCalendar.month.add(1,"month")),this.updateCalendars(),this.element.trigger("next.daterangepicker",this)},hoverDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s],r=this.leftCalendar,o=this.rightCalendar,h=this.startDate;this.endDate||this.container.find(".drp-calendar tbody td").each(function(t,a){if(!e(a).hasClass("week")){var i=e(a).attr("data-title"),s=i.substr(1,1),l=i.substr(3,1),c=e(a).parents(".drp-calendar").hasClass("left")?r.calendar[s][l]:o.calendar[s][l];c.isAfter(h)&&c.isBefore(n)||c.isSame(n,"day")?e(a).addClass("in-range"):e(a).removeClass("in-range")}})}},clickDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s];if(this.endDate||n.isBefore(this.startDate,"day")){if(this.timePicker){var r=parseInt(this.container.find(".left .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".left .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);var o=parseInt(this.container.find(".left .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.endDate=null,this.setStartDate(n.clone())}else if(!this.endDate&&n.isBefore(this.startDate))this.setEndDate(this.startDate.clone());else{if(this.timePicker){var l;r=parseInt(this.container.find(".right .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".right .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);o=parseInt(this.container.find(".right .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.setEndDate(n.clone()),this.autoApply&&(this.calculateChosenLabel(),this.clickApply())}this.singleDatePicker&&(this.setEndDate(this.startDate),this.timePicker||this.clickApply()),this.updateView(),this.element.trigger("selectDate.daterangepicker",this),t.stopPropagation()}},calculateChosenLabel:function(){var t=!0,e=0;for(var a in this.ranges){if(this.timePicker){var i=this.timePickerSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm";if(this.startDate.format(i)==this.ranges[a][0].format(i)&&this.endDate.format(i)==this.ranges[a][1].format(i)){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}}else if(this.startDate.format("YYYY-MM-DD")==this.ranges[a][0].format("YYYY-MM-DD")&&this.endDate.format("YYYY-MM-DD")==this.ranges[a][1].format("YYYY-MM-DD")){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}e++}t&&(this.showCustomRangeLabel?this.chosenLabel=this.container.find(".ranges li:last").addClass("active").attr("data-range-key"):this.chosenLabel=null,this.showCalendars())},clickApply:function(t){this.hide(),this.element.trigger("apply.daterangepicker",this)},clickCancel:function(t){this.startDate=this.oldStartDate,this.endDate=this.oldEndDate,this.hide(),this.element.trigger("cancel.daterangepicker",this)},monthOrYearChanged:function(t){var a=e(t.target).closest(".drp-calendar").hasClass("left"),i=a?"left":"right",s=this.container.find(".drp-calendar."+i),n=parseInt(s.find(".monthselect").val(),10),r=s.find(".yearselect").val();a||(rthis.maxDate.year()||r==this.maxDate.year()&&n>this.maxDate.month())&&(n=this.maxDate.month(),r=this.maxDate.year()),a?(this.leftCalendar.month.month(n).year(r),this.linkedCalendars&&(this.rightCalendar.month=this.leftCalendar.month.clone().add(1,"month"))):(this.rightCalendar.month.month(n).year(r),this.linkedCalendars&&(this.leftCalendar.month=this.rightCalendar.month.clone().subtract(1,"month"))),this.updateCalendars()},timeChanged:function(t){var a=e(t.target).closest(".drp-calendar"),i=a.hasClass("left"),s=parseInt(a.find(".hourselect").val(),10),n=parseInt(a.find(".minuteselect").val(),10),r=this.timePickerSeconds?parseInt(a.find(".secondselect").val(),10):0;if(!this.timePicker24Hour){var o=a.find(".ampmselect").val();"PM"===o&&s<12&&(s+=12),"AM"===o&&12===s&&(s=0)}if(i){var h=this.startDate.clone();h.hour(s),h.minute(n),this.setStartDate(h),this.singleDatePicker?this.endDate=this.startDate.clone():this.endDate&&this.endDate.format("YYYY-MM-DD")==h.format("YYYY-MM-DD")&&this.endDate.isBefore(h)&&this.setEndDate(h.clone())}else if(this.endDate){var l=this.endDate.clone();l.hour(s),l.minute(n),l.second(r),this.setEndDate(l)}this.updateCalendars(),this.updateFormInputs(),this.renderTimePicker("left"),this.renderTimePicker("right"),this.element.trigger("timeChanged.daterangepicker",this)},elementChanged:function(){if(this.element.is("input")&&this.element.val().length){var e=this.element.val().split(this.locale.separator),a=null,i=null;2===e.length&&(a=t(e[0],this.locale.format),i=t(e[1],this.locale.format)),(this.singleDatePicker||null===a||null===i)&&(i=a=t(this.element.val(),this.locale.format)),a.isValid()&&i.isValid()&&(this.setStartDate(a),this.setEndDate(i),this.updateView())}},keydown:function(t){9!==t.keyCode&&13!==t.keyCode||this.hide(),27===t.keyCode&&(t.preventDefault(),t.stopPropagation(),this.hide())},updateElement:function(){if(this.element.is("input")&&this.autoUpdateInput){var t=this.startDate.format(this.locale.format);this.singleDatePicker||(t+=this.locale.separator+this.endDate.format(this.locale.format)),t!==this.element.val()&&this.element.val(t).trigger("change")}},remove:function(){this.container.remove(),this.element.off(".daterangepicker"),this.element.removeData()}},e.fn.daterangepicker=function(t,i){var s=e.extend(!0,{},e.fn.daterangepicker.defaultOptions,t);return this.each(function(){var t=e(this);t.data("daterangepicker")&&t.data("daterangepicker").remove(),t.data("daterangepicker",new a(t,s,i))}),this},a}); \ No newline at end of file From 8dc58bd6f68f02035db1afc5cc7b20cc752995ff Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 18 Dec 2018 16:09:27 +0800 Subject: [PATCH 066/247] Mobile and Tablet support --- .../client/combobox/js/options/Data.java | 12 +++++++ .../inputmask/base/DateInputParser.java | 1 - .../client/daterange/DateRangePicker.java | 33 +++++++++++++++++++ .../css/daterangepicker-materialize.css | 11 ++++++- .../css/daterangepicker-materialize.min.css | 2 +- 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/js/options/Data.java b/src/main/java/gwt/material/design/addins/client/combobox/js/options/Data.java index 04636faf5..9101addbc 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/js/options/Data.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/js/options/Data.java @@ -19,13 +19,25 @@ */ package gwt.material.design.addins.client.combobox.js.options; +import gwt.material.design.jscore.client.api.core.Element; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; +import java.util.List; + @JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) public class Data { + @JsProperty + public int id; + + @JsProperty + public Element element; + + @JsProperty + public boolean selected; + @JsProperty public String text; } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java index b8e13cbce..e634cf8b0 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java @@ -36,7 +36,6 @@ public DateInputParser(T valuebox) { public Date parseDate(String format) { if (isValid(format)) { valuebox.clearStatusText(); - MaterialToast.fireToast(format); return DateTimeFormat.getFormat(format).parse(valuebox.getText()); } return null; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 6227bb134..390f29f1b 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -28,6 +28,8 @@ import gwt.material.design.addins.client.combobox.MaterialComboBoxDebugClientBundle; import gwt.material.design.addins.client.combobox.js.JsComboBox; import gwt.material.design.addins.client.combobox.js.JsComboBoxOptions; +import gwt.material.design.addins.client.combobox.js.options.Data; +import gwt.material.design.addins.client.combobox.js.options.Params; import gwt.material.design.addins.client.moment.resources.MomentClientBundle; import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; import gwt.material.design.client.MaterialDesignBase; @@ -38,6 +40,7 @@ import gwt.material.design.client.constants.*; import gwt.material.design.client.ui.MaterialIcon; import gwt.material.design.client.ui.MaterialLabel; +import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.daterange.constants.DateRangeElementSelector; @@ -194,6 +197,36 @@ protected void toggleTypeAssistSelector(String... selectors) { JQueryElement parent = JsComboBox.$(getElement()); JsComboBox selectElement = JsComboBox.$(selector); JsComboBoxOptions option = JsComboBoxOptions.create(); + + if (selector.equals(DateRangeElementSelector.MONTH_SELECT)) { + Functions.FuncRet2 customMonthMatcher = (params, data) -> { + // If there are no search terms, return all of the data + if (params == null || params.term == null) { + return data; + } + + // Do not display the item if there is no 'text' property + if (data.text == null) { + return null; + } + + // Will do an advance month searching using index + Integer i = null; + try { + i = Integer.parseInt(params.term); + } catch (NumberFormatException e) { + // Do nothing + } + + if (data.text.toLowerCase().contains(params.term.toLowerCase()) || (i != null && data.id == i - 1)) { + return data; + } + + return null; + }; + option.matcher = customMonthMatcher; + } + option.dropdownParent = parent; selectElement.select2(option); } diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index fc866d1c6..a95f19f03 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -193,7 +193,8 @@ button.cancelBtn:hover { } .daterangepicker .calendar-time { - background: #f7f5f5; + background: #fbfbfb; + border: 1px solid #e9e9e9; } /** Mobile Queries **/ @@ -324,3 +325,11 @@ button.cancelBtn:hover { padding-right: 5%; } } + +/** Tablet Queries **/ +@media screen and (min-width: 600px) and (max-width: 900px) { + .daterangepicker .drp-calendar.left, + .daterangepicker .drp-calendar.right { + padding: 12px; + } +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index fcd6f369b..d0cb849b0 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1 +1 @@ -.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table th,.daterangepicker .calendar-table td{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.in-range,.daterangepicker td.available.in-range:hover:not(.active){background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:white}.daterangepicker td.available:hover:after{content:" ";background:transparent;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:white;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:none;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#f7f5f5}@media screen and (max-width:600px){.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0px!important;left:0px!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:10%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}.daterangepicker .ranges{position:fixed;background:#fff;z-index:999;bottom:0;margin:8px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin-left:5%}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}.daterangepicker:not(.single) .drp-buttons{padding-right:5%}} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table th,.daterangepicker .calendar-table td{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.in-range,.daterangepicker td.available.in-range:hover:not(.active){background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:white}.daterangepicker td.available:hover:after{content:" ";background:transparent;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:white;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:none;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}@media screen and (max-width:600px){.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0px!important;left:0px!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:10%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}.daterangepicker .ranges{position:fixed;background:#fff;z-index:999;bottom:0;margin:8px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin-left:5%}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}.daterangepicker:not(.single) .drp-buttons{padding-right:5%}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}} \ No newline at end of file From b8c7cbf97824d462deb841a5d514561599ba1893 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 30 Dec 2018 05:50:18 +0800 Subject: [PATCH 067/247] Standardization for DateRangePicker --- .../design/addins/client/moment/Moment.java | 4 +- .../client/moment/option/CalendarFormat.java | 19 +++ .../client/moment/option/CreationData.java | 19 +++ .../addins/client/moment/option/Duration.java | 19 +++ .../client/daterange/DateRangePicker.java | 110 +++++++++++------- .../constants/DateRangeElementSelector.java | 19 +++ .../daterange/js/HasDateRangeOptions.java | 4 +- .../client/daterange/js/RangeBuilder.java | 19 +++ .../css/daterangepicker-materialize.css | 63 ++++++++-- .../css/daterangepicker-materialize.min.css | 2 +- 10 files changed, 223 insertions(+), 55 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/moment/Moment.java b/src/main/java/gwt/material/design/addins/client/moment/Moment.java index b670c91f2..b47e80166 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/Moment.java +++ b/src/main/java/gwt/material/design/addins/client/moment/Moment.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java b/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java index 448115e47..8e71ce572 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java +++ b/src/main/java/gwt/material/design/addins/client/moment/option/CalendarFormat.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.moment.option; import jsinterop.annotations.JsPackage; diff --git a/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java b/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java index 19325abc9..c093d173c 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java +++ b/src/main/java/gwt/material/design/addins/client/moment/option/CreationData.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.moment.option; import jsinterop.annotations.JsPackage; diff --git a/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java b/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java index 5c8bb4594..8557926f6 100644 --- a/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java +++ b/src/main/java/gwt/material/design/addins/client/moment/option/Duration.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.moment.option; import com.google.gwt.core.client.JavaScriptObject; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 390f29f1b..c146ada7e 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -35,12 +35,14 @@ import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.*; import gwt.material.design.client.base.mixin.FieldTypeMixin; +import gwt.material.design.client.base.mixin.NativeBrowserStyleMixin; import gwt.material.design.client.base.mixin.ReadOnlyMixin; import gwt.material.design.client.base.mixin.StatusTextMixin; +import gwt.material.design.client.base.viewport.Resolution; import gwt.material.design.client.constants.*; +import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialIcon; import gwt.material.design.client.ui.MaterialLabel; -import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.daterange.constants.DateRangeElementSelector; @@ -48,7 +50,6 @@ import gwt.material.design.incubator.client.daterange.events.SelectionEvent; import gwt.material.design.incubator.client.daterange.js.*; import gwt.material.design.jquery.client.api.Functions; -import gwt.material.design.jquery.client.api.JQuery; import gwt.material.design.jquery.client.api.JQueryElement; import java.util.Date; @@ -57,7 +58,7 @@ public class DateRangePicker extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, - HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder { + HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder, HasNativeBrowserStyle { static { if (AddinsIncubator.isDebug()) { @@ -76,18 +77,20 @@ public class DateRangePicker extends AbstractValueWidget implements HasD } private static final String DATE_RANGE_STYLENAME = "date-range-picker"; - private FieldTypeMixin fieldTypeMixin; private TextBox dateInput = new TextBox(); private Label label = new Label(); private MaterialLabel errorLabel = new MaterialLabel(); private MaterialIcon icon = new MaterialIcon(); private DateRangeOptions options = new DateRangeOptions(); - private StatusTextMixin statusTextMixin; - private ReadOnlyMixin readOnlyMixin; private Date startDate; private Date endDate; private Date[] value; + private FieldTypeMixin fieldTypeMixin; + private StatusTextMixin statusTextMixin; + private ReadOnlyMixin readOnlyMixin; + private NativeBrowserStyleMixin nativeBrowserStyleMixin; + public DateRangePicker() { super(Document.get().createDivElement(), CssName.INPUT_FIELD, DATE_RANGE_STYLENAME); } @@ -133,6 +136,9 @@ protected void load() { }); getInputElement().on(DateRangeEvents.OPEN, (e, picker) -> { + if (Window.matchMedia(Resolution.ALL_MOBILE.asMediaQuery()) || Window.matchMedia(Resolution.TABLET.asMediaQuery())) { + JsComboBox.$(dateInput.getElement()).blur(); + } OpenEvent.fire(this, picker); return true; }); @@ -194,49 +200,54 @@ protected void toggleTimePickerTypeAssist() { protected void toggleTypeAssistSelector(String... selectors) { for (String selector : selectors) { - JQueryElement parent = JsComboBox.$(getElement()); JsComboBox selectElement = JsComboBox.$(selector); - JsComboBoxOptions option = JsComboBoxOptions.create(); - - if (selector.equals(DateRangeElementSelector.MONTH_SELECT)) { - Functions.FuncRet2 customMonthMatcher = (params, data) -> { - // If there are no search terms, return all of the data - if (params == null || params.term == null) { - return data; - } - - // Do not display the item if there is no 'text' property - if (data.text == null) { - return null; - } - - // Will do an advance month searching using index - Integer i = null; - try { - i = Integer.parseInt(params.term); - } catch (NumberFormatException e) { - // Do nothing - } - - if (data.text.toLowerCase().contains(params.term.toLowerCase()) || (i != null && data.id == i - 1)) { - return data; - } - - return null; - }; - option.matcher = customMonthMatcher; + if (!isNativeBrowserStyle()) { + JQueryElement parent = JsComboBox.$(getElement()); + JsComboBoxOptions option = JsComboBoxOptions.create(); + if (selector.equals(DateRangeElementSelector.MONTH_SELECT)) { + option.matcher = getDefaultMonthMatcher(); + } + option.dropdownParent = parent; + selectElement.select2(option); + selectElement.removeClass(CssName.BROWSER_DEFAULT); + } else { + selectElement.addClass(CssName.BROWSER_DEFAULT); } - - option.dropdownParent = parent; - selectElement.select2(option); } } + protected Functions.FuncRet2 getDefaultMonthMatcher() { + return (params, data) -> { + // If there are no search terms, return all of the data + if (params == null || params.term == null) { + return data; + } + + // Do not display the item if there is no 'text' property + if (data.text == null) { + return null; + } + + // Will do an advance month searching using index + Integer i = null; + try { + i = Integer.parseInt(params.term); + } catch (NumberFormatException e) { + // Do nothing + } + + if (data.text.toLowerCase().contains(params.term.toLowerCase()) || (i != null && data.id == i - 1)) { + return data; + } + return null; + }; + } + @Override protected void onUnload() { - super.onUnload(); - unload(); + + super.onUnload(); } protected void unload() { @@ -563,6 +574,16 @@ public void setPlaceholder(String placeholder) { label.setText(placeholder); } + @Override + public void setNativeBrowserStyle(boolean nativeBrowserStyle) { + getNativeBrowserStyleMixin().setNativeBrowserStyle(nativeBrowserStyle); + } + + @Override + public boolean isNativeBrowserStyle() { + return getNativeBrowserStyleMixin().isNativeBrowserStyle(); + } + @Override public HandlerRegistration addOpenCalendarHandler(OpenCalendarEvent.OpenCalendarEventHandler handler) { return addHandler(handler, OpenCalendarEvent.getType()); @@ -634,4 +655,11 @@ protected ReadOnlyMixin getReadOnlyMixin() { } return readOnlyMixin; } + + protected NativeBrowserStyleMixin getNativeBrowserStyleMixin() { + if (nativeBrowserStyleMixin == null) { + nativeBrowserStyleMixin = new NativeBrowserStyleMixin<>(this); + } + return nativeBrowserStyleMixin; + } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java b/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java index f527eee85..3e1161943 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/constants/DateRangeElementSelector.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.constants; public interface DateRangeElementSelector { diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index bbb03a0b8..ac439d41d 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java index 4c6638ff9..bc9be3be2 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeBuilder.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange.js; public class RangeBuilder { diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index a95f19f03..869db6278 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -185,9 +185,12 @@ button.cancelBtn:hover { .daterangepicker .ranges li { padding-top: 11px; padding-bottom: 11px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -/** Time Pickerr **/ +/** Time Picker **/ .daterangepicker .calendar-time .select2 { width: 60px !important; } @@ -197,6 +200,18 @@ button.cancelBtn:hover { border: 1px solid #e9e9e9; } +/** Native Browser Style **/ +.daterangepicker select.browser-default { + height: unset; + background-color: unset; + display: inline-block; + color: rgba(0,0,0,0.8); +} + +.daterangepicker .calendar-table select.browser-default { + width: 40%; +} + /** Mobile Queries **/ @media screen and (max-width: 600px) { .daterangepicker:not(.single) .drp-selected { @@ -238,7 +253,8 @@ button.cancelBtn:hover { bottom: 0; width: 100%; background: #fafafa; - padding-right: 10%; + padding-right: 5%; + display: block; } .daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1), @@ -297,18 +313,51 @@ button.cancelBtn:hover { /** Range Definitions **/ .daterangepicker .ranges { position: fixed; - background: #fff; z-index: 999; bottom: 0; - margin: 8px; + margin: 8px 8px 8px 5%; + max-width: 160px; + } + + .daterangepicker .ranges ul:before { + content: ""; + position: absolute; + right: 0px; + bottom: 12px; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 12px 12px; + border-color: transparent transparent #9c9c9c; + } + + .daterangepicker .ranges:hover { box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); - margin-left: 5%; + background: #fff; + max-width: calc(100% - 52px); + } + + .daterangepicker .ranges li:hover { + background-color: #ffffff; + } + + .daterangepicker .ranges li.active { + background-color: transparent; + color: rgba(0, 0, 0, 0.6); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } .daterangepicker .ranges:hover ul li { display: block !important; } + .daterangepicker .ranges:hover ul li.active { + background: #42a5f5 !important; + color: #ffffff; + } + .daterangepicker .ranges ul li { padding-left: 20px; padding-right: 20px; @@ -320,10 +369,6 @@ button.cancelBtn:hover { text-transform: uppercase; font-weight: bold; } - - .daterangepicker:not(.single) .drp-buttons { - padding-right: 5%; - } } /** Tablet Queries **/ diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index d0cb849b0..81b2f6afd 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1 +1 @@ -.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table th,.daterangepicker .calendar-table td{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.in-range,.daterangepicker td.available.in-range:hover:not(.active){background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:white}.daterangepicker td.available:hover:after{content:" ";background:transparent;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:white;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:none;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}@media screen and (max-width:600px){.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0px!important;left:0px!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:10%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}.daterangepicker .ranges{position:fixed;background:#fff;z-index:999;bottom:0;margin:8px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin-left:5%}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}.daterangepicker:not(.single) .drp-buttons{padding-right:5%}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:#fff}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:before:not(.single),.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:12px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%;display:block}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}} \ No newline at end of file From bd58b8d0195d5d72d167ff9c543161176599a9b0 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 1 Jan 2019 15:12:40 +0800 Subject: [PATCH 068/247] Tablet Support --- .../incubator/client/daterange/DateRangePicker.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index c146ada7e..b9530b325 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -39,6 +39,7 @@ import gwt.material.design.client.base.mixin.ReadOnlyMixin; import gwt.material.design.client.base.mixin.StatusTextMixin; import gwt.material.design.client.base.viewport.Resolution; +import gwt.material.design.client.base.viewport.ViewPort; import gwt.material.design.client.constants.*; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialIcon; @@ -108,6 +109,17 @@ protected void load() { add(label); add(errorLabel); + ViewPort.when(Resolution.TABLET).then(param1 -> { + if (options.ranges != null) { + setDropdownAlignment(DropdownAlignment.CENTER); + } else { + setDropdownAlignment(DropdownAlignment.RIGHT); + } + }, viewPort -> { + setDropdownAlignment(DropdownAlignment.RIGHT); + return false; + }); + getInputElement().daterangepicker(options, (startDate, endDate) -> { setValue(new Date[]{new Date(startDate.format()), new Date(endDate.format())}, true); }); From 1086357110bdc51eb91dac63e748f371b70d3d82 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 7 Jan 2019 07:10:40 +0800 Subject: [PATCH 069/247] Smart Positioning on daterangepicker. --- .../client/daterange/DateRangePicker.java | 70 +++++++++-- .../daterange/js/HasDateRangeOptions.java | 35 ++++++ .../client/daterange/js/JsDateRange.java | 3 + .../daterange/js/JsDateRangeMethod.java | 113 ++++++++++++++++++ .../css/daterangepicker-materialize.css | 34 ++++-- .../css/daterangepicker-materialize.min.css | 2 +- .../daterange/resources/js/daterangepicker.js | 17 ++- .../resources/js/daterangepicker.min.js | 2 +- 8 files changed, 250 insertions(+), 26 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index b9530b325..0546cb7c0 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -34,12 +34,12 @@ import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.*; +import gwt.material.design.client.base.helper.ScrollHelper; import gwt.material.design.client.base.mixin.FieldTypeMixin; import gwt.material.design.client.base.mixin.NativeBrowserStyleMixin; import gwt.material.design.client.base.mixin.ReadOnlyMixin; import gwt.material.design.client.base.mixin.StatusTextMixin; import gwt.material.design.client.base.viewport.Resolution; -import gwt.material.design.client.base.viewport.ViewPort; import gwt.material.design.client.constants.*; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialIcon; @@ -51,6 +51,7 @@ import gwt.material.design.incubator.client.daterange.events.SelectionEvent; import gwt.material.design.incubator.client.daterange.js.*; import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jquery.client.api.JQuery; import gwt.material.design.jquery.client.api.JQueryElement; import java.util.Date; @@ -78,6 +79,7 @@ public class DateRangePicker extends AbstractValueWidget implements HasD } private static final String DATE_RANGE_STYLENAME = "date-range-picker"; + private ScrollHelper scrollHelper = new ScrollHelper(); private TextBox dateInput = new TextBox(); private Label label = new Label(); private MaterialLabel errorLabel = new MaterialLabel(); @@ -109,17 +111,6 @@ protected void load() { add(label); add(errorLabel); - ViewPort.when(Resolution.TABLET).then(param1 -> { - if (options.ranges != null) { - setDropdownAlignment(DropdownAlignment.CENTER); - } else { - setDropdownAlignment(DropdownAlignment.RIGHT); - } - }, viewPort -> { - setDropdownAlignment(DropdownAlignment.RIGHT); - return false; - }); - getInputElement().daterangepicker(options, (startDate, endDate) -> { setValue(new Date[]{new Date(startDate.format()), new Date(endDate.format())}, true); }); @@ -149,9 +140,10 @@ protected void load() { getInputElement().on(DateRangeEvents.OPEN, (e, picker) -> { if (Window.matchMedia(Resolution.ALL_MOBILE.asMediaQuery()) || Window.matchMedia(Resolution.TABLET.asMediaQuery())) { - JsComboBox.$(dateInput.getElement()).blur(); + JQuery.$(dateInput.getElement()).blur(); } OpenEvent.fire(this, picker); + detectPosition(); return true; }); @@ -185,9 +177,23 @@ protected void load() { return true; }); + getHandlerRegistry().registerHandler(Window.addResizeHandler(event -> detectPosition())); + setId(DOM.createUniqueId()); } + protected void detectPosition() { + if (!isInVerticalViewPort()) { + getMethodProvider().setDrops(DropdownPosition.UP.getCssName()); + } else { + getMethodProvider().setDrops(DropdownPosition.DOWN.getCssName()); + } + } + + public boolean isInVerticalViewPort() { + return scrollHelper.isInViewPort(getElement(), 480); + } + protected void toggleTypeAssist() { if (options.showDropdowns) { toggleMonthYearTypeAssist(); @@ -283,6 +289,44 @@ public JsDateRange getInputElement() { return $(dateInput.getElement()); } + protected JsDateRangeMethod getMethodProvider() { + return getInputElement().data("daterangepicker"); + } + + @Override + public void open() { + open(true); + } + + public void open(boolean fireEvent) { + getMethodProvider().show(fireEvent); + } + + @Override + public void close() { + close(true); + } + + @Override + public void close(boolean fireEvent) { + getMethodProvider().hide(fireEvent); + } + + @Override + public void remove() { + getMethodProvider().remove(); + } + + @Override + public void nextCalendar() { + getMethodProvider().clickNext(); + } + + @Override + public void previousCalendar() { + getMethodProvider().clickPrev(); + } + @Override public void setStartDate(Date startDate) { options.setStartDate(startDate); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index ac439d41d..6123014d5 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -30,6 +30,41 @@ */ public interface HasDateRangeOptions { + /** + * Will open the Date Range Calendar Picker and fire {@link com.google.gwt.event.logical.shared.OpenEvent} + */ + void open(); + + /** + * Will open the Date Range Calendar Picker with provided parameter for firing an event or not. + */ + void open(boolean fireEvent); + + /** + * Will close the Date Range Calendar Picker and fire {@link com.google.gwt.event.logical.shared.CloseEvent} + */ + void close(); + + /** + * Will close the Date Range Calendar Picker with provided parameter for firing an event or not. + */ + void close(boolean fireEvent); + + /** + * Will remove the Date Range Calendar Picker + */ + void remove(); + + /** + * Will navigate to the next calendar + */ + void nextCalendar(); + + /** + * Will navigate to the previous calendar + */ + void previousCalendar(); + /** * The beginning date of the initially selected date range. If you provide a string, it must match the date format * string set in your locale setting. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java index f2fefc923..84a64b2c8 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRange.java @@ -56,6 +56,9 @@ public class JsDateRange extends DateRangeOptions { @JsMethod public native void daterangepicker(); + @JsMethod + public native JsDateRangeMethod data(String daterangepicker); + public native JsDateRange on(String event, Functions.EventFunc1 callback); public native JsDateRange off(String event); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java new file mode 100644 index 000000000..8516fe9b5 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java @@ -0,0 +1,113 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.js; + +import com.google.gwt.core.client.JsDate; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +import java.util.Date; + +/** + * Available internal methods for {@link gwt.material.design.incubator.client.daterange.DateRangePicker} + * + * @author kevzlou7979 + */ +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class JsDateRangeMethod { + + @JsMethod + public native void show(boolean fireEvent); + + @JsMethod + public native void hide(boolean fireEvent); + + @JsMethod + public native void toggle(); + + @JsMethod + public native void remove(); + + @JsMethod + public native void showCalendars(); + + @JsMethod + public native void hideCalendars(); + + @JsMethod + public native void clickPrev(); + + @JsMethod + public native void clickNext(); + + @JsMethod + public native void clickApply(); + + @JsMethod + public native void clickCancel(); + + @JsMethod + public native void setStartDate(JsDate date); + + @JsOverlay + public final void setStartDate(Date date) { + setStartDate(JsDate.create(date.getTime())); + } + + @JsMethod + public native void setEndDate(JsDate data); + + @JsOverlay + public final void setEndDate(Date date) { + setEndDate(JsDate.create(date.getTime())); + } + + @JsMethod + public native boolean isInvalidDate(); + + @JsMethod + public native boolean isCustomDate(); + + @JsMethod + public native void updateView(); + + @JsMethod + public native void updateMonthsInView(); + + @JsMethod + public native void updateCalendars(); + + @JsMethod + public native void renderCalendar(String side); + + @JsMethod + public native void renderTimePicker(String side); + + @JsMethod + public native void updateFormInputs(); + + @JsMethod + public native void move(); + + @JsMethod + public native void setDrops(String drops); +} diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index 869db6278..9cf8e38ce 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -45,6 +45,10 @@ height: 36px !important; } +.daterangepicker .calendar-table td { + border: unset; +} + .daterangepicker td.active, .daterangepicker td.active:hover, .daterangepicker td.in-range.active:not(.off) { @@ -65,7 +69,6 @@ .daterangepicker td.available:hover { position: relative; - background-color: white; } .daterangepicker td.available:hover:after { @@ -214,10 +217,6 @@ button.cancelBtn:hover { /** Mobile Queries **/ @media screen and (max-width: 600px) { - .daterangepicker:not(.single) .drp-selected { - display: none; - } - .daterangepicker:not(.single) { position: fixed; top: 0px !important; @@ -236,7 +235,6 @@ button.cancelBtn:hover { .daterangepicker:not(.single) .drp-calendar.left, .daterangepicker:not(.single) .drp-calendar.right { - display: block; margin: auto; float: none !important; padding: 0px 5%; @@ -254,7 +252,6 @@ button.cancelBtn:hover { width: 100%; background: #fafafa; padding-right: 5%; - display: block; } .daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1), @@ -309,8 +306,21 @@ button.cancelBtn:hover { height: 32px; color: transparent; } +} + +/** Mobile and Tablet Queries **/ +@media screen and (max-width: 900px){ + .daterangepicker:not(.single) .drp-calendar.left, + .daterangepicker:not(.single) .drp-calendar.right, + .daterangepicker:not(.single) .drp-buttons { + display: block; + } /** Range Definitions **/ + .daterangepicker:not(.single) .drp-selected { + display: none; + } + .daterangepicker .ranges { position: fixed; z-index: 999; @@ -331,6 +341,10 @@ button.cancelBtn:hover { border-color: transparent transparent #9c9c9c; } + .daterangepicker .ranges ul:hover:before { + display: none; + } + .daterangepicker .ranges:hover { box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); background: #fff; @@ -377,4 +391,10 @@ button.cancelBtn:hover { .daterangepicker .drp-calendar.right { padding: 12px; } + + .daterangepicker:not(.single) .ranges { + position: absolute; + left: 0; + margin-left: 0px; + } } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index 81b2f6afd..18abc4a0f 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1 +1 @@ -.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative;background-color:#fff}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:before:not(.single),.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block;margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:12px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%;display:block}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker .calendar-table td{border:unset}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:12px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}}@media screen and (max-width:900px){.daterangepicker:not(.single) .drp-buttons,.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block}.daterangepicker .ranges ul:hover:before,.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}.daterangepicker:not(.single) .ranges{position:absolute;left:0;margin-left:0}} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js index b8557d776..48c92156d 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.js @@ -1016,6 +1016,11 @@ }, + setDrops: function(drops) { + this.drops = drops; + this.move(); + }, + move: function() { var parentOffset = { top: 0, left: 0 }, containerTop; @@ -1074,7 +1079,7 @@ } }, - show: function(e) { + show: function(fireEvent) { if (this.isShowing) return; // Create a click proxy that is private to this instance of datepicker, for unbinding @@ -1100,11 +1105,13 @@ this.updateView(); this.container.show(); this.move(); - this.element.trigger('show.daterangepicker', this); + if (fireEvent) { + this.element.trigger('show.daterangepicker', this); + } this.isShowing = true; }, - hide: function(e) { + hide: function(fireEvent) { if (!this.isShowing) return; //incomplete date selection, revert to last values @@ -1123,7 +1130,9 @@ $(document).off('.daterangepicker'); $(window).off('.daterangepicker'); this.container.hide(); - this.element.trigger('hide.daterangepicker', this); + if (fireEvent) { + this.element.trigger('hide.daterangepicker', this); + } this.isShowing = false; }, diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js index 1bd06d16b..bc28e869d 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/js/daterangepicker.min.js @@ -1 +1 @@ -!function(t,e){if("function"==typeof define&&define.amd)define(["moment","jquery"],function(t,a){return a.fn||(a.fn={}),"function"!=typeof t&&t.default&&(t=t.default),e(t,a)});else if("object"==typeof module&&module.exports){var a="undefined"!=typeof window?window.jQuery:void 0;a||(a=require("jquery")).fn||(a.fn={});var i="undefined"!=typeof window&&void 0!==window.moment?window.moment:require("moment");module.exports=e(i,a)}else t.daterangepicker=e(t.moment,t.jQuery)}(this,function(t,e){var a=function(a,i,s){if(this.parentEl="body",this.element=e(a),this.startDate=t().startOf("day"),this.endDate=t().endOf("day"),this.minDate=!1,this.maxDate=!1,this.maxSpan=!1,this.autoApply=!1,this.singleDatePicker=!1,this.showDropdowns=!1,this.minYear=t().subtract(100,"year").format("YYYY"),this.maxYear=t().add(100,"year").format("YYYY"),this.showWeekNumbers=!1,this.showISOWeekNumbers=!1,this.showCustomRangeLabel=!0,this.timePicker=!1,this.timePicker24Hour=!1,this.timePickerIncrement=1,this.timePickerSeconds=!1,this.linkedCalendars=!0,this.autoUpdateInput=!0,this.alwaysShowCalendars=!1,this.ranges={},this.opens="right",this.element.hasClass("pull-right")&&(this.opens="left"),this.drops="down",this.element.hasClass("dropup")&&(this.drops="up"),this.buttonClasses="btn btn-sm",this.applyButtonClasses="btn-primary",this.cancelButtonClasses="btn-default",this.locale={direction:"ltr",format:t.localeData().longDateFormat("L"),separator:" - ",applyLabel:"Apply",cancelLabel:"Cancel",weekLabel:"W",customRangeLabel:"Custom Range",daysOfWeek:t.weekdaysMin(),monthNames:t.monthsShort(),firstDay:t.localeData().firstDayOfWeek()},this.callback=function(){},this.isShowing=!1,this.leftCalendar={},this.rightCalendar={},"object"==typeof i&&null!==i||(i={}),"string"==typeof(i=e.extend(this.element.data(),i)).template||i.template instanceof e||(i.template='
'),this.parentEl=i.parentEl&&e(i.parentEl).length?e(i.parentEl):e(this.parentEl),this.container=e(i.template).appendTo(this.parentEl),"object"==typeof i.locale&&("string"==typeof i.locale.direction&&(this.locale.direction=i.locale.direction),"string"==typeof i.locale.format&&(this.locale.format=i.locale.format),"string"==typeof i.locale.separator&&(this.locale.separator=i.locale.separator),"object"==typeof i.locale.daysOfWeek&&(this.locale.daysOfWeek=i.locale.daysOfWeek.slice()),"object"==typeof i.locale.monthNames&&(this.locale.monthNames=i.locale.monthNames.slice()),"number"==typeof i.locale.firstDay&&(this.locale.firstDay=i.locale.firstDay),"string"==typeof i.locale.applyLabel&&(this.locale.applyLabel=i.locale.applyLabel),"string"==typeof i.locale.cancelLabel&&(this.locale.cancelLabel=i.locale.cancelLabel),"string"==typeof i.locale.weekLabel&&(this.locale.weekLabel=i.locale.weekLabel),"string"==typeof i.locale.customRangeLabel)){(f=document.createElement("textarea")).innerHTML=i.locale.customRangeLabel;var n=f.value;this.locale.customRangeLabel=n}if(this.container.addClass(this.locale.direction),"string"==typeof i.startDate&&(this.startDate=t(i.startDate,this.locale.format)),"string"==typeof i.endDate&&(this.endDate=t(i.endDate,this.locale.format)),"string"==typeof i.minDate&&(this.minDate=t(i.minDate,this.locale.format)),"string"==typeof i.maxDate&&(this.maxDate=t(i.maxDate,this.locale.format)),"object"==typeof i.startDate&&(this.startDate=t(i.startDate)),"object"==typeof i.endDate&&(this.endDate=t(i.endDate)),"object"==typeof i.minDate&&(this.minDate=t(i.minDate)),"object"==typeof i.maxDate&&(this.maxDate=t(i.maxDate)),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),"string"==typeof i.applyButtonClasses&&(this.applyButtonClasses=i.applyButtonClasses),"string"==typeof i.applyClass&&(this.applyButtonClasses=i.applyClass),"string"==typeof i.cancelButtonClasses&&(this.cancelButtonClasses=i.cancelButtonClasses),"string"==typeof i.cancelClass&&(this.cancelButtonClasses=i.cancelClass),"object"==typeof i.maxSpan&&(this.maxSpan=i.maxSpan),"object"==typeof i.dateLimit&&(this.maxSpan=i.dateLimit),"string"==typeof i.opens&&(this.opens=i.opens),"string"==typeof i.drops&&(this.drops=i.drops),"boolean"==typeof i.showWeekNumbers&&(this.showWeekNumbers=i.showWeekNumbers),"boolean"==typeof i.showISOWeekNumbers&&(this.showISOWeekNumbers=i.showISOWeekNumbers),"string"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses),"object"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses.join(" ")),"boolean"==typeof i.showDropdowns&&(this.showDropdowns=i.showDropdowns),"number"==typeof i.minYear&&(this.minYear=i.minYear),"number"==typeof i.maxYear&&(this.maxYear=i.maxYear),"boolean"==typeof i.showCustomRangeLabel&&(this.showCustomRangeLabel=i.showCustomRangeLabel),"boolean"==typeof i.singleDatePicker&&(this.singleDatePicker=i.singleDatePicker,this.singleDatePicker&&(this.endDate=this.startDate.clone())),"boolean"==typeof i.timePicker&&(this.timePicker=i.timePicker),"boolean"==typeof i.timePickerSeconds&&(this.timePickerSeconds=i.timePickerSeconds),"number"==typeof i.timePickerIncrement&&(this.timePickerIncrement=i.timePickerIncrement),"boolean"==typeof i.timePicker24Hour&&(this.timePicker24Hour=i.timePicker24Hour),"boolean"==typeof i.autoApply&&(this.autoApply=i.autoApply),"boolean"==typeof i.autoUpdateInput&&(this.autoUpdateInput=i.autoUpdateInput),"boolean"==typeof i.linkedCalendars&&(this.linkedCalendars=i.linkedCalendars),"function"==typeof i.isInvalidDate&&(this.isInvalidDate=i.isInvalidDate),"function"==typeof i.isCustomDate&&(this.isCustomDate=i.isCustomDate),"boolean"==typeof i.alwaysShowCalendars&&(this.alwaysShowCalendars=i.alwaysShowCalendars),0!=this.locale.firstDay)for(var r=this.locale.firstDay;r>0;)this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),r--;var o,h,l;if(void 0===i.startDate&&void 0===i.endDate&&e(this.element).is(":text")){var c=e(this.element).val(),d=c.split(this.locale.separator);o=h=null,2==d.length?(o=t(d[0],this.locale.format),h=t(d[1],this.locale.format)):this.singleDatePicker&&""!==c&&(o=t(c,this.locale.format),h=t(c,this.locale.format)),null!==o&&null!==h&&(this.setStartDate(o),this.setEndDate(h))}if("object"==typeof i.ranges){for(l in i.ranges){o="string"==typeof i.ranges[l][0]?t(i.ranges[l][0],this.locale.format):t(i.ranges[l][0]),h="string"==typeof i.ranges[l][1]?t(i.ranges[l][1],this.locale.format):t(i.ranges[l][1]),this.minDate&&o.isBefore(this.minDate)&&(o=this.minDate.clone());var m=this.maxDate;if(this.maxSpan&&m&&o.clone().add(this.maxSpan).isAfter(m)&&(m=o.clone().add(this.maxSpan)),m&&h.isAfter(m)&&(h=m.clone()),!(this.minDate&&h.isBefore(this.minDate,this.timepicker?"minute":"day")||m&&o.isAfter(m,this.timepicker?"minute":"day"))){var f;(f=document.createElement("textarea")).innerHTML=l;n=f.value;this.ranges[n]=[o,h]}}var p="
    ";for(l in this.ranges)p+='
  • '+l+"
  • ";this.showCustomRangeLabel&&(p+='
  • '+this.locale.customRangeLabel+"
  • "),p+="
",this.container.find(".ranges").prepend(p)}"function"==typeof s&&(this.callback=s),this.timePicker||(this.startDate=this.startDate.startOf("day"),this.endDate=this.endDate.endOf("day"),this.container.find(".calendar-time").hide()),this.timePicker&&this.autoApply&&(this.autoApply=!1),this.autoApply&&this.container.addClass("auto-apply"),"object"==typeof i.ranges&&this.container.addClass("show-ranges"),this.singleDatePicker&&(this.container.addClass("single"),this.container.find(".drp-calendar.left").addClass("single"),this.container.find(".drp-calendar.left").show(),this.container.find(".drp-calendar.right").hide(),this.timePicker||this.container.addClass("auto-apply")),(void 0===i.ranges&&!this.singleDatePicker||this.alwaysShowCalendars)&&this.container.addClass("show-calendar"),this.container.addClass("opens"+this.opens),this.container.find(".applyBtn, .cancelBtn").addClass(this.buttonClasses),this.applyButtonClasses.length&&this.container.find(".applyBtn").addClass(this.applyButtonClasses),this.cancelButtonClasses.length&&this.container.find(".cancelBtn").addClass(this.cancelButtonClasses),this.container.find(".applyBtn").html(this.locale.applyLabel),this.container.find(".cancelBtn").html(this.locale.cancelLabel),this.container.find(".drp-calendar").on("click.daterangepicker",".prev",e.proxy(this.clickPrev,this)).on("click.daterangepicker",".next",e.proxy(this.clickNext,this)).on("mousedown.daterangepicker","td.available",e.proxy(this.clickDate,this)).on("mouseenter.daterangepicker","td.available",e.proxy(this.hoverDate,this)).on("change.daterangepicker","select.yearselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.monthselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.hourselect,select.minuteselect,select.secondselect,select.ampmselect",e.proxy(this.timeChanged,this)),this.container.find(".ranges").on("click.daterangepicker","li",e.proxy(this.clickRange,this)),this.container.find(".drp-buttons").on("click.daterangepicker","button.applyBtn",e.proxy(this.clickApply,this)).on("click.daterangepicker","button.cancelBtn",e.proxy(this.clickCancel,this)),this.element.is("input")||this.element.is("button")?this.element.on({"click.daterangepicker":e.proxy(this.show,this),"focus.daterangepicker":e.proxy(this.show,this),"keyup.daterangepicker":e.proxy(this.elementChanged,this),"keydown.daterangepicker":e.proxy(this.keydown,this)}):(this.element.on("click.daterangepicker",e.proxy(this.toggle,this)),this.element.on("keydown.daterangepicker",e.proxy(this.toggle,this))),this.updateElement()};return a.prototype={constructor:a,setStartDate:function(e){"string"==typeof e&&(this.startDate=t(e,this.locale.format)),"object"==typeof e&&(this.startDate=t(e)),this.timePicker||(this.startDate=this.startDate.startOf("day")),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.maxDate&&this.startDate.isAfter(this.maxDate)&&(this.startDate=this.maxDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.floor(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.isShowing||this.updateElement(),this.updateMonthsInView()},setEndDate:function(e){"string"==typeof e&&(this.endDate=t(e,this.locale.format)),"object"==typeof e&&(this.endDate=t(e)),this.timePicker||(this.endDate=this.endDate.add(1,"d").startOf("day").subtract(1,"second")),this.timePicker&&this.timePickerIncrement&&this.endDate.minute(Math.round(this.endDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.endDate.isBefore(this.startDate)&&(this.endDate=this.startDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),this.maxSpan&&this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)&&(this.endDate=this.startDate.clone().add(this.maxSpan)),this.previousRightTime=this.endDate.clone(),this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.isShowing||this.updateElement(),this.updateMonthsInView()},isInvalidDate:function(){return!1},isCustomDate:function(){return!1},updateView:function(){this.timePicker&&(this.renderTimePicker("left"),this.renderTimePicker("right"),this.endDate?this.container.find(".right .calendar-time select").removeAttr("disabled").removeClass("disabled"):this.container.find(".right .calendar-time select").attr("disabled","disabled").addClass("disabled")),this.endDate&&this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.updateMonthsInView(),this.updateCalendars(),this.updateFormInputs()},updateMonthsInView:function(){if(this.endDate){if(!this.singleDatePicker&&this.leftCalendar.month&&this.rightCalendar.month&&(this.startDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.startDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM"))&&(this.endDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.endDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM")))return;this.leftCalendar.month=this.startDate.clone().date(2),this.linkedCalendars||this.endDate.month()==this.startDate.month()&&this.endDate.year()==this.startDate.year()?this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"):this.rightCalendar.month=this.endDate.clone().date(2)}else this.leftCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&this.rightCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&(this.leftCalendar.month=this.startDate.clone().date(2),this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"));this.maxDate&&this.linkedCalendars&&!this.singleDatePicker&&this.rightCalendar.month>this.maxDate&&(this.rightCalendar.month=this.maxDate.clone().date(2),this.leftCalendar.month=this.maxDate.clone().date(2).subtract(1,"month"))},updateCalendars:function(){if(this.timePicker){var t,e,a,i;if(this.endDate){if(t=parseInt(this.container.find(".left .hourselect").val(),10),e=parseInt(this.container.find(".left .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".left .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0)}else if(t=parseInt(this.container.find(".right .hourselect").val(),10),e=parseInt(this.container.find(".right .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".right .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0);this.leftCalendar.month.hour(t).minute(e).second(a),this.rightCalendar.month.hour(t).minute(e).second(a)}this.renderCalendar("left"),this.renderCalendar("right"),this.container.find(".ranges li").removeClass("active"),null!=this.endDate&&(this.element.trigger("updateCalendar.daterangepicker",this),this.calculateChosenLabel())},renderCalendar:function(a){var i,s=(i="left"==a?this.leftCalendar:this.rightCalendar).month.month(),n=i.month.year(),r=i.month.hour(),o=i.month.minute(),h=i.month.second(),l=t([n,s]).daysInMonth(),c=t([n,s,1]),d=t([n,s,l]),m=t(c).subtract(1,"month").month(),f=t(c).subtract(1,"month").year(),p=t([f,m]).daysInMonth(),u=c.day();(i=[]).firstDay=c,i.lastDay=d;for(var D=0;D<6;D++)i[D]=[];var g=p-u+this.locale.firstDay+1;g>p&&(g-=7),u==this.locale.firstDay&&(g=p-6);for(var k=t([f,m,g,12,o,h]),y=(D=0,0),b=0;D<42;D++,y++,k=t(k).add(24,"hour"))D>0&&y%7==0&&(y=0,b++),i[b][y]=k.clone().hour(r).minute(o).second(h),k.hour(12),this.minDate&&i[b][y].format("YYYY-MM-DD")==this.minDate.format("YYYY-MM-DD")&&i[b][y].isBefore(this.minDate)&&"left"==a&&(i[b][y]=this.minDate.clone()),this.maxDate&&i[b][y].format("YYYY-MM-DD")==this.maxDate.format("YYYY-MM-DD")&&i[b][y].isAfter(this.maxDate)&&"right"==a&&(i[b][y]=this.maxDate.clone());"left"==a?this.leftCalendar.calendar=i:this.rightCalendar.calendar=i;var C="left"==a?this.minDate:this.startDate,v=this.maxDate,Y=("left"==a?this.startDate:this.endDate,this.locale.direction,'');Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=""),C&&!C.isBefore(i.firstDay)||this.linkedCalendars&&"left"!=a?Y+="":Y+='';var w=this.locale.monthNames[i[1][1].month()]+i[1][1].format(" YYYY");if(this.showDropdowns){for(var P=i[1][1].month(),x=i[1][1].year(),M=v&&v.year()||this.maxYear,S=C&&C.year()||this.minYear,I=x==S,B=x==M,A='";for(var E='")}if(Y+='",v&&!v.isAfter(i.lastDay)||this.linkedCalendars&&"right"!=a&&!this.singleDatePicker?Y+="":Y+='',Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+='"),e.each(this.locale.daysOfWeek,function(t,e){Y+=""}),Y+="",Y+="",Y+="",null==this.endDate&&this.maxSpan){var O=this.startDate.clone().add(this.maxSpan).endOf("day");v&&!O.isBefore(v)||(v=O)}for(b=0;b<6;b++){Y+="",this.showWeekNumbers?Y+='":this.showISOWeekNumbers&&(Y+='");for(y=0;y<7;y++){var N=[];i[b][y].isSame(new Date,"day")&&N.push("today"),i[b][y].isoWeekday()>5&&N.push("weekend"),i[b][y].month()!=i[1][1].month()&&N.push("off"),this.minDate&&i[b][y].isBefore(this.minDate,"day")&&N.push("off","disabled"),v&&i[b][y].isAfter(v,"day")&&N.push("off","disabled"),this.isInvalidDate(i[b][y])&&N.push("off","disabled"),i[b][y].format("YYYY-MM-DD")==this.startDate.format("YYYY-MM-DD")&&N.push("active","start-date"),null!=this.endDate&&i[b][y].format("YYYY-MM-DD")==this.endDate.format("YYYY-MM-DD")&&N.push("active","end-date"),null!=this.endDate&&i[b][y]>this.startDate&&i[b][y]'+i[b][y].date()+""}Y+=""}Y+="",Y+="
'+w+"
'+this.locale.weekLabel+""+e+"
'+i[b][0].week()+"'+i[b][0].isoWeek()+"
",this.container.find(".drp-calendar."+a+" .calendar-table").html(Y)},renderTimePicker:function(t){if("right"!=t||this.endDate){var e,a,i,s=this.maxDate;if(!this.maxSpan||this.maxDate&&!this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate)||(s=this.startDate.clone().add(this.maxSpan)),"left"==t)a=this.startDate.clone(),i=this.minDate;else if("right"==t){a=this.endDate.clone(),i=this.startDate;var n=this.container.find(".drp-calendar.right .calendar-time");if(""!=n.html()&&(a.hour(a.hour()||n.find(".hourselect option:selected").val()),a.minute(a.minute()||n.find(".minuteselect option:selected").val()),a.second(a.second()||n.find(".secondselect option:selected").val()),!this.timePicker24Hour)){var r=n.find(".ampmselect option:selected").val();"PM"===r&&a.hour()<12&&a.hour(a.hour()+12),"AM"===r&&12===a.hour()&&a.hour(0)}a.isBefore(this.startDate)&&(a=this.startDate.clone()),s&&a.isAfter(s)&&(a=s.clone())}e=' ",e+=': ",this.timePickerSeconds){e+=': "}if(!this.timePicker24Hour){e+='"}this.container.find(".drp-calendar."+t+" .calendar-time").html(e)}},updateFormInputs:function(){this.singleDatePicker||this.endDate&&(this.startDate.isBefore(this.endDate)||this.startDate.isSame(this.endDate))?this.container.find("button.applyBtn").removeAttr("disabled"):this.container.find("button.applyBtn").attr("disabled","disabled")},move:function(){var t,a={top:0,left:0},i=e(window).width();this.parentEl.is("body")||(a={top:this.parentEl.offset().top-this.parentEl.scrollTop(),left:this.parentEl.offset().left-this.parentEl.scrollLeft()},i=this.parentEl[0].clientWidth+this.parentEl.offset().left),t="up"==this.drops?this.element.offset().top-this.container.outerHeight()-a.top:this.element.offset().top+this.element.outerHeight()-a.top,this.container["up"==this.drops?"addClass":"removeClass"]("drop-up"),"left"==this.opens?(this.container.css({top:t,right:i-this.element.offset().left-this.element.outerWidth(),left:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):"center"==this.opens?(this.container.css({top:t,left:this.element.offset().left-a.left+this.element.outerWidth()/2-this.container.outerWidth()/2,right:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):(this.container.css({top:t,left:this.element.offset().left-a.left,right:"auto"}),this.container.offset().left+this.container.outerWidth()>e(window).width()&&this.container.css({left:"auto",right:0}))},show:function(t){this.isShowing||(this._outsideClickProxy=e.proxy(function(t){this.outsideClick(t)},this),e(document).on("mousedown.daterangepicker",this._outsideClickProxy).on("touchend.daterangepicker",this._outsideClickProxy).on("click.daterangepicker","[data-toggle=dropdown]",this._outsideClickProxy).on("focusin.daterangepicker",this._outsideClickProxy),e(window).on("resize.daterangepicker",e.proxy(function(t){this.move(t)},this)),this.oldStartDate=this.startDate.clone(),this.oldEndDate=this.endDate.clone(),this.previousRightTime=this.endDate.clone(),this.updateView(),this.container.show(),this.move(),this.element.trigger("show.daterangepicker",this),this.isShowing=!0)},hide:function(t){this.isShowing&&(this.endDate||(this.startDate=this.oldStartDate.clone(),this.endDate=this.oldEndDate.clone()),this.startDate.isSame(this.oldStartDate)&&this.endDate.isSame(this.oldEndDate)||this.callback(this.startDate.clone(),this.endDate.clone(),this.chosenLabel),this.updateElement(),e(document).off(".daterangepicker"),e(window).off(".daterangepicker"),this.container.hide(),this.element.trigger("hide.daterangepicker",this),this.isShowing=!1)},toggle:function(t){this.isShowing?this.hide():this.show()},outsideClick:function(t){var a=e(t.target);"focusin"==t.type||a.closest(this.element).length||a.closest(this.container).length||a.closest(".calendar-table").length||a.hasClass("select2-search__field")||a.hasClass("select2-results__option")||(this.hide(),this.element.trigger("outsideClick.daterangepicker",this))},showCalendars:function(){this.container.addClass("show-calendar"),this.move(),this.element.trigger("showCalendar.daterangepicker",this)},hideCalendars:function(){this.container.removeClass("show-calendar"),this.element.trigger("hideCalendar.daterangepicker",this)},clickRange:function(t){var e=t.target.getAttribute("data-range-key");if(this.chosenLabel=e,e==this.locale.customRangeLabel)this.showCalendars();else{var a=this.ranges[e];this.startDate=a[0],this.endDate=a[1],this.timePicker||(this.startDate.startOf("day"),this.endDate.endOf("day")),this.alwaysShowCalendars||this.hideCalendars(),this.clickApply()}},clickPrev:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?(this.leftCalendar.month.subtract(1,"month"),this.linkedCalendars&&this.rightCalendar.month.subtract(1,"month")):this.rightCalendar.month.subtract(1,"month"),this.updateCalendars(),this.element.trigger("prev.daterangepicker",this)},clickNext:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.month.add(1,"month"):(this.rightCalendar.month.add(1,"month"),this.linkedCalendars&&this.leftCalendar.month.add(1,"month")),this.updateCalendars(),this.element.trigger("next.daterangepicker",this)},hoverDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s],r=this.leftCalendar,o=this.rightCalendar,h=this.startDate;this.endDate||this.container.find(".drp-calendar tbody td").each(function(t,a){if(!e(a).hasClass("week")){var i=e(a).attr("data-title"),s=i.substr(1,1),l=i.substr(3,1),c=e(a).parents(".drp-calendar").hasClass("left")?r.calendar[s][l]:o.calendar[s][l];c.isAfter(h)&&c.isBefore(n)||c.isSame(n,"day")?e(a).addClass("in-range"):e(a).removeClass("in-range")}})}},clickDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s];if(this.endDate||n.isBefore(this.startDate,"day")){if(this.timePicker){var r=parseInt(this.container.find(".left .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".left .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);var o=parseInt(this.container.find(".left .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.endDate=null,this.setStartDate(n.clone())}else if(!this.endDate&&n.isBefore(this.startDate))this.setEndDate(this.startDate.clone());else{if(this.timePicker){var l;r=parseInt(this.container.find(".right .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".right .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);o=parseInt(this.container.find(".right .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.setEndDate(n.clone()),this.autoApply&&(this.calculateChosenLabel(),this.clickApply())}this.singleDatePicker&&(this.setEndDate(this.startDate),this.timePicker||this.clickApply()),this.updateView(),this.element.trigger("selectDate.daterangepicker",this),t.stopPropagation()}},calculateChosenLabel:function(){var t=!0,e=0;for(var a in this.ranges){if(this.timePicker){var i=this.timePickerSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm";if(this.startDate.format(i)==this.ranges[a][0].format(i)&&this.endDate.format(i)==this.ranges[a][1].format(i)){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}}else if(this.startDate.format("YYYY-MM-DD")==this.ranges[a][0].format("YYYY-MM-DD")&&this.endDate.format("YYYY-MM-DD")==this.ranges[a][1].format("YYYY-MM-DD")){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}e++}t&&(this.showCustomRangeLabel?this.chosenLabel=this.container.find(".ranges li:last").addClass("active").attr("data-range-key"):this.chosenLabel=null,this.showCalendars())},clickApply:function(t){this.hide(),this.element.trigger("apply.daterangepicker",this)},clickCancel:function(t){this.startDate=this.oldStartDate,this.endDate=this.oldEndDate,this.hide(),this.element.trigger("cancel.daterangepicker",this)},monthOrYearChanged:function(t){var a=e(t.target).closest(".drp-calendar").hasClass("left"),i=a?"left":"right",s=this.container.find(".drp-calendar."+i),n=parseInt(s.find(".monthselect").val(),10),r=s.find(".yearselect").val();a||(rthis.maxDate.year()||r==this.maxDate.year()&&n>this.maxDate.month())&&(n=this.maxDate.month(),r=this.maxDate.year()),a?(this.leftCalendar.month.month(n).year(r),this.linkedCalendars&&(this.rightCalendar.month=this.leftCalendar.month.clone().add(1,"month"))):(this.rightCalendar.month.month(n).year(r),this.linkedCalendars&&(this.leftCalendar.month=this.rightCalendar.month.clone().subtract(1,"month"))),this.updateCalendars()},timeChanged:function(t){var a=e(t.target).closest(".drp-calendar"),i=a.hasClass("left"),s=parseInt(a.find(".hourselect").val(),10),n=parseInt(a.find(".minuteselect").val(),10),r=this.timePickerSeconds?parseInt(a.find(".secondselect").val(),10):0;if(!this.timePicker24Hour){var o=a.find(".ampmselect").val();"PM"===o&&s<12&&(s+=12),"AM"===o&&12===s&&(s=0)}if(i){var h=this.startDate.clone();h.hour(s),h.minute(n),this.setStartDate(h),this.singleDatePicker?this.endDate=this.startDate.clone():this.endDate&&this.endDate.format("YYYY-MM-DD")==h.format("YYYY-MM-DD")&&this.endDate.isBefore(h)&&this.setEndDate(h.clone())}else if(this.endDate){var l=this.endDate.clone();l.hour(s),l.minute(n),l.second(r),this.setEndDate(l)}this.updateCalendars(),this.updateFormInputs(),this.renderTimePicker("left"),this.renderTimePicker("right"),this.element.trigger("timeChanged.daterangepicker",this)},elementChanged:function(){if(this.element.is("input")&&this.element.val().length){var e=this.element.val().split(this.locale.separator),a=null,i=null;2===e.length&&(a=t(e[0],this.locale.format),i=t(e[1],this.locale.format)),(this.singleDatePicker||null===a||null===i)&&(i=a=t(this.element.val(),this.locale.format)),a.isValid()&&i.isValid()&&(this.setStartDate(a),this.setEndDate(i),this.updateView())}},keydown:function(t){9!==t.keyCode&&13!==t.keyCode||this.hide(),27===t.keyCode&&(t.preventDefault(),t.stopPropagation(),this.hide())},updateElement:function(){if(this.element.is("input")&&this.autoUpdateInput){var t=this.startDate.format(this.locale.format);this.singleDatePicker||(t+=this.locale.separator+this.endDate.format(this.locale.format)),t!==this.element.val()&&this.element.val(t).trigger("change")}},remove:function(){this.container.remove(),this.element.off(".daterangepicker"),this.element.removeData()}},e.fn.daterangepicker=function(t,i){var s=e.extend(!0,{},e.fn.daterangepicker.defaultOptions,t);return this.each(function(){var t=e(this);t.data("daterangepicker")&&t.data("daterangepicker").remove(),t.data("daterangepicker",new a(t,s,i))}),this},a}); \ No newline at end of file +!function(t,e){if("function"==typeof define&&define.amd)define(["moment","jquery"],function(t,a){return a.fn||(a.fn={}),"function"!=typeof t&&t.default&&(t=t.default),e(t,a)});else if("object"==typeof module&&module.exports){var a="undefined"!=typeof window?window.jQuery:void 0;a||(a=require("jquery")).fn||(a.fn={});var i="undefined"!=typeof window&&void 0!==window.moment?window.moment:require("moment");module.exports=e(i,a)}else t.daterangepicker=e(t.moment,t.jQuery)}(this,function(t,e){var a=function(a,i,s){if(this.parentEl="body",this.element=e(a),this.startDate=t().startOf("day"),this.endDate=t().endOf("day"),this.minDate=!1,this.maxDate=!1,this.maxSpan=!1,this.autoApply=!1,this.singleDatePicker=!1,this.showDropdowns=!1,this.minYear=t().subtract(100,"year").format("YYYY"),this.maxYear=t().add(100,"year").format("YYYY"),this.showWeekNumbers=!1,this.showISOWeekNumbers=!1,this.showCustomRangeLabel=!0,this.timePicker=!1,this.timePicker24Hour=!1,this.timePickerIncrement=1,this.timePickerSeconds=!1,this.linkedCalendars=!0,this.autoUpdateInput=!0,this.alwaysShowCalendars=!1,this.ranges={},this.opens="right",this.element.hasClass("pull-right")&&(this.opens="left"),this.drops="down",this.element.hasClass("dropup")&&(this.drops="up"),this.buttonClasses="btn btn-sm",this.applyButtonClasses="btn-primary",this.cancelButtonClasses="btn-default",this.locale={direction:"ltr",format:t.localeData().longDateFormat("L"),separator:" - ",applyLabel:"Apply",cancelLabel:"Cancel",weekLabel:"W",customRangeLabel:"Custom Range",daysOfWeek:t.weekdaysMin(),monthNames:t.monthsShort(),firstDay:t.localeData().firstDayOfWeek()},this.callback=function(){},this.isShowing=!1,this.leftCalendar={},this.rightCalendar={},"object"==typeof i&&null!==i||(i={}),"string"==typeof(i=e.extend(this.element.data(),i)).template||i.template instanceof e||(i.template='
'),this.parentEl=i.parentEl&&e(i.parentEl).length?e(i.parentEl):e(this.parentEl),this.container=e(i.template).appendTo(this.parentEl),"object"==typeof i.locale&&("string"==typeof i.locale.direction&&(this.locale.direction=i.locale.direction),"string"==typeof i.locale.format&&(this.locale.format=i.locale.format),"string"==typeof i.locale.separator&&(this.locale.separator=i.locale.separator),"object"==typeof i.locale.daysOfWeek&&(this.locale.daysOfWeek=i.locale.daysOfWeek.slice()),"object"==typeof i.locale.monthNames&&(this.locale.monthNames=i.locale.monthNames.slice()),"number"==typeof i.locale.firstDay&&(this.locale.firstDay=i.locale.firstDay),"string"==typeof i.locale.applyLabel&&(this.locale.applyLabel=i.locale.applyLabel),"string"==typeof i.locale.cancelLabel&&(this.locale.cancelLabel=i.locale.cancelLabel),"string"==typeof i.locale.weekLabel&&(this.locale.weekLabel=i.locale.weekLabel),"string"==typeof i.locale.customRangeLabel)){(f=document.createElement("textarea")).innerHTML=i.locale.customRangeLabel;var n=f.value;this.locale.customRangeLabel=n}if(this.container.addClass(this.locale.direction),"string"==typeof i.startDate&&(this.startDate=t(i.startDate,this.locale.format)),"string"==typeof i.endDate&&(this.endDate=t(i.endDate,this.locale.format)),"string"==typeof i.minDate&&(this.minDate=t(i.minDate,this.locale.format)),"string"==typeof i.maxDate&&(this.maxDate=t(i.maxDate,this.locale.format)),"object"==typeof i.startDate&&(this.startDate=t(i.startDate)),"object"==typeof i.endDate&&(this.endDate=t(i.endDate)),"object"==typeof i.minDate&&(this.minDate=t(i.minDate)),"object"==typeof i.maxDate&&(this.maxDate=t(i.maxDate)),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),"string"==typeof i.applyButtonClasses&&(this.applyButtonClasses=i.applyButtonClasses),"string"==typeof i.applyClass&&(this.applyButtonClasses=i.applyClass),"string"==typeof i.cancelButtonClasses&&(this.cancelButtonClasses=i.cancelButtonClasses),"string"==typeof i.cancelClass&&(this.cancelButtonClasses=i.cancelClass),"object"==typeof i.maxSpan&&(this.maxSpan=i.maxSpan),"object"==typeof i.dateLimit&&(this.maxSpan=i.dateLimit),"string"==typeof i.opens&&(this.opens=i.opens),"string"==typeof i.drops&&(this.drops=i.drops),"boolean"==typeof i.showWeekNumbers&&(this.showWeekNumbers=i.showWeekNumbers),"boolean"==typeof i.showISOWeekNumbers&&(this.showISOWeekNumbers=i.showISOWeekNumbers),"string"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses),"object"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses.join(" ")),"boolean"==typeof i.showDropdowns&&(this.showDropdowns=i.showDropdowns),"number"==typeof i.minYear&&(this.minYear=i.minYear),"number"==typeof i.maxYear&&(this.maxYear=i.maxYear),"boolean"==typeof i.showCustomRangeLabel&&(this.showCustomRangeLabel=i.showCustomRangeLabel),"boolean"==typeof i.singleDatePicker&&(this.singleDatePicker=i.singleDatePicker,this.singleDatePicker&&(this.endDate=this.startDate.clone())),"boolean"==typeof i.timePicker&&(this.timePicker=i.timePicker),"boolean"==typeof i.timePickerSeconds&&(this.timePickerSeconds=i.timePickerSeconds),"number"==typeof i.timePickerIncrement&&(this.timePickerIncrement=i.timePickerIncrement),"boolean"==typeof i.timePicker24Hour&&(this.timePicker24Hour=i.timePicker24Hour),"boolean"==typeof i.autoApply&&(this.autoApply=i.autoApply),"boolean"==typeof i.autoUpdateInput&&(this.autoUpdateInput=i.autoUpdateInput),"boolean"==typeof i.linkedCalendars&&(this.linkedCalendars=i.linkedCalendars),"function"==typeof i.isInvalidDate&&(this.isInvalidDate=i.isInvalidDate),"function"==typeof i.isCustomDate&&(this.isCustomDate=i.isCustomDate),"boolean"==typeof i.alwaysShowCalendars&&(this.alwaysShowCalendars=i.alwaysShowCalendars),0!=this.locale.firstDay)for(var r=this.locale.firstDay;r>0;)this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),r--;var o,h,l;if(void 0===i.startDate&&void 0===i.endDate&&e(this.element).is(":text")){var c=e(this.element).val(),d=c.split(this.locale.separator);o=h=null,2==d.length?(o=t(d[0],this.locale.format),h=t(d[1],this.locale.format)):this.singleDatePicker&&""!==c&&(o=t(c,this.locale.format),h=t(c,this.locale.format)),null!==o&&null!==h&&(this.setStartDate(o),this.setEndDate(h))}if("object"==typeof i.ranges){for(l in i.ranges){o="string"==typeof i.ranges[l][0]?t(i.ranges[l][0],this.locale.format):t(i.ranges[l][0]),h="string"==typeof i.ranges[l][1]?t(i.ranges[l][1],this.locale.format):t(i.ranges[l][1]),this.minDate&&o.isBefore(this.minDate)&&(o=this.minDate.clone());var m=this.maxDate;if(this.maxSpan&&m&&o.clone().add(this.maxSpan).isAfter(m)&&(m=o.clone().add(this.maxSpan)),m&&h.isAfter(m)&&(h=m.clone()),!(this.minDate&&h.isBefore(this.minDate,this.timepicker?"minute":"day")||m&&o.isAfter(m,this.timepicker?"minute":"day"))){var f;(f=document.createElement("textarea")).innerHTML=l;n=f.value;this.ranges[n]=[o,h]}}var p="
    ";for(l in this.ranges)p+='
  • '+l+"
  • ";this.showCustomRangeLabel&&(p+='
  • '+this.locale.customRangeLabel+"
  • "),p+="
",this.container.find(".ranges").prepend(p)}"function"==typeof s&&(this.callback=s),this.timePicker||(this.startDate=this.startDate.startOf("day"),this.endDate=this.endDate.endOf("day"),this.container.find(".calendar-time").hide()),this.timePicker&&this.autoApply&&(this.autoApply=!1),this.autoApply&&this.container.addClass("auto-apply"),"object"==typeof i.ranges&&this.container.addClass("show-ranges"),this.singleDatePicker&&(this.container.addClass("single"),this.container.find(".drp-calendar.left").addClass("single"),this.container.find(".drp-calendar.left").show(),this.container.find(".drp-calendar.right").hide(),this.timePicker||this.container.addClass("auto-apply")),(void 0===i.ranges&&!this.singleDatePicker||this.alwaysShowCalendars)&&this.container.addClass("show-calendar"),this.container.addClass("opens"+this.opens),this.container.find(".applyBtn, .cancelBtn").addClass(this.buttonClasses),this.applyButtonClasses.length&&this.container.find(".applyBtn").addClass(this.applyButtonClasses),this.cancelButtonClasses.length&&this.container.find(".cancelBtn").addClass(this.cancelButtonClasses),this.container.find(".applyBtn").html(this.locale.applyLabel),this.container.find(".cancelBtn").html(this.locale.cancelLabel),this.container.find(".drp-calendar").on("click.daterangepicker",".prev",e.proxy(this.clickPrev,this)).on("click.daterangepicker",".next",e.proxy(this.clickNext,this)).on("mousedown.daterangepicker","td.available",e.proxy(this.clickDate,this)).on("mouseenter.daterangepicker","td.available",e.proxy(this.hoverDate,this)).on("change.daterangepicker","select.yearselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.monthselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.hourselect,select.minuteselect,select.secondselect,select.ampmselect",e.proxy(this.timeChanged,this)),this.container.find(".ranges").on("click.daterangepicker","li",e.proxy(this.clickRange,this)),this.container.find(".drp-buttons").on("click.daterangepicker","button.applyBtn",e.proxy(this.clickApply,this)).on("click.daterangepicker","button.cancelBtn",e.proxy(this.clickCancel,this)),this.element.is("input")||this.element.is("button")?this.element.on({"click.daterangepicker":e.proxy(this.show,this),"focus.daterangepicker":e.proxy(this.show,this),"keyup.daterangepicker":e.proxy(this.elementChanged,this),"keydown.daterangepicker":e.proxy(this.keydown,this)}):(this.element.on("click.daterangepicker",e.proxy(this.toggle,this)),this.element.on("keydown.daterangepicker",e.proxy(this.toggle,this))),this.updateElement()};return a.prototype={constructor:a,setStartDate:function(e){"string"==typeof e&&(this.startDate=t(e,this.locale.format)),"object"==typeof e&&(this.startDate=t(e)),this.timePicker||(this.startDate=this.startDate.startOf("day")),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.maxDate&&this.startDate.isAfter(this.maxDate)&&(this.startDate=this.maxDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.floor(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.isShowing||this.updateElement(),this.updateMonthsInView()},setEndDate:function(e){"string"==typeof e&&(this.endDate=t(e,this.locale.format)),"object"==typeof e&&(this.endDate=t(e)),this.timePicker||(this.endDate=this.endDate.add(1,"d").startOf("day").subtract(1,"second")),this.timePicker&&this.timePickerIncrement&&this.endDate.minute(Math.round(this.endDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.endDate.isBefore(this.startDate)&&(this.endDate=this.startDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),this.maxSpan&&this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)&&(this.endDate=this.startDate.clone().add(this.maxSpan)),this.previousRightTime=this.endDate.clone(),this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.isShowing||this.updateElement(),this.updateMonthsInView()},isInvalidDate:function(){return!1},isCustomDate:function(){return!1},updateView:function(){this.timePicker&&(this.renderTimePicker("left"),this.renderTimePicker("right"),this.endDate?this.container.find(".right .calendar-time select").removeAttr("disabled").removeClass("disabled"):this.container.find(".right .calendar-time select").attr("disabled","disabled").addClass("disabled")),this.endDate&&this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.updateMonthsInView(),this.updateCalendars(),this.updateFormInputs()},updateMonthsInView:function(){if(this.endDate){if(!this.singleDatePicker&&this.leftCalendar.month&&this.rightCalendar.month&&(this.startDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.startDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM"))&&(this.endDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.endDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM")))return;this.leftCalendar.month=this.startDate.clone().date(2),this.linkedCalendars||this.endDate.month()==this.startDate.month()&&this.endDate.year()==this.startDate.year()?this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"):this.rightCalendar.month=this.endDate.clone().date(2)}else this.leftCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&this.rightCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&(this.leftCalendar.month=this.startDate.clone().date(2),this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"));this.maxDate&&this.linkedCalendars&&!this.singleDatePicker&&this.rightCalendar.month>this.maxDate&&(this.rightCalendar.month=this.maxDate.clone().date(2),this.leftCalendar.month=this.maxDate.clone().date(2).subtract(1,"month"))},updateCalendars:function(){if(this.timePicker){var t,e,a,i;if(this.endDate){if(t=parseInt(this.container.find(".left .hourselect").val(),10),e=parseInt(this.container.find(".left .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".left .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0)}else if(t=parseInt(this.container.find(".right .hourselect").val(),10),e=parseInt(this.container.find(".right .minuteselect").val(),10),a=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".right .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0);this.leftCalendar.month.hour(t).minute(e).second(a),this.rightCalendar.month.hour(t).minute(e).second(a)}this.renderCalendar("left"),this.renderCalendar("right"),this.container.find(".ranges li").removeClass("active"),null!=this.endDate&&(this.element.trigger("updateCalendar.daterangepicker",this),this.calculateChosenLabel())},renderCalendar:function(a){var i,s=(i="left"==a?this.leftCalendar:this.rightCalendar).month.month(),n=i.month.year(),r=i.month.hour(),o=i.month.minute(),h=i.month.second(),l=t([n,s]).daysInMonth(),c=t([n,s,1]),d=t([n,s,l]),m=t(c).subtract(1,"month").month(),f=t(c).subtract(1,"month").year(),p=t([f,m]).daysInMonth(),u=c.day();(i=[]).firstDay=c,i.lastDay=d;for(var D=0;D<6;D++)i[D]=[];var g=p-u+this.locale.firstDay+1;g>p&&(g-=7),u==this.locale.firstDay&&(g=p-6);for(var k=t([f,m,g,12,o,h]),y=(D=0,0),b=0;D<42;D++,y++,k=t(k).add(24,"hour"))D>0&&y%7==0&&(y=0,b++),i[b][y]=k.clone().hour(r).minute(o).second(h),k.hour(12),this.minDate&&i[b][y].format("YYYY-MM-DD")==this.minDate.format("YYYY-MM-DD")&&i[b][y].isBefore(this.minDate)&&"left"==a&&(i[b][y]=this.minDate.clone()),this.maxDate&&i[b][y].format("YYYY-MM-DD")==this.maxDate.format("YYYY-MM-DD")&&i[b][y].isAfter(this.maxDate)&&"right"==a&&(i[b][y]=this.maxDate.clone());"left"==a?this.leftCalendar.calendar=i:this.rightCalendar.calendar=i;var C="left"==a?this.minDate:this.startDate,v=this.maxDate,Y=("left"==a?this.startDate:this.endDate,this.locale.direction,'');Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=""),C&&!C.isBefore(i.firstDay)||this.linkedCalendars&&"left"!=a?Y+="":Y+='';var w=this.locale.monthNames[i[1][1].month()]+i[1][1].format(" YYYY");if(this.showDropdowns){for(var P=i[1][1].month(),x=i[1][1].year(),M=v&&v.year()||this.maxYear,S=C&&C.year()||this.minYear,I=x==S,B=x==M,A='";for(var E='")}if(Y+='",v&&!v.isAfter(i.lastDay)||this.linkedCalendars&&"right"!=a&&!this.singleDatePicker?Y+="":Y+='',Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+='"),e.each(this.locale.daysOfWeek,function(t,e){Y+=""}),Y+="",Y+="",Y+="",null==this.endDate&&this.maxSpan){var O=this.startDate.clone().add(this.maxSpan).endOf("day");v&&!O.isBefore(v)||(v=O)}for(b=0;b<6;b++){Y+="",this.showWeekNumbers?Y+='":this.showISOWeekNumbers&&(Y+='");for(y=0;y<7;y++){var N=[];i[b][y].isSame(new Date,"day")&&N.push("today"),i[b][y].isoWeekday()>5&&N.push("weekend"),i[b][y].month()!=i[1][1].month()&&N.push("off"),this.minDate&&i[b][y].isBefore(this.minDate,"day")&&N.push("off","disabled"),v&&i[b][y].isAfter(v,"day")&&N.push("off","disabled"),this.isInvalidDate(i[b][y])&&N.push("off","disabled"),i[b][y].format("YYYY-MM-DD")==this.startDate.format("YYYY-MM-DD")&&N.push("active","start-date"),null!=this.endDate&&i[b][y].format("YYYY-MM-DD")==this.endDate.format("YYYY-MM-DD")&&N.push("active","end-date"),null!=this.endDate&&i[b][y]>this.startDate&&i[b][y]'+i[b][y].date()+""}Y+=""}Y+="",Y+="
'+w+"
'+this.locale.weekLabel+""+e+"
'+i[b][0].week()+"'+i[b][0].isoWeek()+"
",this.container.find(".drp-calendar."+a+" .calendar-table").html(Y)},renderTimePicker:function(t){if("right"!=t||this.endDate){var e,a,i,s=this.maxDate;if(!this.maxSpan||this.maxDate&&!this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate)||(s=this.startDate.clone().add(this.maxSpan)),"left"==t)a=this.startDate.clone(),i=this.minDate;else if("right"==t){a=this.endDate.clone(),i=this.startDate;var n=this.container.find(".drp-calendar.right .calendar-time");if(""!=n.html()&&(a.hour(a.hour()||n.find(".hourselect option:selected").val()),a.minute(a.minute()||n.find(".minuteselect option:selected").val()),a.second(a.second()||n.find(".secondselect option:selected").val()),!this.timePicker24Hour)){var r=n.find(".ampmselect option:selected").val();"PM"===r&&a.hour()<12&&a.hour(a.hour()+12),"AM"===r&&12===a.hour()&&a.hour(0)}a.isBefore(this.startDate)&&(a=this.startDate.clone()),s&&a.isAfter(s)&&(a=s.clone())}e=' ",e+=': ",this.timePickerSeconds){e+=': "}if(!this.timePicker24Hour){e+='"}this.container.find(".drp-calendar."+t+" .calendar-time").html(e)}},updateFormInputs:function(){this.singleDatePicker||this.endDate&&(this.startDate.isBefore(this.endDate)||this.startDate.isSame(this.endDate))?this.container.find("button.applyBtn").removeAttr("disabled"):this.container.find("button.applyBtn").attr("disabled","disabled")},setDrops:function(t){this.drops=t,this.move()},move:function(){var t,a={top:0,left:0},i=e(window).width();this.parentEl.is("body")||(a={top:this.parentEl.offset().top-this.parentEl.scrollTop(),left:this.parentEl.offset().left-this.parentEl.scrollLeft()},i=this.parentEl[0].clientWidth+this.parentEl.offset().left),t="up"==this.drops?this.element.offset().top-this.container.outerHeight()-a.top:this.element.offset().top+this.element.outerHeight()-a.top,this.container["up"==this.drops?"addClass":"removeClass"]("drop-up"),"left"==this.opens?(this.container.css({top:t,right:i-this.element.offset().left-this.element.outerWidth(),left:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):"center"==this.opens?(this.container.css({top:t,left:this.element.offset().left-a.left+this.element.outerWidth()/2-this.container.outerWidth()/2,right:"auto"}),this.container.offset().left<0&&this.container.css({right:"auto",left:9})):(this.container.css({top:t,left:this.element.offset().left-a.left,right:"auto"}),this.container.offset().left+this.container.outerWidth()>e(window).width()&&this.container.css({left:"auto",right:0}))},show:function(t){this.isShowing||(this._outsideClickProxy=e.proxy(function(t){this.outsideClick(t)},this),e(document).on("mousedown.daterangepicker",this._outsideClickProxy).on("touchend.daterangepicker",this._outsideClickProxy).on("click.daterangepicker","[data-toggle=dropdown]",this._outsideClickProxy).on("focusin.daterangepicker",this._outsideClickProxy),e(window).on("resize.daterangepicker",e.proxy(function(t){this.move(t)},this)),this.oldStartDate=this.startDate.clone(),this.oldEndDate=this.endDate.clone(),this.previousRightTime=this.endDate.clone(),this.updateView(),this.container.show(),this.move(),t&&this.element.trigger("show.daterangepicker",this),this.isShowing=!0)},hide:function(t){this.isShowing&&(this.endDate||(this.startDate=this.oldStartDate.clone(),this.endDate=this.oldEndDate.clone()),this.startDate.isSame(this.oldStartDate)&&this.endDate.isSame(this.oldEndDate)||this.callback(this.startDate.clone(),this.endDate.clone(),this.chosenLabel),this.updateElement(),e(document).off(".daterangepicker"),e(window).off(".daterangepicker"),this.container.hide(),t&&this.element.trigger("hide.daterangepicker",this),this.isShowing=!1)},toggle:function(t){this.isShowing?this.hide():this.show()},outsideClick:function(t){var a=e(t.target);"focusin"==t.type||a.closest(this.element).length||a.closest(this.container).length||a.closest(".calendar-table").length||a.hasClass("select2-search__field")||a.hasClass("select2-results__option")||(this.hide(),this.element.trigger("outsideClick.daterangepicker",this))},showCalendars:function(){this.container.addClass("show-calendar"),this.move(),this.element.trigger("showCalendar.daterangepicker",this)},hideCalendars:function(){this.container.removeClass("show-calendar"),this.element.trigger("hideCalendar.daterangepicker",this)},clickRange:function(t){var e=t.target.getAttribute("data-range-key");if(this.chosenLabel=e,e==this.locale.customRangeLabel)this.showCalendars();else{var a=this.ranges[e];this.startDate=a[0],this.endDate=a[1],this.timePicker||(this.startDate.startOf("day"),this.endDate.endOf("day")),this.alwaysShowCalendars||this.hideCalendars(),this.clickApply()}},clickPrev:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?(this.leftCalendar.month.subtract(1,"month"),this.linkedCalendars&&this.rightCalendar.month.subtract(1,"month")):this.rightCalendar.month.subtract(1,"month"),this.updateCalendars(),this.element.trigger("prev.daterangepicker",this)},clickNext:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.month.add(1,"month"):(this.rightCalendar.month.add(1,"month"),this.linkedCalendars&&this.leftCalendar.month.add(1,"month")),this.updateCalendars(),this.element.trigger("next.daterangepicker",this)},hoverDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s],r=this.leftCalendar,o=this.rightCalendar,h=this.startDate;this.endDate||this.container.find(".drp-calendar tbody td").each(function(t,a){if(!e(a).hasClass("week")){var i=e(a).attr("data-title"),s=i.substr(1,1),l=i.substr(3,1),c=e(a).parents(".drp-calendar").hasClass("left")?r.calendar[s][l]:o.calendar[s][l];c.isAfter(h)&&c.isBefore(n)||c.isSame(n,"day")?e(a).addClass("in-range"):e(a).removeClass("in-range")}})}},clickDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s];if(this.endDate||n.isBefore(this.startDate,"day")){if(this.timePicker){var r=parseInt(this.container.find(".left .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".left .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);var o=parseInt(this.container.find(".left .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.endDate=null,this.setStartDate(n.clone())}else if(!this.endDate&&n.isBefore(this.startDate))this.setEndDate(this.startDate.clone());else{if(this.timePicker){var l;r=parseInt(this.container.find(".right .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".right .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);o=parseInt(this.container.find(".right .minuteselect").val(),10),h=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.setEndDate(n.clone()),this.autoApply&&(this.calculateChosenLabel(),this.clickApply())}this.singleDatePicker&&(this.setEndDate(this.startDate),this.timePicker||this.clickApply()),this.updateView(),this.element.trigger("selectDate.daterangepicker",this),t.stopPropagation()}},calculateChosenLabel:function(){var t=!0,e=0;for(var a in this.ranges){if(this.timePicker){var i=this.timePickerSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm";if(this.startDate.format(i)==this.ranges[a][0].format(i)&&this.endDate.format(i)==this.ranges[a][1].format(i)){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}}else if(this.startDate.format("YYYY-MM-DD")==this.ranges[a][0].format("YYYY-MM-DD")&&this.endDate.format("YYYY-MM-DD")==this.ranges[a][1].format("YYYY-MM-DD")){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}e++}t&&(this.showCustomRangeLabel?this.chosenLabel=this.container.find(".ranges li:last").addClass("active").attr("data-range-key"):this.chosenLabel=null,this.showCalendars())},clickApply:function(t){this.hide(),this.element.trigger("apply.daterangepicker",this)},clickCancel:function(t){this.startDate=this.oldStartDate,this.endDate=this.oldEndDate,this.hide(),this.element.trigger("cancel.daterangepicker",this)},monthOrYearChanged:function(t){var a=e(t.target).closest(".drp-calendar").hasClass("left"),i=a?"left":"right",s=this.container.find(".drp-calendar."+i),n=parseInt(s.find(".monthselect").val(),10),r=s.find(".yearselect").val();a||(rthis.maxDate.year()||r==this.maxDate.year()&&n>this.maxDate.month())&&(n=this.maxDate.month(),r=this.maxDate.year()),a?(this.leftCalendar.month.month(n).year(r),this.linkedCalendars&&(this.rightCalendar.month=this.leftCalendar.month.clone().add(1,"month"))):(this.rightCalendar.month.month(n).year(r),this.linkedCalendars&&(this.leftCalendar.month=this.rightCalendar.month.clone().subtract(1,"month"))),this.updateCalendars()},timeChanged:function(t){var a=e(t.target).closest(".drp-calendar"),i=a.hasClass("left"),s=parseInt(a.find(".hourselect").val(),10),n=parseInt(a.find(".minuteselect").val(),10),r=this.timePickerSeconds?parseInt(a.find(".secondselect").val(),10):0;if(!this.timePicker24Hour){var o=a.find(".ampmselect").val();"PM"===o&&s<12&&(s+=12),"AM"===o&&12===s&&(s=0)}if(i){var h=this.startDate.clone();h.hour(s),h.minute(n),this.setStartDate(h),this.singleDatePicker?this.endDate=this.startDate.clone():this.endDate&&this.endDate.format("YYYY-MM-DD")==h.format("YYYY-MM-DD")&&this.endDate.isBefore(h)&&this.setEndDate(h.clone())}else if(this.endDate){var l=this.endDate.clone();l.hour(s),l.minute(n),l.second(r),this.setEndDate(l)}this.updateCalendars(),this.updateFormInputs(),this.renderTimePicker("left"),this.renderTimePicker("right"),this.element.trigger("timeChanged.daterangepicker",this)},elementChanged:function(){if(this.element.is("input")&&this.element.val().length){var e=this.element.val().split(this.locale.separator),a=null,i=null;2===e.length&&(a=t(e[0],this.locale.format),i=t(e[1],this.locale.format)),(this.singleDatePicker||null===a||null===i)&&(i=a=t(this.element.val(),this.locale.format)),a.isValid()&&i.isValid()&&(this.setStartDate(a),this.setEndDate(i),this.updateView())}},keydown:function(t){9!==t.keyCode&&13!==t.keyCode||this.hide(),27===t.keyCode&&(t.preventDefault(),t.stopPropagation(),this.hide())},updateElement:function(){if(this.element.is("input")&&this.autoUpdateInput){var t=this.startDate.format(this.locale.format);this.singleDatePicker||(t+=this.locale.separator+this.endDate.format(this.locale.format)),t!==this.element.val()&&this.element.val(t).trigger("change")}},remove:function(){this.container.remove(),this.element.off(".daterangepicker"),this.element.removeData()}},e.fn.daterangepicker=function(t,i){var s=e.extend(!0,{},e.fn.daterangepicker.defaultOptions,t);return this.each(function(){var t=e(this);t.data("daterangepicker")&&t.data("daterangepicker").remove(),t.data("daterangepicker",new a(t,s,i))}),this},a}); \ No newline at end of file From 8c0da0491789fee06c9d9cdabeee7e56e9b03922 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 14 Jan 2019 17:32:52 +0800 Subject: [PATCH 070/247] Rating added selectedRatingColor & unselectedRatingColor feature. --- .../pathanimator/MaterialPathAnimator.java | 14 ++++++----- .../addins/client/rating/MaterialRating.java | 23 +++++++++++++++++++ .../client/daterange/DateRangePicker.java | 4 ++-- .../daterange/js/JsDateRangeMethod.java | 4 ++-- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/pathanimator/MaterialPathAnimator.java b/src/main/java/gwt/material/design/addins/client/pathanimator/MaterialPathAnimator.java index 793bcc3bc..d1bff2627 100644 --- a/src/main/java/gwt/material/design/addins/client/pathanimator/MaterialPathAnimator.java +++ b/src/main/java/gwt/material/design/addins/client/pathanimator/MaterialPathAnimator.java @@ -183,12 +183,14 @@ public void reverseAnimate() { * of {@link OffsetPosition#MIDDLE}. */ protected void detectOutOfScopeElement(Element element, Functions.Func callback) { - if (scrollHelper.isInViewPort(element)) { - callback.call(); - } else { - scrollHelper.setOffsetPosition(OffsetPosition.MIDDLE); - scrollHelper.setCompleteCallback(() -> callback.call()); - scrollHelper.scrollTo(element); + if (element != null) { + if (scrollHelper.isInViewPort(element)) { + callback.call(); + } else { + scrollHelper.setOffsetPosition(OffsetPosition.MIDDLE); + scrollHelper.setCompleteCallback(() -> callback.call()); + scrollHelper.scrollTo(element); + } } } diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java index ba134b206..9907a132e 100644 --- a/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java @@ -20,6 +20,7 @@ * #L% */ +import com.gargoylesoftware.htmlunit.Page; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; @@ -108,6 +109,8 @@ public class MaterialRating extends MaterialWidget implements HasValue private int maxRating = 5; private IconType selectedRatingIcon = IconType.STAR; private IconType unselectedRatingIcon = IconType.STAR_BORDER; + private Color selectedRatingColor; + private Color unselectedRatingColor; private List iconList = new LinkedList<>(); /** @@ -140,6 +143,20 @@ protected void onLoad() { revalidateLayout(); } + /** + * Will set the color of selected rating icon. + */ + public void setSelectedRatingColor(Color selectedRatingColor) { + this.selectedRatingColor = selectedRatingColor; + } + + /** + * Will set the color of unselected rating icon. + */ + public void setUnselectedRatingColor(Color unselectedRatingColor) { + this.unselectedRatingColor = unselectedRatingColor; + } + /** * Sets the maximum number of icons to show - which represents the maximum * selectable rating. The default is 5. @@ -265,12 +282,18 @@ protected void revalidateSelection(int rating) { MaterialIcon icon = iconList.get(i); icon.setIconType(selectedRatingIcon); icon.addStyleName(AddinsCssName.MATERIAL_RATING_SELECTED); + if (selectedRatingColor != null) { + icon.setIconColor(selectedRatingColor); + } } for (int i = rating; i < iconList.size(); i++) { MaterialIcon icon = iconList.get(i); icon.setIconType(unselectedRatingIcon); icon.addStyleName(AddinsCssName.MATERIAL_RATING_UNSELECTED); + if (unselectedRatingColor != null) { + icon.setIconColor(unselectedRatingColor); + } } } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 0546cb7c0..b1f3c713d 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java index 8516fe9b5..257963d76 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/JsDateRangeMethod.java @@ -7,9 +7,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 11aec9d92918225f70f936285d0ae94f2178c36e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 15 Jan 2019 06:19:58 +0800 Subject: [PATCH 071/247] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac65a99af..54c299a9c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + # gwt-material-addins From 2e5a265054c3f70129caefbc511a2c1c5bad893e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 18 Jan 2019 12:14:25 +0800 Subject: [PATCH 072/247] Fixed Input Masks number components --- .../inputmask/MaterialDoubleInputMask.java | 5 +++- .../inputmask/MaterialFloatInputMask.java | 5 +++- .../inputmask/MaterialIntegerInputMask.java | 9 ++++-- .../inputmask/MaterialLongInputMask.java | 5 +++- .../client/daterange/js/RangeOption.java | 4 +-- .../client/daterange/js/SampleRange.java | 29 +++++++++++++++++++ 6 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/js/SampleRange.java diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java index 91fdff50a..562d691fe 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java @@ -23,7 +23,10 @@ public class MaterialDoubleInputMask extends MaterialInputMask { @Override public Double getValue() { - return Double.parseDouble(getCleanValue()); + if (getCleanValue() != null && !getCleanValue().isEmpty()) { + return Double.parseDouble(getCleanValue()); + } + return null; } @Override diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java index 610d4007a..3f6364201 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java @@ -23,7 +23,10 @@ public class MaterialFloatInputMask extends MaterialInputMask { @Override public Float getValue() { - return Float.parseFloat(getCleanValue()); + if (getCleanValue() != null && !getCleanValue().isEmpty()) { + return Float.parseFloat(getCleanValue()); + } + return null; } @Override diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java index bad5cff84..0604e5942 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java @@ -7,9 +7,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,7 +23,10 @@ public class MaterialIntegerInputMask extends MaterialInputMask { @Override public Integer getValue() { - return Integer.parseInt(getCleanValue()); + if (getCleanValue() != null && !getCleanValue().isEmpty()) { + return Integer.parseInt(getCleanValue()); + } + return null; } @Override diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java index 7e5bc4dea..697f05ae1 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java @@ -23,7 +23,10 @@ public class MaterialLongInputMask extends MaterialInputMask { @Override public Long getValue() { - return Long.parseLong(getCleanValue()); + if (getCleanValue() != null && !getCleanValue().isEmpty()) { + return Long.parseLong(getCleanValue()); + } + return null; } @Override diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java index 79082a392..0dadd3fbc 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/RangeOption.java @@ -41,7 +41,7 @@ private RangeOption() { public static final RangeOption create() { RangeOption range = new RangeOption(); range.Today = new Moment[]{moment(), moment()}; - range.Yesterday = new Moment[]{moment().subtract(1, "days"), moment().subtract(1, "days")}; + range.VeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrvery = new Moment[]{moment().subtract(1, "days"), moment().subtract(1, "days")}; range.Last7Days = new Moment[]{moment().subtract(6, "days"), moment()}; range.Last30Days = new Moment[]{moment().subtract(29, "days"), moment()}; range.ThisMonth = new Moment[]{moment().startOf("month"), moment().endOf("month")}; @@ -53,7 +53,7 @@ public static final RangeOption create() { public Moment[] Today; @JsProperty - public Moment[] Yesterday; + public Moment[] VeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrveryVeryveyrvery; @JsProperty public Moment[] Last7Days; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/SampleRange.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/SampleRange.java new file mode 100644 index 000000000..23016cff4 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/SampleRange.java @@ -0,0 +1,29 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.daterange.js; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class SampleRange { + + +} From 89158b0774e5829fdd583f7555220744e915add6 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 1 Feb 2019 13:36:19 +0800 Subject: [PATCH 073/247] Recaptcha Version 3 JSInteroped --- .../client/google/recaptcha3/ReCaptcha3.java | 115 ++++++++++++++++++ .../google/recaptcha3/api/RecaptchaApi3.java | 38 ++++++ .../constants/ReCaptcha3Actions.java | 28 +++++ .../constants/ReCaptcha3Option.java | 53 ++++++++ .../google/recaptcha3/js/JsReCaptcha3.java | 37 ++++++ 5 files changed, 271 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/google/recaptcha3/ReCaptcha3.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/recaptcha3/api/RecaptchaApi3.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Actions.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Option.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/recaptcha3/js/JsReCaptcha3.java diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/ReCaptcha3.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/ReCaptcha3.java new file mode 100644 index 000000000..fb7b17a5d --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/ReCaptcha3.java @@ -0,0 +1,115 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.recaptcha3; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.user.client.DOM; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.client.ui.MaterialToast; +import gwt.material.design.incubator.client.base.IncubatorWidget; +import gwt.material.design.incubator.client.google.recaptcha.api.RecaptchaApi; +import gwt.material.design.incubator.client.google.recaptcha.js.JsReCaptcha; +import gwt.material.design.incubator.client.google.recaptcha3.api.RecaptchaApi3; +import gwt.material.design.incubator.client.google.recaptcha3.constants.ReCaptcha3Actions; +import gwt.material.design.incubator.client.google.recaptcha3.constants.ReCaptcha3Option; +import gwt.material.design.incubator.client.google.recaptcha3.js.JsReCaptcha3; +import gwt.material.design.jquery.client.api.Functions; + +//@formatter:off + +/** + * reCAPTCHA v3 returns a score for each request without user friction. The score is based on interactions with your + * site and enables you to take an appropriate action for your site. Register reCAPTCHA v3 keys here. + *

+ *

UiBinder

+ *
+ * {@code
+ *      
+ * }
+ * 
+ *

Java - Loading the API

+ *
+ * {@code
+ *  @literal @UiField
+ *      ReCaptcha recaptcha;
+ *
+ *      // Load the Api
+ *      RecaptchaApi recaptchaApi = new RecaptchaApi("6LeZSRIUAAAAAE3JdZpdi6shhA87ZUG4U2ICsGlJ");
+ *      ApiRegistry.register(recaptchaApi, new Callback() {
+ *         @literal @Override
+ *          public void onFailure(Exception reason) {
+ *              MaterialToast.fireToast(reason.getMessage());
+ *          }
+ *
+ *         @literal @Override
+ *          public void onSuccess(Void result) {
+ *              recaptcha.load(recaptchaApi);
+ *          }
+ *      });
+ * }
+ * 
+ *

+ *

+ * Note: This component is under the incubation process and subject to change. + *

+ * + * @author kevzlou7979 + */ +//@formatter:on +public class ReCaptcha3 extends MaterialWidget { + + static { + IncubatorWidget.showWarning(ReCaptcha3.class); + } + + private ReCaptcha3Option option = ReCaptcha3Option.create(); + + public ReCaptcha3() { + super(Document.get().createDivElement()); + } + + /** + * A function to load the recaptcha api. + * @param recaptchaApi A class containing the Api Key and Url + * @param callback A callback function to return the token to be verified by the server. + */ + public void load(RecaptchaApi3 recaptchaApi, Functions.Func1 callback) { + JsReCaptcha3.ready(() -> { + JsReCaptcha3.execute(recaptchaApi.getApiKey(), option).then((object) -> { + callback.call(object != null ? object.toString() : null); + return object; + }); + }); + } + + /** + * Will get the option for the Recaptcha3 + */ + public ReCaptcha3Option getOption() { + return option; + } + + /** + * Will set the option for the Recaptcha3 + */ + public void setOption(ReCaptcha3Option option) { + this.option = option; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/api/RecaptchaApi3.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/api/RecaptchaApi3.java new file mode 100644 index 000000000..4f73a56ac --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/api/RecaptchaApi3.java @@ -0,0 +1,38 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.recaptcha3.api; + +import gwt.material.design.client.api.google.maps.GoogleApi; + +public class RecaptchaApi3 extends GoogleApi { + + public RecaptchaApi3(String apiKey) { + super(apiKey); + } + + public String constructApiUrl() { + return getApiUrl() + getApiKey(); + } + + @Override + public String getApiUrl() { + return "https://www.google.com/recaptcha/api.js?render="; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Actions.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Actions.java new file mode 100644 index 000000000..c7dc12737 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Actions.java @@ -0,0 +1,28 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.recaptcha3.constants; + +public interface ReCaptcha3Actions { + + String HOMEPAGE = "homepage"; + String LOGIN = "login"; + String SOCIAL = "social"; + String E_COMMERCE = "e-commerce"; +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Option.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Option.java new file mode 100644 index 000000000..798e6701f --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/constants/ReCaptcha3Option.java @@ -0,0 +1,53 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.recaptcha3.constants; + + +import gwt.material.design.incubator.client.google.recaptcha.ReCaptcha; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class ReCaptcha3Option { + + private ReCaptcha3Option() {} + + @JsOverlay + public final static ReCaptcha3Option create() { + ReCaptcha3Option option = new ReCaptcha3Option(); + option.setAction(ReCaptcha3Actions.LOGIN); + return option; + } + + @JsProperty + private String action; + + @JsOverlay + public final String getAction() { + return action; + } + + @JsOverlay + public final void setAction(String action) { + this.action = action; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/js/JsReCaptcha3.java b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/js/JsReCaptcha3.java new file mode 100644 index 000000000..8dd35baf9 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/recaptcha3/js/JsReCaptcha3.java @@ -0,0 +1,37 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.recaptcha3.js; + +import gwt.material.design.incubator.client.google.recaptcha3.constants.ReCaptcha3Option; +import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jquery.client.api.Promise; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, namespace = JsPackage.GLOBAL) +public class JsReCaptcha3 { + + @JsMethod(namespace = "grecaptcha") + public static native void ready(Functions.Func callback); + + @JsMethod(namespace = "grecaptcha") + public static native Promise execute(String key, ReCaptcha3Option option); +} From d5f6efe317a19437f70f0d71f62f183cde98c74e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 19 Feb 2019 13:59:47 +0800 Subject: [PATCH 074/247] Check Mark initial poc --- .../client/animation/checkmark/CheckMark.java | 86 ++++++ .../checkmark/CheckMarkClientBundle.java | 38 +++ .../checkmark/CheckMarkClientDebugBundle.java | 38 +++ .../checkmark/resources/css/checkmark.css | 279 ++++++++++++++++++ .../checkmark/resources/css/checkmark.min.css | 1 + 5 files changed, 442 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java create mode 100644 src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java new file mode 100644 index 000000000..403863490 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java @@ -0,0 +1,86 @@ +package gwt.material.design.incubator.client.animation.checkmark; + +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.dom.client.Document; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.HasDelayTransition; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.client.base.helper.ColorHelper; +import gwt.material.design.client.base.mixin.ToggleStyleMixin; +import gwt.material.design.client.constants.Color; +import gwt.material.design.client.ui.html.Div; +import gwt.material.design.client.ui.html.Span; +import gwt.material.design.incubator.client.AddinsIncubator; + +public class CheckMark extends MaterialWidget implements HasDelayTransition { + + static { + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(CheckMarkClientDebugBundle.INSTANCE.checkMarkDebugCss()); + } else { + MaterialDesignBase.injectCss(CheckMarkClientBundle.INSTANCE.checkMarkCss()); + } + } + + static String CHECK_MARK = "check-mark"; + static String HIDE = "hide"; + + private Div iconWrapper = new Div(); + private Span tipLine = new Span(); + private Span longLine = new Span(); + private Div placeholder = new Div(); + private Div fixLine = new Div(); + + private int delayInMillis; + + private ToggleStyleMixin toggleStyleMixin; + + public CheckMark() { + super(Document.get().createDivElement(), CHECK_MARK); + + iconWrapper.addStyleName("sa-icon sa-success animate"); + tipLine.addStyleName("sa-line sa-tip animateSuccessTip"); + longLine.addStyleName("sa-line sa-long animateSuccessLong"); + placeholder.addStyleName("sa-placeholder"); + fixLine.addStyleName("sa-fix"); + } + + @Override + protected void onLoad() { + super.onLoad(); + + add(iconWrapper); + iconWrapper.add(tipLine); + iconWrapper.add(longLine); + iconWrapper.add(placeholder); + iconWrapper.add(fixLine); + } + + public void animate() { + Scheduler.get().scheduleFixedDelay(() -> { + getToggleStyleMixin().setOn(false); + return false; + }, delayInMillis); + } + + public void reset() { + getToggleStyleMixin().setOn(true); + } + + public ToggleStyleMixin getToggleStyleMixin() { + if (toggleStyleMixin == null) { + toggleStyleMixin = new ToggleStyleMixin<>(this, HIDE); + } + return toggleStyleMixin; + } + + @Override + public void setDelay(int delayInMillis) { + this.delayInMillis = delayInMillis; + } + + @Override + public int getDelay() { + return delayInMillis; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java new file mode 100644 index 000000000..37150aaa6 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java @@ -0,0 +1,38 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.animation.checkmark; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.daterange.DateRangePicker; + +/** + * Client Bundle for {@link CheckMark} + * + * @author kevzlou7979 + */ +public interface CheckMarkClientBundle extends ClientBundle { + + CheckMarkClientBundle INSTANCE = GWT.create(CheckMarkClientBundle.class); + + @Source("resources/css/checkmark.min.css") + TextResource checkMarkCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java new file mode 100644 index 000000000..bf33e83c4 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java @@ -0,0 +1,38 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.animation.checkmark; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.daterange.DateRangePicker; + +/** + * Client Bundle for {@link CheckMark} + * + * @author kevzlou7979 + */ +public interface CheckMarkClientDebugBundle extends ClientBundle { + + CheckMarkClientDebugBundle INSTANCE = GWT.create(CheckMarkClientDebugBundle.class); + + @Source("resources/css/checkmark.css") + TextResource checkMarkDebugCss(); +} diff --git a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css new file mode 100644 index 000000000..0e76573da --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css @@ -0,0 +1,279 @@ +.check_mark { + width: 80px; + height: 130px; + margin: 0 auto; +} + +button { + cursor: pointer; + margin-left: 15px; +} + +.hide{ + display:none; +} + +.sa-icon { + width: 80px; + height: 80px; + border: 4px solid #4CAF50; + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + margin: 20px auto; + padding: 0; + position: relative; + box-sizing: content-box; +} + +.sa-icon.sa-success { + border-color: #4CAF50; +} + +.sa-icon.sa-success::before, .sa-icon.sa-success::after { + content: ''; + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + position: absolute; + width: 60px; + height: 120px; + background: white; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.sa-icon.sa-success::before { + -webkit-border-radius: 120px 0 0 120px; + border-radius: 120px 0 0 120px; + top: -7px; + left: -33px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; +} + +.sa-icon.sa-success::after { + -webkit-border-radius: 0 120px 120px 0; + border-radius: 0 120px 120px 0; + top: -11px; + left: 30px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 0px 60px; + transform-origin: 0px 60px; +} + +.sa-icon.sa-success .sa-placeholder { + width: 80px; + height: 80px; + border: 4px solid rgba(76, 175, 80, .5); + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + box-sizing: content-box; + position: absolute; + left: -4px; + top: -4px; + z-index: 2; +} + +.sa-icon.sa-success .sa-fix { + width: 5px; + height: 90px; + background-color: white; + position: absolute; + left: 28px; + top: 8px; + z-index: 1; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +.sa-icon.sa-success.animate::after { + -webkit-animation: rotatePlaceholder 4.25s ease-in; + animation: rotatePlaceholder 4.25s ease-in; +} + +.sa-icon.sa-success { + border-color: transparent\9; +} +.sa-icon.sa-success .sa-line.sa-tip { + -ms-transform: rotate(45deg) \9; +} +.sa-icon.sa-success .sa-line.sa-long { + -ms-transform: rotate(-45deg) \9; +} + +.animateSuccessTip { + -webkit-animation: animateSuccessTip 0.75s; + animation: animateSuccessTip 0.75s; +} + +.animateSuccessLong { + -webkit-animation: animateSuccessLong 0.75s; + animation: animateSuccessLong 0.75s; +} + +@-webkit-keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; + } + 65% { + width: 0; + right: 46px; + top: 54px; + } + 84% { + width: 55px; + right: 0px; + top: 35px; + } + 100% { + width: 47px; + right: 8px; + top: 38px; + } +} +@-webkit-keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; + } + 54% { + width: 0; + left: 1px; + top: 19px; + } + 70% { + width: 50px; + left: -8px; + top: 37px; + } + 84% { + width: 17px; + left: 21px; + top: 48px; + } + 100% { + width: 25px; + left: 14px; + top: 45px; + } +} +@keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; + } + 54% { + width: 0; + left: 1px; + top: 19px; + } + 70% { + width: 50px; + left: -8px; + top: 37px; + } + 84% { + width: 17px; + left: 21px; + top: 48px; + } + 100% { + width: 25px; + left: 14px; + top: 45px; + } +} + +@keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; + } + 65% { + width: 0; + right: 46px; + top: 54px; + } + 84% { + width: 55px; + right: 0px; + top: 35px; + } + 100% { + width: 47px; + right: 8px; + top: 38px; + } +} + +.sa-icon.sa-success .sa-line { + height: 5px; + background-color: #4CAF50; + display: block; + border-radius: 2px; + position: absolute; + z-index: 2; +} + +.sa-icon.sa-success .sa-line.sa-tip { + width: 25px; + left: 14px; + top: 46px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.sa-icon.sa-success .sa-line.sa-long { + width: 47px; + right: 8px; + top: 38px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +@-webkit-keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } +} +@keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css new file mode 100644 index 000000000..756a03726 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css @@ -0,0 +1 @@ +.check_mark{width:80px;height:130px;margin:0 auto}button{cursor:pointer;margin-left:15px}.hide{display:none}.sa-icon{width:80px;height:80px;border:4px solid #4CAF50;-webkit-border-radius:40px;border-radius:50%;margin:20px auto;padding:0;position:relative;box-sizing:content-box}.sa-icon.sa-success{border-color:#4CAF50}.sa-icon.sa-success::after,.sa-icon.sa-success::before{content:'';position:absolute;width:60px;height:120px;background:#fff}.sa-icon.sa-success::before{-webkit-border-radius:120px 0 0 120px;border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.sa-icon.sa-success::after{-webkit-border-radius:0 120px 120px 0;border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px}.sa-icon.sa-success .sa-placeholder{width:80px;height:80px;border:4px solid rgba(76,175,80,.5);-webkit-border-radius:40px;border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.sa-icon.sa-success .sa-fix{width:5px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.sa-icon.sa-success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}.sa-icon.sa-success{border-color:transparent\9}.sa-icon.sa-success .sa-line.sa-tip{-ms-transform:rotate(45deg)\9}.sa-icon.sa-success .sa-line.sa-long{-ms-transform:rotate(-45deg)\9}.animateSuccessTip{-webkit-animation:animateSuccessTip .75s;animation:animateSuccessTip .75s}.animateSuccessLong{-webkit-animation:animateSuccessLong .75s;animation:animateSuccessLong .75s}@-webkit-keyframes animateSuccessLong{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@-webkit-keyframes animateSuccessTip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animateSuccessTip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animateSuccessLong{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}.sa-icon.sa-success .sa-line{height:5px;background-color:#4CAF50;display:block;border-radius:2px;position:absolute;z-index:2}.sa-icon.sa-success .sa-line.sa-tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.sa-icon.sa-success .sa-line.sa-long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}@-webkit-keyframes rotatePlaceholder{0%,5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}100%,12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%,5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}100%,12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}} \ No newline at end of file From df4746f91cdc998ce7b1aad038d741256123b5ce Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 6 Mar 2019 09:12:57 +0800 Subject: [PATCH 075/247] Added setSingleValue on Date Range Picker. --- .../client/daterange/DateRangePicker.java | 32 +++++++++++++++++-- .../daterange/js/HasDateRangeOptions.java | 9 ++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index b1f3c713d..9c797a91c 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -7,9 +7,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. @@ -85,6 +85,7 @@ public class DateRangePicker extends AbstractValueWidget implements HasD private MaterialLabel errorLabel = new MaterialLabel(); private MaterialIcon icon = new MaterialIcon(); private DateRangeOptions options = new DateRangeOptions(); + private double addedOffsetHeight = 480; private Date startDate; private Date endDate; private Date[] value; @@ -191,7 +192,7 @@ protected void detectPosition() { } public boolean isInVerticalViewPort() { - return scrollHelper.isInViewPort(getElement(), 480); + return scrollHelper.isInViewPort(getElement(), addedOffsetHeight); } protected void toggleTypeAssist() { @@ -492,6 +493,21 @@ public void setValue(Date[] value, boolean fireEvents) { super.setValue(value, fireEvents); } + public void setSingleValue(Date value) { + setValue(new Date[]{value}, false); + } + + public void setSingleValue(Date value, boolean fireEvents) { + setValue(new Date[]{value}, fireEvents); + } + + public Date getSingleValue() { + if (getValue().length >= 1) { + return getValue()[0]; + } + return null; + } + @Override public Date[] getValue() { return value; @@ -630,6 +646,16 @@ public void setPlaceholder(String placeholder) { label.setText(placeholder); } + @Override + public double getAddedOffsetHeight() { + return addedOffsetHeight; + } + + @Override + public void setAddedOffsetHeight(double addedOffsetHeight) { + this.addedOffsetHeight = addedOffsetHeight; + } + @Override public void setNativeBrowserStyle(boolean nativeBrowserStyle) { getNativeBrowserStyleMixin().setNativeBrowserStyle(nativeBrowserStyle); diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java index 6123014d5..8f3d08d3c 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/js/HasDateRangeOptions.java @@ -19,6 +19,7 @@ */ package gwt.material.design.incubator.client.daterange.js; +import gwt.material.design.incubator.client.daterange.DateRangePicker; import gwt.material.design.jquery.client.api.Functions; import java.util.Date; @@ -232,4 +233,12 @@ public interface HasDateRangeOptions { * 'body' */ void setParentEl(String parentEl); + + double getAddedOffsetHeight(); + + /** + * Added height to detect dynamic positioning when opening the daterangepicker + * @see {@link DateRangePicker#isInVerticalViewPort()} + */ + void setAddedOffsetHeight(double addedOffsetHeight); } From 985b49e1b520cceb51dd5d529c9d277dacdffb6f Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 14 Mar 2019 14:51:35 +0800 Subject: [PATCH 076/247] Stability fixes for Inputmasks --- .../client/inputmask/AbstractInputMask.java | 218 ++++++++++++++ .../inputmask/MaterialDateInputMask.java | 2 +- .../inputmask/MaterialDoubleInputMask.java | 19 +- .../inputmask/MaterialFloatInputMask.java | 19 +- .../client/inputmask/MaterialInputMask.java | 198 +------------ .../inputmask/MaterialIntegerInputMask.java | 19 +- .../inputmask/MaterialLongInputMask.java | 19 +- .../inputmask/base/DateInputParser.java | 5 +- .../client/inputmask/js/JsInputMask.java | 3 + .../client/animation/checkmark/CheckMark.java | 19 ++ .../client/dob/DateOfBirthPicker.java | 232 +++++++++++++++ .../dob/DateOfBirthPickerClientBundle.java | 38 +++ .../DateOfBirthPickerDebugClientBundle.java | 38 +++ .../client/dob/DefaultMonthDataProvider.java | 43 +++ .../client/dob/MonthDataProvider.java} | 13 +- .../checkmark/resources/css/checkmark.css | 12 +- .../checkmark/resources/css/checkmark.min.css | 280 +++++++++++++++++- .../client/dob/resources/css/dob.css | 3 + .../client/dob/resources/css/dob.min.css | 3 + .../client/ui/MaterialInputMaskTest.java | 18 +- 20 files changed, 950 insertions(+), 251 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java create mode 100644 src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java create mode 100644 src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java rename src/main/java/gwt/material/design/{addins/client/inputmask/MaterialTextInputMask.java => incubator/client/dob/MonthDataProvider.java} (70%) create mode 100644 src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java new file mode 100644 index 000000000..caf3c2680 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java @@ -0,0 +1,218 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.inputmask; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.ValueBoxBase; +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.inputmask.events.*; +import gwt.material.design.addins.client.inputmask.js.JsInputMaskOptions; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.JsLoader; +import gwt.material.design.client.constants.InputType; +import gwt.material.design.client.ui.MaterialValueBox; + +import static gwt.material.design.addins.client.inputmask.js.JsInputMask.$; + +//@formatter:off + +/** + * An input mask helps the user with the input by ensuring a predefined format. + * This can be useful for dates, numerics, phone numbers etc... + *

+ *

XML Namespace Declaration

+ *
+ * {@code
+ * xmlns:ma='urn:import:gwt.material.design.addins.client'
+ * }
+ * 
+ *

+ *

UiBinder Usage:

+ *
+ * {@code
+ * 
+ * 
+ * 
+ * 
+ * }
+ * 
+ * + * @author kevzlou7979 + * @see Material Input Fields + * @see jQuery-Mask-Plugin 1.14.10 + */ +//@formatter:on +public class AbstractInputMask extends MaterialValueBox + implements JsLoader, HasInputMaskHandlers { + + static { + if (MaterialAddins.isDebug()) { + MaterialDesignBase.injectDebugJs(MaterialInputMaskDebugClientBundle.INSTANCE.inputMaskDebugJs()); + } else { + MaterialDesignBase.injectJs(MaterialInputMaskClientBundle.INSTANCE.inputMaskJs()); + } + } + + private String mask; + private JsInputMaskOptions options = new JsInputMaskOptions(); + + public AbstractInputMask() { + super((ValueBoxBase) new TextBox()); + } + + public AbstractInputMask(ValueBoxBase valueBoxBase) { + setup(valueBoxBase); + } + + public void setup(ValueBoxBase tValueBox) { + valueBoxBase = tValueBox; + add(valueBoxBase); + setType(InputType.TEXT); + } + + @Override + protected void onLoad() { + super.onLoad(); + + load(); + } + + @Override + public void load() { + if (mask == null || mask.isEmpty()) { + GWT.log("You must provide a mask pattern in order to mask your field"); + } else { + load(mask); + } + } + + /** + * Mask the input field with given mask value. + */ + public void load(String mask) { + options.onComplete = object -> CompleteEvent.fire(this, object); + options.onKeyPress = object -> KeyPressEvent.fire(this, object); + options.onChange = object -> ChangeEvent.fire(this, object); + options.onInvalid = (object, event, function, error) -> InvalidEvent.fire(this, object, error[0]); + $(valueBoxBase.getElement()).mask(mask, options); + } + + @Override + protected void onUnload() { + super.onUnload(); + + unload(); + } + + @Override + public void unload() { + $(valueBoxBase.getElement()).unmask(); + } + + @Override + public void reload() { + unload(); + load(); + } + + public String getMask() { + return mask; + } + + /** + * Set the mask pattern to apply into the text field + */ + public void setMask(String mask) { + this.mask = mask; + } + + public boolean isReverse() { + return options.reverse; + } + + /** + * The mask will be placed from the right to the left if reverse is true (Default : false) + */ + public void setReverse(boolean reverse) { + options.reverse = reverse; + } + + public boolean isClearIfNotMatch() { + return options.clearIfNotMatch; + } + + /** + * The textfield will automatically clears whenever the value is not match with the mask provided. (Default : false) + */ + public void setClearIfNotMatch(boolean clearIfNotMatch) { + options.clearIfNotMatch = clearIfNotMatch; + } + + public boolean isSelectOnFocus() { + return options.selectOnFocus; + } + + /** + * Set whether you want to set on focus on your mask for easy selection. + */ + public void setSelectOnFocus(boolean selectOnFocus) { + options.selectOnFocus = selectOnFocus; + } + + /** + * Gets the value of the field without the mask. + */ + public String getCleanValue() { + return valueBoxBase.isAttached() ? $(valueBoxBase.getElement()).cleanVal() : null; + } + + public String getValueWithMask() { + return valueBoxBase.getText(); + } + + @Override + public void setValue(T value) { + super.setValue(value); + + $(valueBoxBase.getElement()).trigger("input", null); + } + + @Override + public HandlerRegistration addCompleteHandler(CompleteEvent.CompleteHandler handler) { + return addHandler(handler, CompleteEvent.TYPE); + } + + @Override + public HandlerRegistration addChangeHandler(ChangeEvent.ChangeHandler handler) { + return addHandler(handler, ChangeEvent.TYPE); + } + + @Override + public HandlerRegistration addInvalidHandler(InvalidEvent.InvalidHandler handler) { + return addHandler(handler, InvalidEvent.TYPE); + } + + @Override + public HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler) { + return addHandler(handler, KeyPressEvent.TYPE); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java index 53c7d2084..3a884c121 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDateInputMask.java @@ -23,7 +23,7 @@ import java.util.Date; -public class MaterialDateInputMask extends MaterialInputMask { +public class MaterialDateInputMask extends AbstractInputMask { private String format = "MM/dd/yyyy"; private DateInputParser dateInputParser = new DateInputParser(this); diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java index 562d691fe..6bff60d25 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialDoubleInputMask.java @@ -19,18 +19,21 @@ */ package gwt.material.design.addins.client.inputmask; -public class MaterialDoubleInputMask extends MaterialInputMask { +import gwt.material.design.client.base.NumberBox; +import gwt.material.design.client.ui.MaterialLongBox; + +public class MaterialDoubleInputMask extends AbstractInputMask { + + public MaterialDoubleInputMask() { + super(new NumberBox<>(new NumberBox.NumberHandler<>(new MaterialLongBox()))); + } @Override public Double getValue() { - if (getCleanValue() != null && !getCleanValue().isEmpty()) { - return Double.parseDouble(getCleanValue()); + String cleanValue = getCleanValue(); + if (cleanValue != null) { + return Double.parseDouble(cleanValue); } return null; } - - @Override - public void setValue(Double value) { - super.setValue(Double.parseDouble(getCleanValue())); - } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java index 3f6364201..3f68bc61c 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialFloatInputMask.java @@ -19,18 +19,21 @@ */ package gwt.material.design.addins.client.inputmask; -public class MaterialFloatInputMask extends MaterialInputMask { +import gwt.material.design.client.base.NumberBox; +import gwt.material.design.client.ui.MaterialFloatBox; + +public class MaterialFloatInputMask extends AbstractInputMask { + + public MaterialFloatInputMask() { + super(new NumberBox<>(new NumberBox.NumberHandler<>(new MaterialFloatBox()))); + } @Override public Float getValue() { - if (getCleanValue() != null && !getCleanValue().isEmpty()) { - return Float.parseFloat(getCleanValue()); + String cleanValue = getCleanValue(); + if (cleanValue != null) { + return Float.parseFloat(cleanValue); } return null; } - - @Override - public void setValue(Float value) { - super.setValue(Float.parseFloat(getCleanValue())); - } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java index 8158e5cf6..dc167240a 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java @@ -1,203 +1,17 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ package gwt.material.design.addins.client.inputmask; -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.ValueBoxBase; -import gwt.material.design.addins.client.MaterialAddins; -import gwt.material.design.addins.client.inputmask.events.*; -import gwt.material.design.addins.client.inputmask.js.JsInputMaskOptions; -import gwt.material.design.client.MaterialDesignBase; -import gwt.material.design.client.base.JsLoader; -import gwt.material.design.client.constants.InputType; -import gwt.material.design.client.ui.MaterialValueBox; - import static gwt.material.design.addins.client.inputmask.js.JsInputMask.$; -//@formatter:off - -/** - * An input mask helps the user with the input by ensuring a predefined format. - * This can be useful for dates, numerics, phone numbers etc... - *

- *

XML Namespace Declaration

- *
- * {@code
- * xmlns:ma='urn:import:gwt.material.design.addins.client'
- * }
- * 
- *

- *

UiBinder Usage:

- *
- * {@code
- * 
- * 
- * 
- * 
- * }
- * 
- * - * @author kevzlou7979 - * @see Material Input Fields - * @see jQuery-Mask-Plugin 1.14.10 - */ -//@formatter:on -public class MaterialInputMask extends MaterialValueBox - implements JsLoader, HasInputMaskHandlers { - - static { - if (MaterialAddins.isDebug()) { - MaterialDesignBase.injectDebugJs(MaterialInputMaskDebugClientBundle.INSTANCE.inputMaskDebugJs()); - } else { - MaterialDesignBase.injectJs(MaterialInputMaskClientBundle.INSTANCE.inputMaskJs()); - } - } - - private String mask; - private JsInputMaskOptions options = new JsInputMaskOptions(); - - public MaterialInputMask() { - setup((ValueBoxBase) new TextBox()); - } - - public void setup(ValueBoxBase tValueBox) { - valueBoxBase = tValueBox; - add(valueBoxBase); - setType(InputType.TEXT); - } - - @Override - protected void onLoad() { - super.onLoad(); - - load(); - } - - @Override - public void load() { - if (mask == null || mask.isEmpty()) { - GWT.log("You must provide a mask pattern in order to mask your field"); - } else { - load(mask); - } - } - - /** - * Mask the input field with given mask value. - */ - public void load(String mask) { - options.onComplete = object -> CompleteEvent.fire(this, object); - options.onKeyPress = object -> KeyPressEvent.fire(this, object); - options.onChange = object -> ChangeEvent.fire(this, object); - options.onInvalid = (object, event, function, error) -> InvalidEvent.fire(this, object, error[0]); - $(valueBoxBase.getElement()).mask(mask, options); - } - - @Override - protected void onUnload() { - super.onUnload(); - - unload(); - } - - @Override - public void unload() { - $(valueBoxBase.getElement()).unmask(); - } - - @Override - public void reload() { - unload(); - load(); - } - - public String getMask() { - return mask; - } - - /** - * Set the mask pattern to apply into the text field - */ - public void setMask(String mask) { - this.mask = mask; - } - - public boolean isReverse() { - return options.reverse; - } - - /** - * The mask will be placed from the right to the left if reverse is true (Default : false) - */ - public void setReverse(boolean reverse) { - options.reverse = reverse; - } - - public boolean isClearIfNotMatch() { - return options.clearIfNotMatch; - } - - /** - * The textfield will automatically clears whenever the value is not match with the mask provided. (Default : false) - */ - public void setClearIfNotMatch(boolean clearIfNotMatch) { - options.clearIfNotMatch = clearIfNotMatch; - } - - public boolean isSelectOnFocus() { - return options.selectOnFocus; - } - - /** - * Set whether you want to set on focus on your mask for easy selection. - */ - public void setSelectOnFocus(boolean selectOnFocus) { - options.selectOnFocus = selectOnFocus; - } - - /** - * Gets the value of the field without the mask. - */ - public String getCleanValue() { - return $(valueBoxBase.getElement()).cleanVal(); - } - - @Override - public HandlerRegistration addCompleteHandler(CompleteEvent.CompleteHandler handler) { - return addHandler(handler, CompleteEvent.TYPE); - } - - @Override - public HandlerRegistration addChangeHandler(ChangeEvent.ChangeHandler handler) { - return addHandler(handler, ChangeEvent.TYPE); - } +public class MaterialInputMask extends AbstractInputMask { @Override - public HandlerRegistration addInvalidHandler(InvalidEvent.InvalidHandler handler) { - return addHandler(handler, InvalidEvent.TYPE); + public void setValue(String value) { + super.setValue(value); + $(valueBoxBase.getElement()).trigger("input", null); } @Override - public HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler) { - return addHandler(handler, KeyPressEvent.TYPE); + public String getValue() { + return getCleanValue(); } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java index 0604e5942..f8f0da5bb 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java @@ -19,18 +19,21 @@ */ package gwt.material.design.addins.client.inputmask; -public class MaterialIntegerInputMask extends MaterialInputMask { +import gwt.material.design.client.base.NumberBox; +import gwt.material.design.client.ui.MaterialIntegerBox; + +public class MaterialIntegerInputMask extends AbstractInputMask { + + public MaterialIntegerInputMask() { + super(new NumberBox<>(new NumberBox.NumberHandler<>(new MaterialIntegerBox()))); + } @Override public Integer getValue() { - if (getCleanValue() != null && !getCleanValue().isEmpty()) { - return Integer.parseInt(getCleanValue()); + String cleanValue = getCleanValue(); + if (cleanValue != null) { + return Integer.parseInt(cleanValue); } return null; } - - @Override - public void setValue(Integer value) { - super.setValue(Integer.parseInt(getCleanValue())); - } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java index 697f05ae1..a9c044fec 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialLongInputMask.java @@ -19,18 +19,21 @@ */ package gwt.material.design.addins.client.inputmask; -public class MaterialLongInputMask extends MaterialInputMask { +import gwt.material.design.client.base.NumberBox; +import gwt.material.design.client.ui.MaterialLongBox; + +public class MaterialLongInputMask extends AbstractInputMask { + + public MaterialLongInputMask() { + super(new NumberBox<>(new NumberBox.NumberHandler<>(new MaterialLongBox()))); + } @Override public Long getValue() { - if (getCleanValue() != null && !getCleanValue().isEmpty()) { - return Long.parseLong(getCleanValue()); + String cleanValue = getCleanValue(); + if (cleanValue != null) { + return Long.parseLong(cleanValue); } return null; } - - @Override - public void setValue(Long value) { - super.setValue(Long.parseLong(getCleanValue())); - } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java index e634cf8b0..07c713314 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/base/DateInputParser.java @@ -20,12 +20,11 @@ package gwt.material.design.addins.client.inputmask.base; import com.google.gwt.i18n.client.DateTimeFormat; -import gwt.material.design.addins.client.inputmask.MaterialInputMask; -import gwt.material.design.client.ui.MaterialToast; +import gwt.material.design.addins.client.inputmask.AbstractInputMask; import java.util.Date; -public class DateInputParser { +public class DateInputParser { private final T valuebox; diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/js/JsInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/js/JsInputMask.java index 75b91d21d..e5deac070 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/js/JsInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/js/JsInputMask.java @@ -45,6 +45,9 @@ public class JsInputMask extends JQueryElement { @JsMethod public native JQueryElement mask(String mask); + @JsMethod + public native JQueryElement masked(String masked); + @JsMethod public native JQueryElement mask(String mask, JsInputMaskOptions options); diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java index 403863490..8448efa5a 100644 --- a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.animation.checkmark; import com.google.gwt.core.client.Scheduler; diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java new file mode 100644 index 000000000..2d8257e5d --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -0,0 +1,232 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.dob; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Style; +import gwt.material.design.addins.client.combobox.MaterialComboBox; +import gwt.material.design.addins.client.inputmask.MaterialIntegerInputMask; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.*; +import gwt.material.design.client.base.mixin.FieldTypeMixin; +import gwt.material.design.client.constants.*; +import gwt.material.design.client.ui.MaterialIcon; +import gwt.material.design.incubator.client.AddinsIncubator; + +import java.util.Date; + +public class DateOfBirthPicker extends AbstractValueWidget implements HasFieldTypes, HasIcon, HasReadOnly, HasPlaceholder { + + static { + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(DateOfBirthPickerDebugClientBundle.INSTANCE.dobDebugCss()); + } else { + MaterialDesignBase.injectCss(DateOfBirthPickerClientBundle.INSTANCE.dobCss()); + } + } + + private MonthDataProvider dataProvider = new DefaultMonthDataProvider(); + private MaterialComboBox month = new MaterialComboBox(); + private MaterialIntegerInputMask day = new MaterialIntegerInputMask(); + private MaterialIntegerInputMask year = new MaterialIntegerInputMask(); + + private FieldTypeMixin fieldTypeMixin; + + public DateOfBirthPicker() { + super(Document.get().createDivElement(), CssName.ROW); + + setupMonth(); + setupDay(); + setupYear(); + addStyleName("dob-container"); + } + + @Override + protected void onLoad() { + super.onLoad(); + + add(month); + add(day); + add(year); + } + + protected void setupMonth() { + month.addStyleName("dob-month"); + if (dataProvider.get().size() > 12) { + setErrorText("Months must be equal to 12"); + } else { + for (Integer index : dataProvider.get().keySet()) { + month.addItem(dataProvider.get().get(index), index); + } + } + month.setLabel("Birthdate"); + month.setGrid("s6"); + } + + protected void setupDay() { + day.addStyleName("dob-day"); + day.setMask("00"); + day.setFloat(Style.Float.LEFT); + day.setTextAlign(TextAlign.CENTER); + day.setPlaceholder("DD"); + day.setGrid("s2"); + } + + protected void setupYear() { + year.addStyleName("dob-year"); + year.setMask("0000"); + year.setFloat(Style.Float.LEFT); + year.setTextAlign(TextAlign.CENTER); + year.setPlaceholder("YYYY"); + year.setGrid("s4"); + } + + @Override + public Date getValue() { + Integer yearValue = year.getValue(); + Integer monthValue = month.getSingleValue(); + Integer dayValue = day.getValue(); + if (yearValue != null && monthValue != null && dayValue != null) { + return new Date(yearValue - 1900, monthValue, dayValue); + } + return null; + } + + @Override + public void setValue(Date value) { + year.setValue(value.getYear() + 1900); + day.setValue(value.getDay()); + month.setSingleValue(value.getMonth()); + } + + @Override + public void setFieldType(FieldType type) { + month.setFieldType(type); + day.setFieldType(type); + year.setFieldType(type); + } + + @Override + public FieldType getFieldType() { + return getFieldTypeMixin().getFieldType(); + } + + @Override + public void setLabelWidth(double percentWidth) { + getFieldTypeMixin().setLabelWidth(percentWidth); + } + + @Override + public void setFieldWidth(double percentWidth) { + getFieldTypeMixin().setLabelWidth(percentWidth); + } + + @Override + public MaterialIcon getIcon() { + return null; + } + + @Override + public void setIconType(IconType iconType) { + + } + + @Override + public void setIconPosition(IconPosition position) { + + } + + @Override + public void setIconSize(IconSize size) { + + } + + @Override + public void setIconFontSize(double size, Style.Unit unit) { + + } + + @Override + public void setIconColor(Color iconColor) { + + } + + @Override + public Color getIconColor() { + return null; + } + + @Override + public void setIconPrefix(boolean prefix) { + + } + + @Override + public boolean isIconPrefix() { + return false; + } + + @Override + public void setCustomIconType(String iconType) { + + } + + @Override + public String getCustomIconType() { + return null; + } + + @Override + public String getPlaceholder() { + return null; + } + + @Override + public void setPlaceholder(String placeholder) { + + } + + @Override + public void setReadOnly(boolean value) { + + } + + @Override + public boolean isReadOnly() { + return false; + } + + @Override + public void setToggleReadOnly(boolean toggle) { + + } + + @Override + public boolean isToggleReadOnly() { + return false; + } + + public FieldTypeMixin getFieldTypeMixin() { + if (fieldTypeMixin == null) { + fieldTypeMixin = new FieldTypeMixin<>(this); + } + return fieldTypeMixin; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerClientBundle.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerClientBundle.java new file mode 100644 index 000000000..b413e35ef --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerClientBundle.java @@ -0,0 +1,38 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.dob; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.daterange.DateRangePicker; + +/** + * Client Bundle for {@link DateRangePicker} + * + * @author kevzlou7979 + */ +public interface DateOfBirthPickerClientBundle extends ClientBundle { + + DateOfBirthPickerClientBundle INSTANCE = GWT.create(DateOfBirthPickerClientBundle.class); + + @Source("resources/css/dob.min.css") + TextResource dobCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerDebugClientBundle.java new file mode 100644 index 000000000..302f111bd --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPickerDebugClientBundle.java @@ -0,0 +1,38 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.dob; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.daterange.DateRangePicker; + +/** + * Client Bundle for {@link DateRangePicker} + * + * @author kevzlou7979 + */ +public interface DateOfBirthPickerDebugClientBundle extends ClientBundle { + + DateOfBirthPickerDebugClientBundle INSTANCE = GWT.create(DateOfBirthPickerDebugClientBundle.class); + + @Source("resources/css/dob.css") + TextResource dobDebugCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java b/src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java new file mode 100644 index 000000000..bc2de45f3 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java @@ -0,0 +1,43 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.dob; + +import java.util.HashMap; +import java.util.Map; + +public class DefaultMonthDataProvider implements MonthDataProvider { + @Override + public Map get() { + Map months = new HashMap<>(); + months.put(0, "January"); + months.put(1, "February"); + months.put(2, "March"); + months.put(3, "April"); + months.put(4, "May"); + months.put(5, "June"); + months.put(6, "July"); + months.put(7, "August"); + months.put(8, "September"); + months.put(9, "October"); + months.put(10, "November"); + months.put(11, "December"); + return months; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialTextInputMask.java b/src/main/java/gwt/material/design/incubator/client/dob/MonthDataProvider.java similarity index 70% rename from src/main/java/gwt/material/design/addins/client/inputmask/MaterialTextInputMask.java rename to src/main/java/gwt/material/design/incubator/client/dob/MonthDataProvider.java index a87aa3519..77a7e291d 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialTextInputMask.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/MonthDataProvider.java @@ -2,7 +2,7 @@ * #%L * GwtMaterial * %% - * Copyright (C) 2015 - 2018 GwtMaterialDesign + * Copyright (C) 2015 - 2019 GwtMaterialDesign * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,11 @@ * limitations under the License. * #L% */ -package gwt.material.design.addins.client.inputmask; +package gwt.material.design.incubator.client.dob; -public class MaterialTextInputMask extends MaterialInputMask { +import java.util.Map; - @Override - public String getValue() { - return super.getValue(); - } +public interface MonthDataProvider { + + Map get(); } diff --git a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css index 0e76573da..bf039bdc0 100644 --- a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css +++ b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.css @@ -92,8 +92,8 @@ button { } .sa-icon.sa-success.animate::after { - -webkit-animation: rotatePlaceholder 4.25s ease-in; - animation: rotatePlaceholder 4.25s ease-in; + -webkit-animation: rotatePlaceholder 6.25s ease-in; + animation: rotatePlaceholder 6.25s ease-in; } .sa-icon.sa-success { @@ -107,13 +107,13 @@ button { } .animateSuccessTip { - -webkit-animation: animateSuccessTip 0.75s; - animation: animateSuccessTip 0.75s; + -webkit-animation: animateSuccessTip 1.25s; + animation: animateSuccessTip 1.25s; } .animateSuccessLong { - -webkit-animation: animateSuccessLong 0.75s; - animation: animateSuccessLong 0.75s; + -webkit-animation: animateSuccessLong 2.25s; + animation: animateSuccessLong 2.25s; } @-webkit-keyframes animateSuccessLong { diff --git a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css index 756a03726..ce27b57c7 100644 --- a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark.min.css @@ -1 +1,279 @@ -.check_mark{width:80px;height:130px;margin:0 auto}button{cursor:pointer;margin-left:15px}.hide{display:none}.sa-icon{width:80px;height:80px;border:4px solid #4CAF50;-webkit-border-radius:40px;border-radius:50%;margin:20px auto;padding:0;position:relative;box-sizing:content-box}.sa-icon.sa-success{border-color:#4CAF50}.sa-icon.sa-success::after,.sa-icon.sa-success::before{content:'';position:absolute;width:60px;height:120px;background:#fff}.sa-icon.sa-success::before{-webkit-border-radius:120px 0 0 120px;border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.sa-icon.sa-success::after{-webkit-border-radius:0 120px 120px 0;border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px}.sa-icon.sa-success .sa-placeholder{width:80px;height:80px;border:4px solid rgba(76,175,80,.5);-webkit-border-radius:40px;border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.sa-icon.sa-success .sa-fix{width:5px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.sa-icon.sa-success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}.sa-icon.sa-success{border-color:transparent\9}.sa-icon.sa-success .sa-line.sa-tip{-ms-transform:rotate(45deg)\9}.sa-icon.sa-success .sa-line.sa-long{-ms-transform:rotate(-45deg)\9}.animateSuccessTip{-webkit-animation:animateSuccessTip .75s;animation:animateSuccessTip .75s}.animateSuccessLong{-webkit-animation:animateSuccessLong .75s;animation:animateSuccessLong .75s}@-webkit-keyframes animateSuccessLong{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@-webkit-keyframes animateSuccessTip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animateSuccessTip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animateSuccessLong{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}.sa-icon.sa-success .sa-line{height:5px;background-color:#4CAF50;display:block;border-radius:2px;position:absolute;z-index:2}.sa-icon.sa-success .sa-line.sa-tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.sa-icon.sa-success .sa-line.sa-long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}@-webkit-keyframes rotatePlaceholder{0%,5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}100%,12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%,5%{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}100%,12%{transform:rotate(-405deg);-webkit-transform:rotate(-405deg)}} \ No newline at end of file +.check_mark { + width: 80px; + height: 130px; + margin: 0 auto; +} + +button { + cursor: pointer; + margin-left: 15px; +} + +.hide{ + display:none; +} + +.sa-icon { + width: 80px; + height: 80px; + border: 4px solid #4CAF50; + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + margin: 20px auto; + padding: 0; + position: relative; + box-sizing: content-box; +} + +.sa-icon.sa-success { + border-color: #4CAF50; +} + +.sa-icon.sa-success::before, .sa-icon.sa-success::after { + content: ''; + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + position: absolute; + width: 60px; + height: 120px; + background: white; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.sa-icon.sa-success::before { + -webkit-border-radius: 120px 0 0 120px; + border-radius: 120px 0 0 120px; + top: -7px; + left: -33px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; +} + +.sa-icon.sa-success::after { + -webkit-border-radius: 0 120px 120px 0; + border-radius: 0 120px 120px 0; + top: -11px; + left: 30px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 0px 60px; + transform-origin: 0px 60px; +} + +.sa-icon.sa-success .sa-placeholder { + width: 80px; + height: 80px; + border: 4px solid rgba(76, 175, 80, .5); + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + box-sizing: content-box; + position: absolute; + left: -4px; + top: -4px; + z-index: 2; +} + +.sa-icon.sa-success .sa-fix { + width: 5px; + height: 90px; + background-color: white; + position: absolute; + left: 28px; + top: 8px; + z-index: 1; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +.sa-icon.sa-success.animate::after { + -webkit-animation: rotatePlaceholder 6.25s ease-in; + animation: rotatePlaceholder 6.25s ease-in; +} + +.sa-icon.sa-success { + border-color: transparent\9; +} +.sa-icon.sa-success .sa-line.sa-tip { + -ms-transform: rotate(45deg) \9; +} +.sa-icon.sa-success .sa-line.sa-long { + -ms-transform: rotate(-45deg) \9; +} + +.animateSuccessTip { + -webkit-animation: animateSuccessTip 1.25s; + animation: animateSuccessTip 1.25s; +} + +.animateSuccessLong { + -webkit-animation: animateSuccessLong 1.25s; + animation: animateSuccessLong 1.25s; +} + +@-webkit-keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; + } + 65% { + width: 0; + right: 46px; + top: 54px; + } + 84% { + width: 55px; + right: 0px; + top: 35px; + } + 100% { + width: 47px; + right: 8px; + top: 38px; + } +} +@-webkit-keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; + } + 54% { + width: 0; + left: 1px; + top: 19px; + } + 70% { + width: 50px; + left: -8px; + top: 37px; + } + 84% { + width: 17px; + left: 21px; + top: 48px; + } + 100% { + width: 25px; + left: 14px; + top: 45px; + } +} +@keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; + } + 54% { + width: 0; + left: 1px; + top: 19px; + } + 70% { + width: 50px; + left: -8px; + top: 37px; + } + 84% { + width: 17px; + left: 21px; + top: 48px; + } + 100% { + width: 25px; + left: 14px; + top: 45px; + } +} + +@keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; + } + 65% { + width: 0; + right: 46px; + top: 54px; + } + 84% { + width: 55px; + right: 0px; + top: 35px; + } + 100% { + width: 47px; + right: 8px; + top: 38px; + } +} + +.sa-icon.sa-success .sa-line { + height: 5px; + background-color: #4CAF50; + display: block; + border-radius: 2px; + position: absolute; + z-index: 2; +} + +.sa-icon.sa-success .sa-line.sa-tip { + width: 25px; + left: 14px; + top: 46px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.sa-icon.sa-success .sa-line.sa-long { + width: 47px; + right: 8px; + top: 38px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +@-webkit-keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } +} +@keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css new file mode 100644 index 000000000..676b7d138 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css @@ -0,0 +1,3 @@ +.dob-container { + padding: 0px !important; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css new file mode 100644 index 000000000..676b7d138 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css @@ -0,0 +1,3 @@ +.dob-container { + padding: 0px !important; +} \ No newline at end of file diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java index 5296ae9d0..c7823defa 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java @@ -19,7 +19,7 @@ */ package gwt.material.design.addins.client.ui; -import gwt.material.design.addins.client.inputmask.MaterialInputMask; +import gwt.material.design.addins.client.inputmask.AbstractInputMask; import gwt.material.design.addins.client.ui.base.MaterialValueBoxTest; /** @@ -27,20 +27,20 @@ * * @author kevzlou7979 */ -public class MaterialInputMaskTest extends MaterialValueBoxTest { +public class MaterialInputMaskTest extends MaterialValueBoxTest { final static String MASK_REGEX = "000.000.000.000"; final static String VALUE = "123456789098"; @Override - protected MaterialInputMask createWidget() { - return new MaterialInputMask(); + protected AbstractInputMask createWidget() { + return new AbstractInputMask(); } public void testProperties() { // UiBinder // given - MaterialInputMask inputMask = getWidget(); + AbstractInputMask inputMask = getWidget(); inputMask.setMask(MASK_REGEX); assertEquals(MASK_REGEX, inputMask.getMask()); @@ -56,7 +56,7 @@ public void testProperties() { checkProperties(inputMask); } - protected void checkProperties(MaterialInputMask inputMask) { + protected void checkProperties(AbstractInputMask inputMask) { inputMask.setSelectOnFocus(true); assertTrue(inputMask.isSelectOnFocus()); inputMask.setSelectOnFocus(false); @@ -76,7 +76,7 @@ protected void checkProperties(MaterialInputMask inputMask) { public void testValue() { // UiBinder // given - MaterialInputMask inputMask = getWidget(); + AbstractInputMask inputMask = getWidget(); // when / then checkValue(inputMask, false); @@ -89,7 +89,7 @@ public void testValue() { checkValue(inputMask, true); } - protected void checkValue(MaterialInputMask inputMask, boolean checkCleanValue) { + protected void checkValue(AbstractInputMask inputMask, boolean checkCleanValue) { inputMask.setMask(MASK_REGEX); inputMask.setValue(VALUE); assertEquals(VALUE, inputMask.getValue()); @@ -100,7 +100,7 @@ protected void checkValue(MaterialInputMask inputMask, boolean checkCleanValue) } public void testUnMask() { - MaterialInputMask inputMask = getWidget(); + AbstractInputMask inputMask = getWidget(); inputMask.setMask(MASK_REGEX); inputMask.setValue(VALUE); From 4bf48744a6fee7d365bcc605e1ccfd456d3505f3 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 15 Mar 2019 10:08:13 +0800 Subject: [PATCH 077/247] Update on DateOfBirthPicker --- .../inputmask/MaterialIntegerInputMask.java | 6 +- .../client/dob/DateOfBirthPicker.java | 158 +++++++++--------- .../client/dob/resources/css/dob.css | 4 + .../client/dob/resources/css/dob.min.css | 4 + 4 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java index f8f0da5bb..559ded9f3 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialIntegerInputMask.java @@ -7,9 +7,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 @@ public MaterialIntegerInputMask() { @Override public Integer getValue() { String cleanValue = getCleanValue(); - if (cleanValue != null) { + if (cleanValue != null && !cleanValue.isEmpty()) { return Integer.parseInt(cleanValue); } return null; diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 2d8257e5d..7148d5dd4 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -7,9 +7,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,15 +24,19 @@ import gwt.material.design.addins.client.combobox.MaterialComboBox; import gwt.material.design.addins.client.inputmask.MaterialIntegerInputMask; import gwt.material.design.client.MaterialDesignBase; -import gwt.material.design.client.base.*; +import gwt.material.design.client.base.AbstractValueWidget; +import gwt.material.design.client.base.HasFieldTypes; +import gwt.material.design.client.base.HasReadOnly; import gwt.material.design.client.base.mixin.FieldTypeMixin; -import gwt.material.design.client.constants.*; -import gwt.material.design.client.ui.MaterialIcon; +import gwt.material.design.client.constants.CssName; +import gwt.material.design.client.constants.FieldType; +import gwt.material.design.client.constants.StatusDisplayType; +import gwt.material.design.client.constants.TextAlign; import gwt.material.design.incubator.client.AddinsIncubator; import java.util.Date; -public class DateOfBirthPicker extends AbstractValueWidget implements HasFieldTypes, HasIcon, HasReadOnly, HasPlaceholder { +public class DateOfBirthPicker extends AbstractValueWidget implements HasFieldTypes, HasReadOnly { static { if (AddinsIncubator.isDebug()) { @@ -42,6 +46,7 @@ public class DateOfBirthPicker extends AbstractValueWidget implements HasF } } + private Date value; private MonthDataProvider dataProvider = new DefaultMonthDataProvider(); private MaterialComboBox month = new MaterialComboBox(); private MaterialIntegerInputMask day = new MaterialIntegerInputMask(); @@ -77,7 +82,12 @@ protected void setupMonth() { } } month.setLabel("Birthdate"); - month.setGrid("s6"); + month.setGrid("s5"); + month.addValueChangeHandler(event -> { + if (validateDate()) { + value.setMonth(month.getSingleValue()); + } + }); } protected void setupDay() { @@ -86,7 +96,12 @@ protected void setupDay() { day.setFloat(Style.Float.LEFT); day.setTextAlign(TextAlign.CENTER); day.setPlaceholder("DD"); - day.setGrid("s2"); + day.setGrid("s3"); + day.addValueChangeHandler(event -> { + if (validateDate()) { + value.setDate(day.getValue()); + } + }); } protected void setupYear() { @@ -96,21 +111,48 @@ protected void setupYear() { year.setTextAlign(TextAlign.CENTER); year.setPlaceholder("YYYY"); year.setGrid("s4"); + year.addValueChangeHandler(event -> { + if (validateDate()) { + value.setYear(year.getValue() - 1900); + } + }); + } + + protected boolean validateDate() { + boolean valid = true; + if (!(month.getSingleValue() != null && month.getSingleValue() > 0 && month.getSingleValue() < 12)) { + valid = false; + month.setErrorText("Invalid Month"); + } else { + month.clearErrorText(); + } + + if (!(year.getValue() != null && year.getValue() > 0)) { + valid = false; + year.setErrorText("Invalid Year"); + } else { + year.clearErrorText(); + } + + if (!(day.getValue() != null && day.getValue() > 0 && day.getValue() <= 31)) { + valid = false; + day.setErrorText("Invalid Day"); + } else { + day.clearErrorText(); + } + return valid; } @Override public Date getValue() { - Integer yearValue = year.getValue(); - Integer monthValue = month.getSingleValue(); - Integer dayValue = day.getValue(); - if (yearValue != null && monthValue != null && dayValue != null) { - return new Date(yearValue - 1900, monthValue, dayValue); - } - return null; + return value; } @Override public void setValue(Date value) { + super.setValue(value); + + this.value = value; year.setValue(value.getYear() + 1900); day.setValue(value.getDay()); month.setSingleValue(value.getMonth()); @@ -139,88 +181,40 @@ public void setFieldWidth(double percentWidth) { } @Override - public MaterialIcon getIcon() { - return null; - } - - @Override - public void setIconType(IconType iconType) { - - } - - @Override - public void setIconPosition(IconPosition position) { - - } - - @Override - public void setIconSize(IconSize size) { - - } - - @Override - public void setIconFontSize(double size, Style.Unit unit) { - - } - - @Override - public void setIconColor(Color iconColor) { - - } - - @Override - public Color getIconColor() { - return null; - } - - @Override - public void setIconPrefix(boolean prefix) { - - } - - @Override - public boolean isIconPrefix() { - return false; - } - - @Override - public void setCustomIconType(String iconType) { - - } - - @Override - public String getCustomIconType() { - return null; - } - - @Override - public String getPlaceholder() { - return null; + public void setReadOnly(boolean value) { + month.setReadOnly(value); + year.setReadOnly(value); + day.setReadOnly(value); } @Override - public void setPlaceholder(String placeholder) { - + public boolean isReadOnly() { + return month.isReadOnly() && year.isReadOnly() && day.isReadOnly(); } @Override - public void setReadOnly(boolean value) { - + public void setToggleReadOnly(boolean toggle) { + month.setToggleReadOnly(toggle); + year.setToggleReadOnly(toggle); + day.setToggleReadOnly(toggle); } @Override - public boolean isReadOnly() { - return false; + public boolean isToggleReadOnly() { + return month.isToggleReadOnly() && year.isToggleReadOnly() && day.isToggleReadOnly(); } @Override - public void setToggleReadOnly(boolean toggle) { - + public void setStatusDisplayType(StatusDisplayType displayType) { + super.setStatusDisplayType(displayType); + month.setStatusDisplayType(displayType); + year.setStatusDisplayType(displayType); + day.setStatusDisplayType(displayType); } @Override - public boolean isToggleReadOnly() { - return false; + public StatusDisplayType getStatusDisplayType() { + return month.getStatusDisplayType(); } public FieldTypeMixin getFieldTypeMixin() { diff --git a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css index 676b7d138..9c04550b0 100644 --- a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css +++ b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css @@ -1,3 +1,7 @@ .dob-container { padding: 0px !important; +} + +.dob-container input { + text-align: center; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css index 676b7d138..9c04550b0 100644 --- a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css @@ -1,3 +1,7 @@ .dob-container { padding: 0px !important; +} + +.dob-container input { + text-align: center; } \ No newline at end of file From 77114cdb5381a103b468f3878d5b7819aca58d0f Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 22 Mar 2019 09:09:02 +0800 Subject: [PATCH 078/247] Layout fixes --- .../client/inputmask/MaterialInputMask.java | 19 +++++++ .../client/base/matcher/DateMonthMatcher.java | 54 +++++++++++++++++++ .../client/daterange/DateRangePicker.java | 34 ++---------- .../client/dob/DateOfBirthPicker.java | 15 ++++-- 4 files changed, 88 insertions(+), 34 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/base/matcher/DateMonthMatcher.java diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java index dc167240a..408604b0b 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/MaterialInputMask.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.inputmask; import static gwt.material.design.addins.client.inputmask.js.JsInputMask.$; diff --git a/src/main/java/gwt/material/design/incubator/client/base/matcher/DateMonthMatcher.java b/src/main/java/gwt/material/design/incubator/client/base/matcher/DateMonthMatcher.java new file mode 100644 index 000000000..5cfb94a31 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/base/matcher/DateMonthMatcher.java @@ -0,0 +1,54 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.base.matcher; + +import gwt.material.design.addins.client.combobox.js.options.Data; +import gwt.material.design.addins.client.combobox.js.options.Params; +import gwt.material.design.jquery.client.api.Functions; + +public class DateMonthMatcher { + + public static Functions.FuncRet2 getDefaultMonthMatcher() { + return (params, data) -> { + // If there are no search terms, return all of the data + if (params == null || params.term == null) { + return data; + } + + // Do not display the item if there is no 'text' property + if (data.text == null) { + return null; + } + + // Will do an advance month searching using index + Integer i = null; + try { + i = Integer.parseInt(params.term); + } catch (NumberFormatException e) { + // Do nothing + } + + if (data.text.toLowerCase().contains(params.term.toLowerCase()) || (i != null && data.id == i - 1)) { + return data; + } + return null; + }; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 9c797a91c..85b0abd7a 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -7,9 +7,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. @@ -46,6 +46,7 @@ import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.base.matcher.DateMonthMatcher; import gwt.material.design.incubator.client.daterange.constants.DateRangeElementSelector; import gwt.material.design.incubator.client.daterange.events.*; import gwt.material.design.incubator.client.daterange.events.SelectionEvent; @@ -224,7 +225,7 @@ protected void toggleTypeAssistSelector(String... selectors) { JQueryElement parent = JsComboBox.$(getElement()); JsComboBoxOptions option = JsComboBoxOptions.create(); if (selector.equals(DateRangeElementSelector.MONTH_SELECT)) { - option.matcher = getDefaultMonthMatcher(); + option.matcher = DateMonthMatcher.getDefaultMonthMatcher(); } option.dropdownParent = parent; selectElement.select2(option); @@ -235,33 +236,6 @@ protected void toggleTypeAssistSelector(String... selectors) { } } - protected Functions.FuncRet2 getDefaultMonthMatcher() { - return (params, data) -> { - // If there are no search terms, return all of the data - if (params == null || params.term == null) { - return data; - } - - // Do not display the item if there is no 'text' property - if (data.text == null) { - return null; - } - - // Will do an advance month searching using index - Integer i = null; - try { - i = Integer.parseInt(params.term); - } catch (NumberFormatException e) { - // Do nothing - } - - if (data.text.toLowerCase().contains(params.term.toLowerCase()) || (i != null && data.id == i - 1)) { - return data; - } - return null; - }; - } - @Override protected void onUnload() { unload(); diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 7148d5dd4..ed7fb64aa 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -32,7 +32,9 @@ import gwt.material.design.client.constants.FieldType; import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.constants.TextAlign; +import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.base.matcher.DateMonthMatcher; import java.util.Date; @@ -81,8 +83,9 @@ protected void setupMonth() { month.addItem(dataProvider.get().get(index), index); } } - month.setLabel("Birthdate"); - month.setGrid("s5"); + month.setMatcher(DateMonthMatcher.getDefaultMonthMatcher()); + month.setLabel("Month"); + month.setGrid("s12 m5"); month.addValueChangeHandler(event -> { if (validateDate()) { value.setMonth(month.getSingleValue()); @@ -91,12 +94,13 @@ protected void setupMonth() { } protected void setupDay() { + day.setLabel("Day"); day.addStyleName("dob-day"); day.setMask("00"); day.setFloat(Style.Float.LEFT); day.setTextAlign(TextAlign.CENTER); day.setPlaceholder("DD"); - day.setGrid("s3"); + day.setGrid("s4 m3"); day.addValueChangeHandler(event -> { if (validateDate()) { value.setDate(day.getValue()); @@ -105,12 +109,13 @@ protected void setupDay() { } protected void setupYear() { + year.setLabel("Year"); year.addStyleName("dob-year"); year.setMask("0000"); year.setFloat(Style.Float.LEFT); year.setTextAlign(TextAlign.CENTER); year.setPlaceholder("YYYY"); - year.setGrid("s4"); + year.setGrid("s8 m4"); year.addValueChangeHandler(event -> { if (validateDate()) { value.setYear(year.getValue() - 1900); @@ -145,6 +150,8 @@ protected boolean validateDate() { @Override public Date getValue() { + //TODO: Date value builder - compare to expected month value + //TODO: Input mask 1900 - current date - 100 return value; } From 9bafc296f0dbae5ab7ec13a7c2b0d0c811261c84 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 26 Mar 2019 12:09:55 +0800 Subject: [PATCH 079/247] Support MonthLocaleProvider for DateOfBirthPicker --- .../client/dob/DateOfBirthPicker.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index ed7fb64aa..0592cc65d 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -132,7 +132,7 @@ protected boolean validateDate() { month.clearErrorText(); } - if (!(year.getValue() != null && year.getValue() > 0)) { + if (!(year.getValue() != null && year.getValue() >= 1900)) { valid = false; year.setErrorText("Invalid Year"); } else { @@ -219,11 +219,40 @@ public void setStatusDisplayType(StatusDisplayType displayType) { day.setStatusDisplayType(displayType); } + @Override + public void setErrorText(String errorText) { + month.setErrorText(errorText); + day.setErrorText(errorText); + year.setErrorText(errorText); + } + + @Override + public void setSuccessText(String successText) { + month.setErrorText(successText); + day.setErrorText(successText); + year.setErrorText(successText); + } + + @Override + public void setHelperText(String helperText) { + month.setErrorText(helperText); + day.setErrorText(helperText); + year.setErrorText(helperText); + } + @Override public StatusDisplayType getStatusDisplayType() { return month.getStatusDisplayType(); } + public MonthDataProvider getDataProvider() { + return dataProvider; + } + + public void setDataProvider(MonthDataProvider dataProvider) { + this.dataProvider = dataProvider; + } + public FieldTypeMixin getFieldTypeMixin() { if (fieldTypeMixin == null) { fieldTypeMixin = new FieldTypeMixin<>(this); From 7b27f7490d2d04df81dc4d627015ca8fc0818688 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 27 Mar 2019 02:33:35 +0800 Subject: [PATCH 080/247] Localization support for DateOfBirthPicker --- .../client/dob/DateOfBirthPicker.java | 28 +++++++++------- ....java => DefaultDobLocaleDateProvide.java} | 32 ++++++++++++++++++- ...rovider.java => DobLocaleDateProvide.java} | 14 +++++++- 3 files changed, 61 insertions(+), 13 deletions(-) rename src/main/java/gwt/material/design/incubator/client/dob/{DefaultMonthDataProvider.java => DefaultDobLocaleDateProvide.java} (67%) rename src/main/java/gwt/material/design/incubator/client/dob/{MonthDataProvider.java => DobLocaleDateProvide.java} (76%) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 0592cc65d..789b1c8b9 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -32,7 +32,6 @@ import gwt.material.design.client.constants.FieldType; import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.constants.TextAlign; -import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.matcher.DateMonthMatcher; @@ -49,7 +48,7 @@ public class DateOfBirthPicker extends AbstractValueWidget implements HasF } private Date value; - private MonthDataProvider dataProvider = new DefaultMonthDataProvider(); + private DobLocaleDateProvide dataProvider = new DefaultDobLocaleDateProvide(); private MaterialComboBox month = new MaterialComboBox(); private MaterialIntegerInputMask day = new MaterialIntegerInputMask(); private MaterialIntegerInputMask year = new MaterialIntegerInputMask(); @@ -74,17 +73,24 @@ protected void onLoad() { add(year); } + public void reload() { + setupMonth(); + setupDay(); + setupYear(); + } + protected void setupMonth() { month.addStyleName("dob-month"); if (dataProvider.get().size() > 12) { - setErrorText("Months must be equal to 12"); + setErrorText(dataProvider.getInvalidMonthMessage()); } else { + month.clear(); for (Integer index : dataProvider.get().keySet()) { month.addItem(dataProvider.get().get(index), index); } } month.setMatcher(DateMonthMatcher.getDefaultMonthMatcher()); - month.setLabel("Month"); + month.setLabel(dataProvider.getMonthLabel()); month.setGrid("s12 m5"); month.addValueChangeHandler(event -> { if (validateDate()) { @@ -94,7 +100,7 @@ protected void setupMonth() { } protected void setupDay() { - day.setLabel("Day"); + day.setLabel(dataProvider.getDayLabel()); day.addStyleName("dob-day"); day.setMask("00"); day.setFloat(Style.Float.LEFT); @@ -109,7 +115,7 @@ protected void setupDay() { } protected void setupYear() { - year.setLabel("Year"); + year.setLabel(dataProvider.getYearLabel()); year.addStyleName("dob-year"); year.setMask("0000"); year.setFloat(Style.Float.LEFT); @@ -127,21 +133,21 @@ protected boolean validateDate() { boolean valid = true; if (!(month.getSingleValue() != null && month.getSingleValue() > 0 && month.getSingleValue() < 12)) { valid = false; - month.setErrorText("Invalid Month"); + month.setErrorText(dataProvider.getInvalidMonthMessage()); } else { month.clearErrorText(); } if (!(year.getValue() != null && year.getValue() >= 1900)) { valid = false; - year.setErrorText("Invalid Year"); + year.setErrorText(dataProvider.getInvalidYearLabel()); } else { year.clearErrorText(); } if (!(day.getValue() != null && day.getValue() > 0 && day.getValue() <= 31)) { valid = false; - day.setErrorText("Invalid Day"); + day.setErrorText(dataProvider.getInvalidDayMessage()); } else { day.clearErrorText(); } @@ -245,11 +251,11 @@ public StatusDisplayType getStatusDisplayType() { return month.getStatusDisplayType(); } - public MonthDataProvider getDataProvider() { + public DobLocaleDateProvide getDataProvider() { return dataProvider; } - public void setDataProvider(MonthDataProvider dataProvider) { + public void setDataProvider(DobLocaleDateProvide dataProvider) { this.dataProvider = dataProvider; } diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java b/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvide.java similarity index 67% rename from src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java rename to src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvide.java index bc2de45f3..6af6d42d1 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DefaultMonthDataProvider.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvide.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.Map; -public class DefaultMonthDataProvider implements MonthDataProvider { +public class DefaultDobLocaleDateProvide implements DobLocaleDateProvide { @Override public Map get() { Map months = new HashMap<>(); @@ -40,4 +40,34 @@ public Map get() { months.put(11, "December"); return months; } + + @Override + public String getMonthLabel() { + return "Month"; + } + + @Override + public String getDayLabel() { + return "Day"; + } + + @Override + public String getYearLabel() { + return "Year"; + } + + @Override + public String getInvalidMonthMessage() { + return "Invalid Month value"; + } + + @Override + public String getInvalidDayMessage() { + return "Invalid Day value"; + } + + @Override + public String getInvalidYearLabel() { + return "Invalid Year value"; + } } diff --git a/src/main/java/gwt/material/design/incubator/client/dob/MonthDataProvider.java b/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvide.java similarity index 76% rename from src/main/java/gwt/material/design/incubator/client/dob/MonthDataProvider.java rename to src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvide.java index 77a7e291d..393d080a4 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/MonthDataProvider.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvide.java @@ -21,7 +21,19 @@ import java.util.Map; -public interface MonthDataProvider { +public interface DobLocaleDateProvide { Map get(); + + String getMonthLabel(); + + String getDayLabel(); + + String getYearLabel(); + + String getInvalidMonthMessage(); + + String getInvalidDayMessage(); + + String getInvalidYearLabel(); } From 9d1c93c45ab8b23722325675dc42dae08334d848 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 27 Mar 2019 02:54:21 +0800 Subject: [PATCH 081/247] Fixed minor typo --- ...obLocaleDateProvide.java => DefaultDobLocaleDateProvider.java} | 0 .../dob/{DobLocaleDateProvide.java => DobLocaleDateProvider.java} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/gwt/material/design/incubator/client/dob/{DefaultDobLocaleDateProvide.java => DefaultDobLocaleDateProvider.java} (100%) rename src/main/java/gwt/material/design/incubator/client/dob/{DobLocaleDateProvide.java => DobLocaleDateProvider.java} (100%) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvide.java b/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvider.java similarity index 100% rename from src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvide.java rename to src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvider.java diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvide.java b/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvider.java similarity index 100% rename from src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvide.java rename to src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvider.java From 4b1be09cee87034595733f92428ae6b220a7c115 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 27 Mar 2019 02:58:52 +0800 Subject: [PATCH 082/247] Fixed Typo --- .../design/incubator/client/dob/DateOfBirthPicker.java | 6 +++--- .../incubator/client/dob/DefaultDobLocaleDateProvider.java | 2 +- .../design/incubator/client/dob/DobLocaleDateProvider.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 789b1c8b9..94de0f22a 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -48,7 +48,7 @@ public class DateOfBirthPicker extends AbstractValueWidget implements HasF } private Date value; - private DobLocaleDateProvide dataProvider = new DefaultDobLocaleDateProvide(); + private DobLocaleDateProvider dataProvider = new DefaultDobLocaleDateProvider(); private MaterialComboBox month = new MaterialComboBox(); private MaterialIntegerInputMask day = new MaterialIntegerInputMask(); private MaterialIntegerInputMask year = new MaterialIntegerInputMask(); @@ -251,11 +251,11 @@ public StatusDisplayType getStatusDisplayType() { return month.getStatusDisplayType(); } - public DobLocaleDateProvide getDataProvider() { + public DobLocaleDateProvider getDataProvider() { return dataProvider; } - public void setDataProvider(DobLocaleDateProvide dataProvider) { + public void setDataProvider(DobLocaleDateProvider dataProvider) { this.dataProvider = dataProvider; } diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvider.java b/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvider.java index 6af6d42d1..8e4a3b682 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvider.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DefaultDobLocaleDateProvider.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.Map; -public class DefaultDobLocaleDateProvide implements DobLocaleDateProvide { +public class DefaultDobLocaleDateProvider implements DobLocaleDateProvider { @Override public Map get() { Map months = new HashMap<>(); diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvider.java b/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvider.java index 393d080a4..d7c5b4f56 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvider.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DobLocaleDateProvider.java @@ -21,7 +21,7 @@ import java.util.Map; -public interface DobLocaleDateProvide { +public interface DobLocaleDateProvider { Map get(); From f6c7f99b621d5a1cc44454155b926bab181fccef Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 1 Apr 2019 06:04:42 +0800 Subject: [PATCH 083/247] Added a predefined formatter. --- .../formatter/MetricPrefixFormatter.java | 28 +++++++++++++++ .../client/formatter/MetricRange.java | 24 +++++++++++++ .../client/formatter/MetricValue.java | 34 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java create mode 100644 src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java create mode 100644 src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java diff --git a/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java b/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java new file mode 100644 index 000000000..a9aba0d20 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java @@ -0,0 +1,28 @@ +package gwt.material.design.incubator.client.formatter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class MetricPrefixFormatter { + + private static List ranges = new ArrayList<>(); + + private MetricPrefixFormatter() {} + + static { + ranges.addAll(Arrays.asList(MetricRange.create(1e12, "T"), + MetricRange.create(1e9, "B"), + MetricRange.create(1e6, "M"), + MetricRange.create(1e3, "k"))); + } + + public static MetricValue formatNumber(Double value) { + for (int i = 0; i < ranges.size(); i++) { + if (value >= ranges.get(i).divider) { + return new MetricValue((value / ranges.get(i).divider), ranges.get(i).suffix); + } + } + return new MetricValue(value); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java b/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java new file mode 100644 index 000000000..57e10508d --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java @@ -0,0 +1,24 @@ +package gwt.material.design.incubator.client.formatter; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class MetricRange { + + @JsProperty + double divider; + + @JsProperty + String suffix; + + @JsOverlay + public final static MetricRange create(double divider, String suffix) { + MetricRange metricRange = new MetricRange(); + metricRange.divider = divider; + metricRange.suffix = suffix; + return metricRange; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java b/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java new file mode 100644 index 000000000..dc4e5a50b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java @@ -0,0 +1,34 @@ +package gwt.material.design.incubator.client.formatter; + +public class MetricValue { + + private Double numericalValue; + private String suffix; + + public MetricValue() {} + + public MetricValue(Double numericalValue) { + this.numericalValue = numericalValue; + } + + public MetricValue(Double numericalValue, String suffix) { + this.numericalValue = numericalValue; + this.suffix = suffix; + } + + public Double getNumericalValue() { + return numericalValue; + } + + public void setNumericalValue(Double value) { + this.numericalValue = value; + } + + public String getSuffix() { + return suffix; + } + + public void setSuffix(String suffix) { + this.suffix = suffix; + } +} From e64b0b87bd66bb8ada4b4ac19dae3c9dc8cb1232 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 2 Apr 2019 20:49:49 +0800 Subject: [PATCH 084/247] Introduction to TagLabel component. --- .../client/dob/DateOfBirthPicker.java | 27 ++++++++-- .../formatter/MetricPrefixFormatter.java | 19 +++++++ .../client/formatter/MetricRange.java | 19 +++++++ .../client/formatter/MetricValue.java | 19 +++++++ .../incubator/client/tag/TagClientBundle.java | 31 +++++++++++ .../client/tag/TagDebugClientBundle.java | 31 +++++++++++ .../design/incubator/client/tag/TagLabel.java | 22 ++++++++ .../client/tag/resources/css/tag.css | 52 +++++++++++++++++++ .../client/tag/resources/css/tag.min.css | 1 + 9 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 94de0f22a..73381ac9e 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -90,17 +90,19 @@ protected void setupMonth() { } } month.setMatcher(DateMonthMatcher.getDefaultMonthMatcher()); - month.setLabel(dataProvider.getMonthLabel()); month.setGrid("s12 m5"); month.addValueChangeHandler(event -> { if (validateDate()) { value.setMonth(month.getSingleValue()); } }); + + if (dataProvider.getMonthLabel() != null && !dataProvider.getMonthLabel().isEmpty()) { + month.setLabel(dataProvider.getMonthLabel()); + } } protected void setupDay() { - day.setLabel(dataProvider.getDayLabel()); day.addStyleName("dob-day"); day.setMask("00"); day.setFloat(Style.Float.LEFT); @@ -112,10 +114,13 @@ protected void setupDay() { value.setDate(day.getValue()); } }); + + if (dataProvider.getDayLabel() != null && !dataProvider.getDayLabel().isEmpty()) { + day.setLabel(dataProvider.getDayLabel()); + } } protected void setupYear() { - year.setLabel(dataProvider.getYearLabel()); year.addStyleName("dob-year"); year.setMask("0000"); year.setFloat(Style.Float.LEFT); @@ -127,6 +132,10 @@ protected void setupYear() { value.setYear(year.getValue() - 1900); } }); + + if (dataProvider.getYearLabel() != null && !dataProvider.getYearLabel().isEmpty()) { + year.setLabel(dataProvider.getYearLabel()); + } } protected boolean validateDate() { @@ -259,6 +268,18 @@ public void setDataProvider(DobLocaleDateProvider dataProvider) { this.dataProvider = dataProvider; } + public MaterialComboBox getMonth() { + return month; + } + + public MaterialIntegerInputMask getDay() { + return day; + } + + public MaterialIntegerInputMask getYear() { + return year; + } + public FieldTypeMixin getFieldTypeMixin() { if (fieldTypeMixin == null) { fieldTypeMixin = new FieldTypeMixin<>(this); diff --git a/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java b/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java index a9aba0d20..7c9541f5a 100644 --- a/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java +++ b/src/main/java/gwt/material/design/incubator/client/formatter/MetricPrefixFormatter.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.formatter; import java.util.ArrayList; diff --git a/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java b/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java index 57e10508d..d39fc39bd 100644 --- a/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java +++ b/src/main/java/gwt/material/design/incubator/client/formatter/MetricRange.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.formatter; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java b/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java index dc4e5a50b..942c4a443 100644 --- a/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java +++ b/src/main/java/gwt/material/design/incubator/client/formatter/MetricValue.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.formatter; public class MetricValue { diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java b/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java new file mode 100644 index 000000000..0933e09b1 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java @@ -0,0 +1,31 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.tag; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface TagClientBundle extends ClientBundle { + TagClientBundle INSTANCE = GWT.create(TagClientBundle.class); + + @Source("resources/css/tag.min.css") + TextResource tagCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java new file mode 100644 index 000000000..382b95d89 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java @@ -0,0 +1,31 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.tag; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface TagDebugClientBundle extends ClientBundle { + TagDebugClientBundle INSTANCE = GWT.create(TagDebugClientBundle.class); + + @Source("resources/css/tag.css") + TextResource tagDebugCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java b/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java new file mode 100644 index 000000000..780e4914a --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java @@ -0,0 +1,22 @@ +package gwt.material.design.incubator.client.tag; + +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.ui.MaterialLabel; +import gwt.material.design.incubator.client.AddinsIncubator; + +public class TagLabel extends MaterialLabel { + + static { + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(TagDebugClientBundle.INSTANCE.tagDebugCss()); + } else { + MaterialDesignBase.injectCss(TagClientBundle.INSTANCE.tagCss()); + } + } + + public TagLabel() { + super(); + + addStyleName("tag-label"); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css new file mode 100644 index 000000000..7ff1efd78 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css @@ -0,0 +1,52 @@ +.tag-label:first-child { + margin-left: 0px; +} + +.tag-label { + margin-left: 20px; + padding: 0 10px 0 12px; + background: #ebebeb; + color: #6c6c6c; + text-decoration: none; + -moz-border-radius-bottomright: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + float: left; + height: 24px; + line-height: 24px; + position: relative; + font-size: 0.9em; +} + +.tag-label:before { + content: ""; + float: left; + position: absolute; + top: 0; + left: -12px; + width: 0; + height: 0; + border-color: transparent #ebebeb transparent transparent; + border-style: solid; + border-width: 12px 12px 12px 0; +} + +.tag-label:after { + content: ""; + position: absolute; + top: 10px; + left: 0; + float: left; + width: 4px; + height: 4px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + background: #fff; + -moz-box-shadow: -1px -1px 2px #ebebeb; + -webkit-box-shadow: -1px -1px 2px #ebebeb; + box-shadow: -1px -1px 2px #ebebeb; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css new file mode 100644 index 000000000..09dae4807 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css @@ -0,0 +1 @@ +.tag-label:first-child{margin-left:0}.tag-label{margin-left:20px;padding:0 10px 0 12px;background:#ebebeb;color:#6c6c6c;text-decoration:none;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;float:left;height:24px;line-height:24px;position:relative;font-size:.9em}.tag-label:before{content:"";float:left;position:absolute;top:0;left:-12px;width:0;height:0;border-color:transparent #ebebeb transparent transparent;border-style:solid;border-width:12px 12px 12px 0}.tag-label:after{content:"";position:absolute;top:10px;left:0;float:left;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb} \ No newline at end of file From 34d8a0d1a40395c7a21a59b1007c548cac650f69 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 4 Apr 2019 18:29:01 +0800 Subject: [PATCH 085/247] Fixed Chrome version 73 regression on TimePicker --- .../timepicker/resources/js/timepicker.js | 241 +++++++++--------- .../timepicker/resources/js/timepicker.min.js | 2 +- 2 files changed, 123 insertions(+), 120 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js index 55e1f0aa9..a762d6e15 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js @@ -366,142 +366,145 @@ // Show popover LolliClock.prototype.show = function () { - //this.input.trigger('blur'); - if (this.isShown) { - return; - } + var _this = this; + setTimeout(function () { + //_this.input.trigger('blur'); + if (_this.isShown) { + return; + } - raiseCallback(this.options.beforeShow); - var self = this; + raiseCallback(_this.options.beforeShow); + var self = _this; - this.popover.addClass(this.options.orientation); + _this.popover.addClass(_this.options.orientation); - // Initialize - if (!this.isAppended) { - // Append popover to body - $(document.body).append(this.popover); - this.isAppended = true; + // Initialize + if (!_this.isAppended) { + // Append popover to body + $(document.body).append(_this.popover); + _this.isAppended = true; - // Reset position when resize - $(window).on('resize.lolliclock' + this.id, function () { - if (self.isShown) { - self.locate(); - } - }); + // Reset position when resize + $(window).on('resize.lolliclock' + _this.id, function () { + if (self.isShown) { + self.locate(); + } + }); - // Reset position on scroll - $(window).on('scroll.lolliclock', function () { - if (self.isShown) { - self.locate(); - } - }); + // Reset position on scroll + $(window).on('scroll.lolliclock', function () { + if (self.isShown) { + self.locate(); + } + }); - //Add listeners - this.AmPmButtons.on('click', function (e) { - self.changeAmPm(e.currentTarget.children[1].innerHTML); - }); - this.spanMinutes.on('click', function () { - self.toggleView('minutes'); - }); - this.spanHours.on('click', function () { - self.toggleView('hours'); - }); - this.spanAmPm.on('click', function () { - self.changeAmPm(); - }); - } + //Add listeners + _this.AmPmButtons.on('click', function (e) { + self.changeAmPm(e.currentTarget.children[1].innerHTML); + }); + _this.spanMinutes.on('click', function () { + self.toggleView('minutes'); + }); + _this.spanHours.on('click', function () { + self.toggleView('hours'); + }); + _this.spanAmPm.on('click', function () { + self.changeAmPm(); + }); + } - // Set position - self.locate(); - - //animate show - this.plate.addClass('animate'); - this.header.addClass('animate'); - this.popover.addClass('animate'); - this.AmPmButtons.addClass('animate'); - this.spanNewTime.addClass('animate'); - this.spanOldTime.addClass('animate'); - !this.options.autoclose && this.closeButtons.addClass('animate'); - - this.plate.on('webkitAnimationEnd animationend MSAnimationEnd oanimationend', function () { - self.plate.removeClass("animate"); - self.header.removeClass("animate"); - self.popover.removeClass("animate"); - self.AmPmButtons.removeClass("animate"); - self.spanNewTime.removeClass("animate"); - self.spanOldTime.removeClass("animate"); - !self.options.autoclose && self.closeButtons.removeClass("animate"); - self.plate.off('webkitAnimationEnd animationend MSAnimationEnd oanimationend'); - }); + // Set position + self.locate(); + + //animate show + _this.plate.addClass('animate'); + _this.header.addClass('animate'); + _this.popover.addClass('animate'); + _this.AmPmButtons.addClass('animate'); + _this.spanNewTime.addClass('animate'); + _this.spanOldTime.addClass('animate'); + !_this.options.autoclose && _this.closeButtons.addClass('animate'); + + _this.plate.on('webkitAnimationEnd animationend MSAnimationEnd oanimationend', function () { + self.plate.removeClass("animate"); + self.header.removeClass("animate"); + self.popover.removeClass("animate"); + self.AmPmButtons.removeClass("animate"); + self.spanNewTime.removeClass("animate"); + self.spanOldTime.removeClass("animate"); + !self.options.autoclose && self.closeButtons.removeClass("animate"); + self.plate.off('webkitAnimationEnd animationend MSAnimationEnd oanimationend'); + }); - //Get the time - function timeToDate(time) { - var parts = time.split(':'); - if (parts.length === 2){ - var hours = +parts[0]; - var minAM = parts[1].split(' '); - if (minAM.length === 2) { - var mins = minAM[0]; - if (minAM[1] === 'PM') hours += 12; - return new Date(1970, 1, 1, hours, mins); + //Get the time + function timeToDate(time) { + var parts = time.split(':'); + if (parts.length === 2){ + var hours = +parts[0]; + var minAM = parts[1].split(' '); + if (minAM.length === 2) { + var mins = minAM[0]; + if (minAM[1] === 'PM') hours += 12; + return new Date(1970, 1, 1, hours, mins); + } } + return new Date('x'); } - return new Date('x'); - } - function isValidTime(time) { - return !isNaN(timeToDate(time).getTime()); - } + function isValidTime(time) { + return !isNaN(timeToDate(time).getTime()); + } - var value; - var inputValue = this.input.prop('value'); - var defaultValue = this.options.startTime; - var placeholderValue = this.input.prop('placeholder'); - - if (inputValue && isValidTime(inputValue)) { - value = timeToDate(inputValue); - } else if (defaultValue === 'now') { - value = new Date(); - } else if (defaultValue && isValidTime(defaultValue)) { - value = timeToDate(defaultValue); - } else if (placeholderValue && isValidTime(placeholderValue)) { - value = timeToDate(placeholderValue); - } else { - value = new Date(); - } - if(this.options.hour24) { - this.hours = value.getHours() - } else { - this.hours = value.getHours()%12; - this.amOrPm = value.getHours() > 11 ? "AM" : "PM"; - } - this.minutes = value.getMinutes(); - //purposefully wrong because we change it next line + var value; + var inputValue = _this.input.prop('value'); + var defaultValue = _this.options.startTime; + var placeholderValue = _this.input.prop('placeholder'); + + if (inputValue && isValidTime(inputValue)) { + value = timeToDate(inputValue); + } else if (defaultValue === 'now') { + value = new Date(); + } else if (defaultValue && isValidTime(defaultValue)) { + value = timeToDate(defaultValue); + } else if (placeholderValue && isValidTime(placeholderValue)) { + value = timeToDate(placeholderValue); + } else { + value = new Date(); + } + if(_this.options.hour24) { + _this.hours = value.getHours() + } else { + _this.hours = value.getHours()%12; + _this.amOrPm = value.getHours() > 11 ? "AM" : "PM"; + } + _this.minutes = value.getMinutes(); + //purposefully wrong because we change it next line - this.changeAmPm(); + _this.changeAmPm(); - // Set time - self.toggleView('minutes'); - self.toggleView('hours'); + // Set time + self.toggleView('minutes'); + self.toggleView('hours'); - self.isShown = true; + self.isShown = true; - // Hide when clicking or tabbing on any element except the clock, input - $(document).on('click.lolliclock.' + this.id + ' focusin.lolliclock.' + this.id, function (e) { - var target = $(e.target); - if (target.closest(self.popover).length === 0 && - target.closest(self.input).length === 0) { - self.done(); - } - }); + // Hide when clicking or tabbing on any element except the clock, input + $(document).on('click.lolliclock.' + _this.id + ' focusin.lolliclock.' + _this.id, function (e) { + var target = $(e.target); + if (target.closest(self.popover).length === 0 && + target.closest(self.input).length === 0) { + self.done(); + } + }); - // Hide when ESC is pressed - $(document).on('keyup.lolliclock.' + this.id, function (e) { - if (e.keyCode === 27) { - self.hide(); - } - }); - raiseCallback(this.options.afterShow); + // Hide when ESC is pressed + $(document).on('keyup.lolliclock.' + _this.id, function (e) { + if (e.keyCode === 27) { + self.hide(); + } + }); + raiseCallback(_this.options.afterShow); + }, 100); }; // Hide popover diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js index 016139cd0..917ea64da 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js @@ -1 +1 @@ -!function(){var t=window.jQuery;k.DEFAULTS={startTime:"",autoclose:!1,vibrate:!0,hour24:!1,orientation:"portrait",cancelText:"CANCEL",okText:"OK"};var i="ontouchstart"in window,o="mousedown"+(i?" touchstart":""),s="mousemove.lolliclock"+(i?" touchmove.lolliclock":""),l="mouseup.lolliclock"+(i?" touchend.lolliclock":""),e=navigator.vibravarte?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,n="http://www.w3.org/2000/svg";function a(t){return document.createElementNS(n,t)}function c(t){return(t<10?"0":"")+t}var h=0;var d=84,r=50,u=70,p=12,m=2*d,v=350,f=['
','
','
','
','
','
','
',"
",':','
','
','
',"
","
",'',"
",'
','
','
','
','
',"
",'
','
','
','
AM
',"
",'
','
','
','
PM
',"
","
","
","
","
"].join("");function k(i,e){var n,k,w=t(f),b=w.find(".lolliclock-popover"),A=w.find(".lolliclock-plate"),M=w.find(".lolliclock-dial-hours"),C=w.find(".lolliclock-dial-minutes"),y="INPUT"===i.prop("tagName"),P=y?i:i.find("input"),T=this;if(this.id=(k=++h+"",(n="lolli")?n+k:k),this.element=i,this.options=e,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=y,this.input=P,this.popover=w,this.plate=A,this.hoursView=M,this.minutesView=C,this.header=w.find(".lolliclock-header"),this.spanHours=w.find(".lolliclock-hours"),this.spanMinutes=w.find(".lolliclock-minutes"),this.spanNewTime=w.find(".lolliclock-time-new"),this.spanOldTime=w.find(".lolliclock-time-old"),this.spanAmPm=w.find(".lolliclock-am-pm"),this.amOrPm="PM",this.AmPmButtons=w.find(".lolliclock-ampm-btn"),this.amButton=w.find("#lolliclock-btn-am"),this.pmButton=w.find("#lolliclock-btn-pm"),this.options.hour24&&(this.AmPmButtons.hide(),this.spanAmPm.hide()),w.addClass(this.options.orientation),!e.autoclose){this.popover.css("height","380px");var x=t('
').appendTo(b);t('
'+e.cancelText+"
").click(t.proxy(this.hide,this)).appendTo(x),t('
'+e.okText+"
").click(t.proxy(this.done,this)).appendTo(x),this.closeButtons=w.find(".lolliclock-button")}P.on("focus.lolliclock click.lolliclock",t.proxy(this.show,this));var V,E,B,N=t('
');if(e.hour24){for(V=1;V<13;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:d+Math.sin(B)*r-p,top:d-Math.cos(B)*r-p}),E.html(V),M.append(E);for(V=13;V<=24;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:d+Math.sin(B)*u-p,top:d-Math.cos(B)*u-p}),24===V?E.html("00"):E.html(V),M.append(E)}else for(V=1;V<13;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:d+Math.sin(B)*u-p,top:d-Math.cos(B)*u-p}),E.html(V),M.append(E);for(V=0;V<60;V+=5)E=N.clone(),B=V/30*Math.PI,E.css({left:d+Math.sin(B)*u-p,top:d-Math.cos(B)*u-p}),E.html(c(V)),C.append(E);A.on(o,function(i){var o=A.offset(),n=/^touch/.test(i.type),a=o.left+d,c=o.top+d,h=(n?i.originalEvent.touches[0]:i).pageX-a,m=(n?i.originalEvent.touches[0]:i).pageY-c,f=Math.sqrt(h*h+m*m),k=!1;if(outsideMode=!0,fu-p)outsideMode=!0;else{if(!(f>r-p&&fe?e:a,c.left=s<8?8:s>l?l:s,o.css(c),o.show()},k.prototype.show=function(){if(!this.isShown){g(this.options.beforeShow);var i,o=this;this.popover.addClass(this.options.orientation),this.isAppended||(t(document.body).append(this.popover),this.isAppended=!0,t(window).on("resize.lolliclock"+this.id,function(){o.isShown&&o.locate()}),t(window).on("scroll.lolliclock",function(){o.isShown&&o.locate()}),this.AmPmButtons.on("click",function(t){o.changeAmPm(t.currentTarget.children[1].innerHTML)}),this.spanMinutes.on("click",function(){o.toggleView("minutes")}),this.spanHours.on("click",function(){o.toggleView("hours")}),this.spanAmPm.on("click",function(){o.changeAmPm()})),o.locate(),this.plate.addClass("animate"),this.header.addClass("animate"),this.popover.addClass("animate"),this.AmPmButtons.addClass("animate"),this.spanNewTime.addClass("animate"),this.spanOldTime.addClass("animate"),!this.options.autoclose&&this.closeButtons.addClass("animate"),this.plate.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){o.plate.removeClass("animate"),o.header.removeClass("animate"),o.popover.removeClass("animate"),o.AmPmButtons.removeClass("animate"),o.spanNewTime.removeClass("animate"),o.spanOldTime.removeClass("animate"),!o.options.autoclose&&o.closeButtons.removeClass("animate"),o.plate.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend")});var s=this.input.prop("value"),l=this.options.startTime,e=this.input.prop("placeholder");i=s&&a(s)?n(s):"now"===l?new Date:l&&a(l)?n(l):e&&a(e)?n(e):new Date,this.options.hour24?this.hours=i.getHours():(this.hours=i.getHours()%12,this.amOrPm=i.getHours()>11?"AM":"PM"),this.minutes=i.getMinutes(),this.changeAmPm(),o.toggleView("minutes"),o.toggleView("hours"),o.isShown=!0,t(document).on("click.lolliclock."+this.id+" focusin.lolliclock."+this.id,function(i){var s=t(i.target);0===s.closest(o.popover).length&&0===s.closest(o.input).length&&o.done()}),t(document).on("keyup.lolliclock."+this.id,function(t){27===t.keyCode&&o.hide()}),g(this.options.afterShow)}function n(t){var i=t.split(":");if(2===i.length){var o=+i[0],s=i[1].split(" ");if(2===s.length){var l=s[0];return"PM"===s[1]&&(o+=12),new Date(1970,1,1,o,l)}}return new Date("x")}function a(t){return!isNaN(n(t).getTime())}},k.prototype.hide=function(){g(this.options.beforeHide);var i=this;i.popover.addClass("animate-out"),i.plate.addClass("animate-out"),i.header.addClass("animate-out"),i.AmPmButtons.addClass("animate-out"),!i.options.autoclose&&i.closeButtons.addClass("animate-out"),this.popover.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){t(i.spanHours[0].childNodes[0]).html(""),t(i.spanMinutes[0].childNodes[0]).html(""),i.popover.removeClass("animate-out"),i.plate.removeClass("animate-out"),i.header.removeClass("animate-out"),i.AmPmButtons.removeClass("animate-out"),!i.options.autoclose&&i.closeButtons.removeClass("animate-out"),i.popover.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend"),t(document).off("click.lolliclock."+i.id+" focusin.lolliclock."+i.id),t(document).off("keyup.lolliclock."+i.id),i.popover.hide(),g(i.options.afterHide)}),i.isShown=!1},k.prototype.toggleView=function(i,o){var l="hours"===i,e=l?this.hoursView:this.minutesView,n=l?this.minutesView:this.hoursView;if(this.currentView=i,this.spanHours.toggleClass("lolliclock-primary-text",l),this.spanMinutes.toggleClass("lolliclock-primary-text",!l),n.addClass("lolliclock-dial-out"),e.css("visibility","visible").removeClass("lolliclock-dial-out"),this.resetClock(o),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){n.css("visibility","hidden")},v),l)this.plate.off(s);else{var a=this;this.plate.on(s,function(i){var o=a.plate.offset(),s=o.left+d,l=o.top+d,e=i.pageX-s,n=i.pageY-l,c=Math.sqrt(e*e+n*n);c>u-p&&c+n.html()||!n.html())&&(a.html(l),n.addClass("old-up"),a.addClass("new-up")),this.g.insertBefore(this.hand,this.bearing),this.g.insertBefore(this.bg,this.fg),this.bg.setAttribute("class","lolliclock-canvas-bg");var f=r;s&&(f=u);var k=Math.sin(h)*f,g=-Math.cos(h)*f;this.hand.setAttribute("x2",Math.sin(h)*(f-p)),this.hand.setAttribute("y2",-Math.cos(h)*(f-p)),this.bg.setAttribute("cx",k),this.bg.setAttribute("cy",g),this.fg.setAttribute("cx",k),this.fg.setAttribute("cy",g)},k.prototype.done=function(){g(this.options.beforeDone);var t=this.input.prop("value"),i="";(i=this.options.hour24?c(this.hours)+":"+c(this.minutes):this.hours+":"+c(this.minutes)+" "+this.amOrPm)!==t&&(this.input.prop("value",i),this.input.trigger("input"),this.input.trigger("change")),this.hide()},k.prototype.remove=function(){this.element.removeData("lolliclock"),this.input.off("focus.lolliclock click.lolliclock"),this.isShown&&this.hide(),this.isAppended&&(t(window).off("resize.lolliclock"+this.id),t(window).off("scroll.lolliclock"+this.id),this.popover.remove())},t.fn.lolliclock=function(i){var o=Array.prototype.slice.call(arguments,1);return this.each(function(){var s=t(this),l=s.data("lolliclock");if(l)"function"==typeof l[i]&&l[i].apply(l,o);else{var e=t.extend({},k.DEFAULTS,s.data(),"object"==typeof i&&i);s.data("lolliclock",new k(s,e))}})}}(); \ No newline at end of file +!function(){var t=window.jQuery;k.DEFAULTS={startTime:"",autoclose:!1,vibrate:!0,hour24:!1,orientation:"portrait",cancelText:"CANCEL",okText:"OK"};var i="ontouchstart"in window,o="mousedown"+(i?" touchstart":""),l="mousemove.lolliclock"+(i?" touchmove.lolliclock":""),e="mouseup.lolliclock"+(i?" touchend.lolliclock":""),s=navigator.vibravarte?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,n="http://www.w3.org/2000/svg";function a(t){return document.createElementNS(n,t)}function c(t){return(t<10?"0":"")+t}var d=0;var r=84,h=50,u=70,p=12,m=2*r,v=350,f=['
','
','
','
','
','
','
',"
",':','
','
','
',"
","
",'',"
",'
','
','
','
','
',"
",'
','
','
','
AM
',"
",'
','
','
','
PM
',"
","
","
","
","
"].join("");function k(i,s){var n,k,w=t(f),b=w.find(".lolliclock-popover"),A=w.find(".lolliclock-plate"),M=w.find(".lolliclock-dial-hours"),C=w.find(".lolliclock-dial-minutes"),y="INPUT"===i.prop("tagName"),P=y?i:i.find("input"),T=this;if(this.id=(k=++d+"",(n="lolli")?n+k:k),this.element=i,this.options=s,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=y,this.input=P,this.popover=w,this.plate=A,this.hoursView=M,this.minutesView=C,this.header=w.find(".lolliclock-header"),this.spanHours=w.find(".lolliclock-hours"),this.spanMinutes=w.find(".lolliclock-minutes"),this.spanNewTime=w.find(".lolliclock-time-new"),this.spanOldTime=w.find(".lolliclock-time-old"),this.spanAmPm=w.find(".lolliclock-am-pm"),this.amOrPm="PM",this.AmPmButtons=w.find(".lolliclock-ampm-btn"),this.amButton=w.find("#lolliclock-btn-am"),this.pmButton=w.find("#lolliclock-btn-pm"),this.options.hour24&&(this.AmPmButtons.hide(),this.spanAmPm.hide()),w.addClass(this.options.orientation),!s.autoclose){this.popover.css("height","380px");var x=t('
').appendTo(b);t('
'+s.cancelText+"
").click(t.proxy(this.hide,this)).appendTo(x),t('
'+s.okText+"
").click(t.proxy(this.done,this)).appendTo(x),this.closeButtons=w.find(".lolliclock-button")}P.on("focus.lolliclock click.lolliclock",t.proxy(this.show,this));var V,E,B,N=t('
');if(s.hour24){for(V=1;V<13;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:r+Math.sin(B)*h-p,top:r-Math.cos(B)*h-p}),E.html(V),M.append(E);for(V=13;V<=24;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:r+Math.sin(B)*u-p,top:r-Math.cos(B)*u-p}),24===V?E.html("00"):E.html(V),M.append(E)}else for(V=1;V<13;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:r+Math.sin(B)*u-p,top:r-Math.cos(B)*u-p}),E.html(V),M.append(E);for(V=0;V<60;V+=5)E=N.clone(),B=V/30*Math.PI,E.css({left:r+Math.sin(B)*u-p,top:r-Math.cos(B)*u-p}),E.html(c(V)),C.append(E);A.on(o,function(i){var o=A.offset(),n=/^touch/.test(i.type),a=o.left+r,c=o.top+r,d=(n?i.originalEvent.touches[0]:i).pageX-a,m=(n?i.originalEvent.touches[0]:i).pageY-c,f=Math.sqrt(d*d+m*m),k=!1;if(outsideMode=!0,fu-p)outsideMode=!0;else{if(!(f>h-p&&fs?s:a,c.left=l<8?8:l>e?e:l,o.css(c),o.show()},k.prototype.show=function(){var i=this;setTimeout(function(){if(!i.isShown){g(i.options.beforeShow);var o,l=i;i.popover.addClass(i.options.orientation),i.isAppended||(t(document.body).append(i.popover),i.isAppended=!0,t(window).on("resize.lolliclock"+i.id,function(){l.isShown&&l.locate()}),t(window).on("scroll.lolliclock",function(){l.isShown&&l.locate()}),i.AmPmButtons.on("click",function(t){l.changeAmPm(t.currentTarget.children[1].innerHTML)}),i.spanMinutes.on("click",function(){l.toggleView("minutes")}),i.spanHours.on("click",function(){l.toggleView("hours")}),i.spanAmPm.on("click",function(){l.changeAmPm()})),l.locate(),i.plate.addClass("animate"),i.header.addClass("animate"),i.popover.addClass("animate"),i.AmPmButtons.addClass("animate"),i.spanNewTime.addClass("animate"),i.spanOldTime.addClass("animate"),!i.options.autoclose&&i.closeButtons.addClass("animate"),i.plate.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){l.plate.removeClass("animate"),l.header.removeClass("animate"),l.popover.removeClass("animate"),l.AmPmButtons.removeClass("animate"),l.spanNewTime.removeClass("animate"),l.spanOldTime.removeClass("animate"),!l.options.autoclose&&l.closeButtons.removeClass("animate"),l.plate.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend")});var e=i.input.prop("value"),s=i.options.startTime,n=i.input.prop("placeholder");o=e&&c(e)?a(e):"now"===s?new Date:s&&c(s)?a(s):n&&c(n)?a(n):new Date,i.options.hour24?i.hours=o.getHours():(i.hours=o.getHours()%12,i.amOrPm=o.getHours()>11?"AM":"PM"),i.minutes=o.getMinutes(),i.changeAmPm(),l.toggleView("minutes"),l.toggleView("hours"),l.isShown=!0,t(document).on("click.lolliclock."+i.id+" focusin.lolliclock."+i.id,function(i){var o=t(i.target);0===o.closest(l.popover).length&&0===o.closest(l.input).length&&l.done()}),t(document).on("keyup.lolliclock."+i.id,function(t){27===t.keyCode&&l.hide()}),g(i.options.afterShow)}function a(t){var i=t.split(":");if(2===i.length){var o=+i[0],l=i[1].split(" ");if(2===l.length){var e=l[0];return"PM"===l[1]&&(o+=12),new Date(1970,1,1,o,e)}}return new Date("x")}function c(t){return!isNaN(a(t).getTime())}},100)},k.prototype.hide=function(){g(this.options.beforeHide);var i=this;i.popover.addClass("animate-out"),i.plate.addClass("animate-out"),i.header.addClass("animate-out"),i.AmPmButtons.addClass("animate-out"),!i.options.autoclose&&i.closeButtons.addClass("animate-out"),this.popover.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){t(i.spanHours[0].childNodes[0]).html(""),t(i.spanMinutes[0].childNodes[0]).html(""),i.popover.removeClass("animate-out"),i.plate.removeClass("animate-out"),i.header.removeClass("animate-out"),i.AmPmButtons.removeClass("animate-out"),!i.options.autoclose&&i.closeButtons.removeClass("animate-out"),i.popover.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend"),t(document).off("click.lolliclock."+i.id+" focusin.lolliclock."+i.id),t(document).off("keyup.lolliclock."+i.id),i.popover.hide(),g(i.options.afterHide)}),i.isShown=!1},k.prototype.toggleView=function(i,o){var e="hours"===i,s=e?this.hoursView:this.minutesView,n=e?this.minutesView:this.hoursView;if(this.currentView=i,this.spanHours.toggleClass("lolliclock-primary-text",e),this.spanMinutes.toggleClass("lolliclock-primary-text",!e),n.addClass("lolliclock-dial-out"),s.css("visibility","visible").removeClass("lolliclock-dial-out"),this.resetClock(o),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){n.css("visibility","hidden")},v),e)this.plate.off(l);else{var a=this;this.plate.on(l,function(i){var o=a.plate.offset(),l=o.left+r,e=o.top+r,s=i.pageX-l,n=i.pageY-e,c=Math.sqrt(s*s+n*n);c>u-p&&c+n.html()||!n.html())&&(a.html(e),n.addClass("old-up"),a.addClass("new-up")),this.g.insertBefore(this.hand,this.bearing),this.g.insertBefore(this.bg,this.fg),this.bg.setAttribute("class","lolliclock-canvas-bg");var f=h;l&&(f=u);var k=Math.sin(d)*f,g=-Math.cos(d)*f;this.hand.setAttribute("x2",Math.sin(d)*(f-p)),this.hand.setAttribute("y2",-Math.cos(d)*(f-p)),this.bg.setAttribute("cx",k),this.bg.setAttribute("cy",g),this.fg.setAttribute("cx",k),this.fg.setAttribute("cy",g)},k.prototype.done=function(){g(this.options.beforeDone);var t=this.input.prop("value"),i="";(i=this.options.hour24?c(this.hours)+":"+c(this.minutes):this.hours+":"+c(this.minutes)+" "+this.amOrPm)!==t&&(this.input.prop("value",i),this.input.trigger("input"),this.input.trigger("change")),this.hide()},k.prototype.remove=function(){this.element.removeData("lolliclock"),this.input.off("focus.lolliclock click.lolliclock"),this.isShown&&this.hide(),this.isAppended&&(t(window).off("resize.lolliclock"+this.id),t(window).off("scroll.lolliclock"+this.id),this.popover.remove())},t.fn.lolliclock=function(i){var o=Array.prototype.slice.call(arguments,1);return this.each(function(){var l=t(this),e=l.data("lolliclock");if(e)"function"==typeof e[i]&&e[i].apply(e,o);else{var s=t.extend({},k.DEFAULTS,l.data(),"object"==typeof i&&i);l.data("lolliclock",new k(l,s))}})}}(); \ No newline at end of file From 5d22c77ce9f3aaa5c4bd47e98a7ae34b315743fa Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 7 Apr 2019 20:08:35 +0800 Subject: [PATCH 086/247] Tag Label updates --- .../design/incubator/client/tag/TagLabel.java | 60 +++++++++++- .../incubator/client/tag/TagPosition.java | 44 +++++++++ .../client/tag/resources/css/tag.css | 92 ++++++++++++++++--- .../client/tag/resources/css/tag.min.css | 2 +- 4 files changed, 183 insertions(+), 15 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/tag/TagPosition.java diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java b/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java index 780e4914a..1f4060496 100644 --- a/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java @@ -1,10 +1,32 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.tag; import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.HasSize; +import gwt.material.design.client.base.mixin.StyleMixin; +import gwt.material.design.client.constants.Size; import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.incubator.client.AddinsIncubator; -public class TagLabel extends MaterialLabel { +public class TagLabel extends MaterialLabel implements HasSize { static { if (AddinsIncubator.isDebug()) { @@ -14,9 +36,45 @@ public class TagLabel extends MaterialLabel { } } + private StyleMixin sizeMixin; + private StyleMixin positionMixin; + public TagLabel() { super(); addStyleName("tag-label"); + setPosition(TagPosition.LEFT); + } + + @Override + public void setSize(Size size) { + getSizeMixin().setStyle(size.getCssName()); + } + + @Override + public Size getSize() { + return Size.fromStyleName(getSizeMixin().getStyle()); + } + + public void setPosition(TagPosition position) { + getPositionMixin().setStyle(position.getCssName()); + } + + public TagPosition getPosition() { + return TagPosition.fromStyleName(getPositionMixin().getStyle()); + } + + public StyleMixin getSizeMixin() { + if (sizeMixin == null) { + sizeMixin = new StyleMixin<>(this); + } + return sizeMixin; + } + + public StyleMixin getPositionMixin() { + if (positionMixin == null) { + positionMixin = new StyleMixin<>(this); + } + return positionMixin; } } diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagPosition.java b/src/main/java/gwt/material/design/incubator/client/tag/TagPosition.java new file mode 100644 index 000000000..e62b15565 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagPosition.java @@ -0,0 +1,44 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.tag; + +import gwt.material.design.client.base.helper.EnumHelper; +import gwt.material.design.client.constants.CssType; +import gwt.material.design.client.constants.Position; + +public enum TagPosition implements CssType { + LEFT("arrow-left"), + RIGHT("arrow-right"); + + private String cssName; + + TagPosition(String cssName) { + this.cssName = cssName; + } + + @Override + public String getCssName() { + return cssName; + } + + public static TagPosition fromStyleName(final String styleName) { + return EnumHelper.fromStyleName(styleName, TagPosition.class, LEFT); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css index 7ff1efd78..c12ccbd06 100644 --- a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css @@ -1,42 +1,48 @@ .tag-label:first-child { - margin-left: 0px; + margin-left: 12px; } .tag-label { - margin-left: 20px; padding: 0 10px 0 12px; background: #ebebeb; color: #6c6c6c; text-decoration: none; + float: left; + height: 24px; + line-height: 24px; + position: relative; + font-size: 0.9em; + margin-bottom: 12px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; - float: left; - height: 24px; - line-height: 24px; - position: relative; - font-size: 0.9em; } -.tag-label:before { +.tag-label.arrow-left { + margin-left: 20px; +} + +.tag-label:before, +.tag-label:after { content: ""; - float: left; position: absolute; +} + +.tag-label.arrow-left:before { + float: left; top: 0; left: -12px; width: 0; height: 0; border-color: transparent #ebebeb transparent transparent; - border-style: solid; border-width: 12px 12px 12px 0; + border-style: solid; } -.tag-label:after { - content: ""; - position: absolute; +.tag-label.arrow-left:after { top: 10px; left: 0; float: left; @@ -49,4 +55,64 @@ -moz-box-shadow: -1px -1px 2px #ebebeb; -webkit-box-shadow: -1px -1px 2px #ebebeb; box-shadow: -1px -1px 2px #ebebeb; +} + +/** Right **/ +.tag-label.arrow-right { + margin-right: 20px; + border-radius: 0px; +} + +.tag-label.arrow-right:before { + top: 10px; + right: 0; + float: right; + width: 4px; + height: 4px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + background: #fff; + -moz-box-shadow: -1px -1px 2px #ebebeb; + -webkit-box-shadow: -1px -1px 2px #ebebeb; + box-shadow: -1px -1px 2px #ebebeb; +} + +.tag-label.arrow-right:after { + border-width: 12px 0px 12px 12px !important; + border-color: transparent transparent transparent #ebebeb !important; + right: -12px; + border-style: solid; +} + +/** Sizes **/ +/** Left - Medium **/ +.tag-label.medium { + height: 32px; + line-height: 32px; +} + +.tag-label.arrow-left.medium:before { + border-width: 16px 16px 16px 0; + left: -15px; +} + +/** Right - Medium **/ +.tag-label.arrow-right.medium:after { + border-width: 16px 0px 16px 16px !important; + right: -15px; +} + +.tag-label.arrow-right.medium:before { + top: 12px; + width: 6px; + height: 6px; + border-radius: 3px; +} + +/** Left - Large **/ + +.tag-label.large { + height: 40px; + line-height: 40px; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css index 09dae4807..0bb0f4622 100644 --- a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css @@ -1 +1 @@ -.tag-label:first-child{margin-left:0}.tag-label{margin-left:20px;padding:0 10px 0 12px;background:#ebebeb;color:#6c6c6c;text-decoration:none;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;float:left;height:24px;line-height:24px;position:relative;font-size:.9em}.tag-label:before{content:"";float:left;position:absolute;top:0;left:-12px;width:0;height:0;border-color:transparent #ebebeb transparent transparent;border-style:solid;border-width:12px 12px 12px 0}.tag-label:after{content:"";position:absolute;top:10px;left:0;float:left;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb} \ No newline at end of file +.tag-label:first-child{margin-left:12px}.tag-label{padding:0 10px 0 12px;background:#ebebeb;color:#6c6c6c;text-decoration:none;float:left;height:24px;line-height:24px;position:relative;font-size:.9em;margin-bottom:12px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.tag-label.arrow-left{margin-left:20px}.tag-label:after,.tag-label:before{content:"";position:absolute}.tag-label.arrow-left:before{float:left;top:0;left:-12px;width:0;height:0;border-color:transparent #ebebeb transparent transparent;border-width:12px 12px 12px 0;border-style:solid}.tag-label.arrow-left:after{top:10px;left:0;float:left;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb}.tag-label.arrow-right{margin-right:20px;border-radius:0}.tag-label.arrow-right:before{top:10px;right:0;float:right;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb}.tag-label.arrow-right:after{border-width:12px 0 12px 12px!important;border-color:transparent transparent transparent #ebebeb!important;right:-12px;border-style:solid}.tag-label.medium{height:32px;line-height:32px}.tag-label.arrow-left.medium:before{border-width:16px 16px 16px 0;left:-15px}.tag-label.arrow-right.medium:after{border-width:16px 0 16px 16px!important;right:-15px}.tag-label.arrow-right.medium:before{top:12px;width:6px;height:6px;border-radius:3px}.tag-label.large{height:40px;line-height:40px} \ No newline at end of file From d905526ebb86977288c91f6f385a594e7c9cff56 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 9 Apr 2019 12:43:21 +0800 Subject: [PATCH 087/247] Revisit and standardized input mask events. --- .../client/inputmask/AbstractInputMask.java | 14 +++++++------- .../inputmask/events/HasInputMaskHandlers.java | 4 ++-- .../{ChangeEvent.java => MaskChangeEvent.java} | 16 ++++++++-------- ...KeyPressEvent.java => MaskKeyPressEvent.java} | 16 ++++++++-------- 4 files changed, 25 insertions(+), 25 deletions(-) rename src/main/java/gwt/material/design/addins/client/inputmask/events/{ChangeEvent.java => MaskChangeEvent.java} (70%) rename src/main/java/gwt/material/design/addins/client/inputmask/events/{KeyPressEvent.java => MaskKeyPressEvent.java} (69%) diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java index caf3c2680..c1eaa2fd2 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java @@ -110,8 +110,8 @@ public void load() { */ public void load(String mask) { options.onComplete = object -> CompleteEvent.fire(this, object); - options.onKeyPress = object -> KeyPressEvent.fire(this, object); - options.onChange = object -> ChangeEvent.fire(this, object); + options.onKeyPress = object -> MaskKeyPressEvent.fire(this, object); + options.onChange = object -> MaskChangeEvent.fire(this, object); options.onInvalid = (object, event, function, error) -> InvalidEvent.fire(this, object, error[0]); $(valueBoxBase.getElement()).mask(mask, options); } @@ -182,7 +182,7 @@ public void setSelectOnFocus(boolean selectOnFocus) { * Gets the value of the field without the mask. */ public String getCleanValue() { - return valueBoxBase.isAttached() ? $(valueBoxBase.getElement()).cleanVal() : null; + return valueBoxBase.isAttached() && valueBoxBase.getText() != null ? $(valueBoxBase.getElement()).cleanVal() : null; } public String getValueWithMask() { @@ -202,8 +202,8 @@ public HandlerRegistration addCompleteHandler(CompleteEvent.CompleteHandler hand } @Override - public HandlerRegistration addChangeHandler(ChangeEvent.ChangeHandler handler) { - return addHandler(handler, ChangeEvent.TYPE); + public HandlerRegistration addMaskChangeHandler(MaskChangeEvent.MaskChangeHandler handler) { + return addHandler(handler, MaskChangeEvent.TYPE); } @Override @@ -212,7 +212,7 @@ public HandlerRegistration addInvalidHandler(InvalidEvent.InvalidHandler handler } @Override - public HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler) { - return addHandler(handler, KeyPressEvent.TYPE); + public HandlerRegistration addMaskKeyPressHandler(MaskKeyPressEvent.MaskKeyPressHandler handler) { + return addHandler(handler, MaskKeyPressEvent.TYPE); } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java b/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java index 5956da88a..5667117fe 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java @@ -25,9 +25,9 @@ public interface HasInputMaskHandlers { HandlerRegistration addCompleteHandler(CompleteEvent.CompleteHandler handler); - HandlerRegistration addChangeHandler(ChangeEvent.ChangeHandler handler); + HandlerRegistration addMaskChangeHandler(MaskChangeEvent.MaskChangeHandler handler); HandlerRegistration addInvalidHandler(InvalidEvent.InvalidHandler handler); - HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler); + HandlerRegistration addMaskKeyPressHandler(MaskKeyPressEvent.MaskKeyPressHandler handler); } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/events/ChangeEvent.java b/src/main/java/gwt/material/design/addins/client/inputmask/events/MaskChangeEvent.java similarity index 70% rename from src/main/java/gwt/material/design/addins/client/inputmask/events/ChangeEvent.java rename to src/main/java/gwt/material/design/addins/client/inputmask/events/MaskChangeEvent.java index 493b14799..732587b45 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/events/ChangeEvent.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/events/MaskChangeEvent.java @@ -23,26 +23,26 @@ import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; -public class ChangeEvent extends GwtEvent { +public class MaskChangeEvent extends GwtEvent { - public static final Type TYPE = new Type<>(); + public static final Type TYPE = new Type<>(); private T result; - public ChangeEvent(T result) { + public MaskChangeEvent(T result) { this.result = result; } public static void fire(HasHandlers source, Object result) { - source.fireEvent(new ChangeEvent(result)); + source.fireEvent(new MaskChangeEvent(result)); } @Override - public Type getAssociatedType() { + public Type getAssociatedType() { return TYPE; } @Override - protected void dispatch(ChangeEvent.ChangeHandler handler) { + protected void dispatch(MaskChangeHandler handler) { handler.onChange(this); } @@ -50,7 +50,7 @@ public T getResult() { return result; } - public interface ChangeHandler extends EventHandler { - void onChange(ChangeEvent event); + public interface MaskChangeHandler extends EventHandler { + void onChange(MaskChangeEvent event); } } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/events/KeyPressEvent.java b/src/main/java/gwt/material/design/addins/client/inputmask/events/MaskKeyPressEvent.java similarity index 69% rename from src/main/java/gwt/material/design/addins/client/inputmask/events/KeyPressEvent.java rename to src/main/java/gwt/material/design/addins/client/inputmask/events/MaskKeyPressEvent.java index a3dfdab8e..4739249db 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/events/KeyPressEvent.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/events/MaskKeyPressEvent.java @@ -23,26 +23,26 @@ import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; -public class KeyPressEvent extends GwtEvent { +public class MaskKeyPressEvent extends GwtEvent { - public static final Type TYPE = new Type<>(); + public static final Type TYPE = new Type<>(); private T result; - public KeyPressEvent(T result) { + public MaskKeyPressEvent(T result) { this.result = result; } public static void fire(HasHandlers source, Object result) { - source.fireEvent(new KeyPressEvent(result)); + source.fireEvent(new MaskKeyPressEvent(result)); } @Override - public Type getAssociatedType() { + public Type getAssociatedType() { return TYPE; } @Override - protected void dispatch(KeyPressEvent.KeyPressHandler handler) { + protected void dispatch(MaskKeyPressHandler handler) { handler.onKeyPress(this); } @@ -50,7 +50,7 @@ public T getResult() { return result; } - public interface KeyPressHandler extends EventHandler { - void onKeyPress(KeyPressEvent event); + public interface MaskKeyPressHandler extends EventHandler { + void onKeyPress(MaskKeyPressEvent event); } } \ No newline at end of file From c1c350f15f16ad358df17c6afd12879ae15a8cce Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 22 Apr 2019 21:10:11 +0800 Subject: [PATCH 088/247] Fixed DateOfBirthPicker layout --- .../client/dob/DateOfBirthPicker.java | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 73381ac9e..9011a26d1 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -58,29 +58,35 @@ public class DateOfBirthPicker extends AbstractValueWidget implements HasF public DateOfBirthPicker() { super(Document.get().createDivElement(), CssName.ROW); - setupMonth(); - setupDay(); - setupYear(); + setupLayout(); + setupHandlers(); addStyleName("dob-container"); } - @Override - protected void onLoad() { - super.onLoad(); + protected void setupLayout() { + // Month + month.addStyleName("dob-month"); + month.setGrid("s12 m5"); - add(month); - add(day); - add(year); - } + // Day + day.addStyleName("dob-day"); + day.setMask("00"); + day.setFloat(Style.Float.LEFT); + day.setTextAlign(TextAlign.CENTER); + day.setPlaceholder("DD"); + day.setGrid("s4 m3"); - public void reload() { - setupMonth(); - setupDay(); - setupYear(); + // Year + year.addStyleName("dob-year"); + year.setMask("0000"); + year.setFloat(Style.Float.LEFT); + year.setTextAlign(TextAlign.CENTER); + year.setPlaceholder("YYYY"); + year.setGrid("s8 m4"); } - protected void setupMonth() { - month.addStyleName("dob-month"); + protected void setupHandlers() { + // Month if (dataProvider.get().size() > 12) { setErrorText(dataProvider.getInvalidMonthMessage()); } else { @@ -90,7 +96,7 @@ protected void setupMonth() { } } month.setMatcher(DateMonthMatcher.getDefaultMonthMatcher()); - month.setGrid("s12 m5"); + month.addValueChangeHandler(event -> { if (validateDate()) { value.setMonth(month.getSingleValue()); @@ -100,15 +106,8 @@ protected void setupMonth() { if (dataProvider.getMonthLabel() != null && !dataProvider.getMonthLabel().isEmpty()) { month.setLabel(dataProvider.getMonthLabel()); } - } - protected void setupDay() { - day.addStyleName("dob-day"); - day.setMask("00"); - day.setFloat(Style.Float.LEFT); - day.setTextAlign(TextAlign.CENTER); - day.setPlaceholder("DD"); - day.setGrid("s4 m3"); + // Day day.addValueChangeHandler(event -> { if (validateDate()) { value.setDate(day.getValue()); @@ -118,15 +117,8 @@ protected void setupDay() { if (dataProvider.getDayLabel() != null && !dataProvider.getDayLabel().isEmpty()) { day.setLabel(dataProvider.getDayLabel()); } - } - protected void setupYear() { - year.addStyleName("dob-year"); - year.setMask("0000"); - year.setFloat(Style.Float.LEFT); - year.setTextAlign(TextAlign.CENTER); - year.setPlaceholder("YYYY"); - year.setGrid("s8 m4"); + // Year year.addValueChangeHandler(event -> { if (validateDate()) { value.setYear(year.getValue() - 1900); @@ -138,9 +130,22 @@ protected void setupYear() { } } + @Override + protected void onLoad() { + super.onLoad(); + + add(month); + add(day); + add(year); + } + + public void reload() { + setupHandlers(); + } + protected boolean validateDate() { boolean valid = true; - if (!(month.getSingleValue() != null && month.getSingleValue() > 0 && month.getSingleValue() < 12)) { + if (!(month.getSingleValue() != null && month.getSingleValue() >= 0 && month.getSingleValue() < 12)) { valid = false; month.setErrorText(dataProvider.getInvalidMonthMessage()); } else { From c78d65e7bf0c7fa924db7e1f72ab591178d1f646 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 26 Apr 2019 08:37:59 +0800 Subject: [PATCH 089/247] CoboBox Updates - Added opening and closing event. - Added tab focus support enhancement --- .../client/combobox/MaterialComboBox.java | 42 +++++++++++++++++-- .../combobox/events/ComboBoxEvents.java | 2 + .../combobox/events/HasComboBoxHandlers.java | 15 +++++++ 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 41bcb0290..40afbd4a2 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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. @@ -25,12 +25,13 @@ import com.google.gwt.dom.client.Style; import com.google.gwt.event.logical.shared.*; import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; import gwt.material.design.addins.client.combobox.async.DefaultComboBoxDisplayLoader; -import gwt.material.design.addins.client.combobox.base.HasUnselectItemHandler; import gwt.material.design.addins.client.combobox.events.ComboBoxEvents; +import gwt.material.design.addins.client.combobox.events.HasComboBoxHandlers; import gwt.material.design.addins.client.combobox.events.SelectItemEvent; import gwt.material.design.addins.client.combobox.events.UnselectItemEvent; import gwt.material.design.addins.client.combobox.js.JsComboBox; @@ -50,6 +51,8 @@ import gwt.material.design.client.base.mixin.StatusTextMixin; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.FieldType; +import gwt.material.design.client.events.ClosingEvent; +import gwt.material.design.client.events.OpeningEvent; import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.client.ui.html.Label; import gwt.material.design.client.ui.html.OptGroup; @@ -92,7 +95,7 @@ */ //@formatter:on public class MaterialComboBox extends AbstractValueWidget> implements JsLoader, HasPlaceholder, - HasOpenHandlers, HasCloseHandlers, HasUnselectItemHandler, HasReadOnly, HasFieldTypes, IsAsyncWidget> { + HasComboBoxHandlers, HasReadOnly, HasFieldTypes, IsAsyncWidget> { static { if (MaterialAddins.isDebug()) { @@ -145,6 +148,7 @@ protected void onLoad() { public void load() { JsComboBox jsComboBox = $(listbox.getElement()); jsComboBox.select2(options); + setId(DOM.createUniqueId()); jsComboBox.on(ComboBoxEvents.CHANGE, event -> { if (!suppressChangeEvent) { @@ -165,6 +169,11 @@ public void load() { return true; }); + jsComboBox.on(ComboBoxEvents.OPENING, (e, param1) -> { + OpeningEvent.fire(this); + return true; + }); + jsComboBox.on(ComboBoxEvents.OPEN, (event1, o) -> { if (isAsynchronous()) { @@ -178,11 +187,25 @@ public void load() { return true; }); + jsComboBox.on(ComboBoxEvents.CLOSING, (e, param1) -> { + ClosingEvent.fire(this); + if (getValue() != null && !getValue().isEmpty()) { + jsComboBox.select2("focus"); + } + return true; + }); + jsComboBox.on(ComboBoxEvents.CLOSE, (event1, o) -> { CloseEvent.fire(this, null); return true; }); + // Tab Focus support + body().on("focus", "#" + getId() + " .select2", (e, param1) -> { + open(); + return true; + }); + displayArrowForAllowClearOption(false); if (getTextColor() != null) { @@ -207,6 +230,7 @@ public void unload() { jsComboBox.off(ComboBoxEvents.UNSELECT); jsComboBox.off(ComboBoxEvents.OPEN); jsComboBox.off(ComboBoxEvents.CLOSE); + body().off("focus"); jsComboBox.select2("destroy"); } @@ -869,11 +893,21 @@ public HandlerRegistration addSelectionHandler(SelectItemEvent.SelectComboHandle return addHandler(selectionHandler, SelectItemEvent.getType()); } + @Override + public HandlerRegistration addOpeningHandler(OpeningEvent.OpeningHandler handler) { + return addHandler(handler, OpeningEvent.getType()); + } + @Override public HandlerRegistration addOpenHandler(OpenHandler openHandler) { return addHandler(openHandler, OpenEvent.getType()); } + @Override + public HandlerRegistration addClosingHandler(ClosingEvent.ClosingHandler handler) { + return addHandler(handler, ClosingEvent.getType()); + } + @Override public HandlerRegistration addCloseHandler(CloseHandler closeHandler) { return addHandler(closeHandler, CloseEvent.getType()); diff --git a/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java b/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java index 2ae326743..4620e66d6 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java @@ -30,5 +30,7 @@ public interface ComboBoxEvents { String SELECT = "select2:select"; String UNSELECT = "select2:unselect"; String OPEN = "select2:open"; + String OPENING = "select2:opening"; String CLOSE = "select2:close"; + String CLOSING = "select2:closing"; } diff --git a/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java b/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java new file mode 100644 index 000000000..3cbf27586 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java @@ -0,0 +1,15 @@ +package gwt.material.design.addins.client.combobox.events; + +import com.google.gwt.event.logical.shared.HasCloseHandlers; +import com.google.gwt.event.logical.shared.HasOpenHandlers; +import com.google.gwt.event.shared.HandlerRegistration; +import gwt.material.design.addins.client.combobox.base.HasUnselectItemHandler; +import gwt.material.design.client.events.ClosingEvent; +import gwt.material.design.client.events.OpeningEvent; + +public interface HasComboBoxHandlers extends HasOpenHandlers, HasCloseHandlers, HasUnselectItemHandler { + + HandlerRegistration addOpeningHandler(OpeningEvent.OpeningHandler handler); + + HandlerRegistration addClosingHandler(ClosingEvent.ClosingHandler handler); +} From 033156720a948960475b7131c6af18a9d04683c9 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 26 Apr 2019 09:36:40 +0800 Subject: [PATCH 090/247] Added leap year validation. --- .../client/dob/DateOfBirthPicker.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 9011a26d1..b36d54f9c 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -7,9 +7,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,6 +21,7 @@ import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style; +import com.google.gwt.i18n.client.DateTimeFormat; import gwt.material.design.addins.client.combobox.MaterialComboBox; import gwt.material.design.addins.client.inputmask.MaterialIntegerInputMask; import gwt.material.design.client.MaterialDesignBase; @@ -165,9 +166,35 @@ protected boolean validateDate() { } else { day.clearErrorText(); } + + if (!validateLeapYear(month.getSingleValue(), day.getValue(), year.getValue())) { + valid = false; + day.setErrorText("Invalid Date"); + } else { + day.clearErrorText(); + } return valid; } + public boolean validateLeapYear(int month, int day, int year) { + String dateToValidate = month + 1 + "/" + day + "/" + year; + if (dateToValidate == null) { + return false; + } + DateTimeFormat sdf = DateTimeFormat.getFormat("MM/dd/yyyy"); + try { + Date date = sdf.parse(dateToValidate); + if (date.getMonth() != month) { + return false; + } + } catch (Exception e) { + + e.printStackTrace(); + return false; + } + return true; + } + @Override public Date getValue() { //TODO: Date value builder - compare to expected month value From 21f1d19a63b260ec7527495660be7251914a6ece Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 26 Apr 2019 10:08:13 +0800 Subject: [PATCH 091/247] Added more complex validation on date of birth picker. --- .../client/dob/DateOfBirthPicker.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index b36d54f9c..abb6547ad 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -99,7 +99,7 @@ protected void setupHandlers() { month.setMatcher(DateMonthMatcher.getDefaultMonthMatcher()); month.addValueChangeHandler(event -> { - if (validateDate()) { + if (validateDate(true)) { value.setMonth(month.getSingleValue()); } }); @@ -110,7 +110,7 @@ protected void setupHandlers() { // Day day.addValueChangeHandler(event -> { - if (validateDate()) { + if (validateDate(true)) { value.setDate(day.getValue()); } }); @@ -121,7 +121,7 @@ protected void setupHandlers() { // Year year.addValueChangeHandler(event -> { - if (validateDate()) { + if (validateDate(true)) { value.setYear(year.getValue() - 1900); } }); @@ -144,38 +144,43 @@ public void reload() { setupHandlers(); } - protected boolean validateDate() { + protected boolean validateDate(boolean showErrors) { boolean valid = true; if (!(month.getSingleValue() != null && month.getSingleValue() >= 0 && month.getSingleValue() < 12)) { valid = false; - month.setErrorText(dataProvider.getInvalidMonthMessage()); + if (showErrors) month.setErrorText(dataProvider.getInvalidMonthMessage()); } else { - month.clearErrorText(); + if (showErrors) month.clearErrorText(); } if (!(year.getValue() != null && year.getValue() >= 1900)) { valid = false; - year.setErrorText(dataProvider.getInvalidYearLabel()); + if (showErrors) year.setErrorText(dataProvider.getInvalidYearLabel()); } else { - year.clearErrorText(); + if (showErrors) year.clearErrorText(); } if (!(day.getValue() != null && day.getValue() > 0 && day.getValue() <= 31)) { valid = false; - day.setErrorText(dataProvider.getInvalidDayMessage()); + if (showErrors) day.setErrorText(dataProvider.getInvalidDayMessage()); } else { - day.clearErrorText(); + if (showErrors) day.clearErrorText(); } if (!validateLeapYear(month.getSingleValue(), day.getValue(), year.getValue())) { valid = false; - day.setErrorText("Invalid Date"); + if (showErrors) day.setErrorText("Invalid Date"); } else { - day.clearErrorText(); + if (showErrors) day.clearErrorText(); } return valid; } + @Override + public boolean validate() { + return super.validate() && validateDate(false); + } + public boolean validateLeapYear(int month, int day, int year) { String dateToValidate = month + 1 + "/" + day + "/" + year; if (dateToValidate == null) { @@ -197,8 +202,6 @@ public boolean validateLeapYear(int month, int day, int year) { @Override public Date getValue() { - //TODO: Date value builder - compare to expected month value - //TODO: Input mask 1900 - current date - 100 return value; } From 2aa149d6acf96bcb0a1665cc2a7ecce1d13b1beb Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 7 May 2019 06:12:16 +0800 Subject: [PATCH 092/247] Fixed Small IconMorphs in NavBar get clipped --- .../design/addins/client/iconmorph/resources/css/morph.css | 3 ++- .../design/addins/client/iconmorph/resources/css/morph.min.css | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.css b/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.css index 15d28567a..00499db5c 100644 --- a/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.css +++ b/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.css @@ -7,7 +7,7 @@ position: relative; cursor: pointer; } -.anim-container .icons { +.anim-container .icons.material-icons { transition: .3s; -moz-transition: .3s; -webkit-transition: .3s; @@ -17,6 +17,7 @@ width: 1em; position: absolute; left: 0; + line-height: normal; } .anim-container .source { transform: rotate(-135deg); diff --git a/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.min.css b/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.min.css index 98450b30e..0ac2926fe 100644 --- a/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.min.css +++ b/src/main/resources/gwt/material/design/addins/client/iconmorph/resources/css/morph.min.css @@ -1 +1 @@ -.anim-container{height:4rem;width:4rem;transition:.3s;-webkit-transition:.3s;-moz-transition:.3s;position:relative;cursor:pointer}.anim-container .icons{transition:.3s;-moz-transition:.3s;-webkit-transition:.3s;font-size:4em!important;height:1em;width:1em;position:absolute;left:0}.anim-container .source{transform:rotate(-135deg);-moz-transform:rotate(-135deg);-webkit-transform:rotate(-135deg);opacity:0}.anim-container.morphed{transform:rotate(135deg);-moz-transform:rotate(135deg);-webkit-transform:rotate(135deg)}.anim-container.morphed .source{opacity:1;visibility:visible}.anim-container.morphed .target{opacity:0;visibility:hidden}.anim-container.tiny{height:1rem;width:1rem;font-size:.5rem}.anim-container.small{height:2rem;width:2rem;font-size:.5rem}.anim-container.medium{height:4rem;width:4rem;font-size:.5rem}.anim-container.large{height:6rem;width:6rem;font-size:.5rem}.anim-container.tiny .icons{font-size:2em!important}.anim-container.medium .icons{font-size:8em!important}.anim-container.large .icons{font-size:12em!important} \ No newline at end of file +.anim-container{height:4rem;width:4rem;transition:.3s;-webkit-transition:.3s;-moz-transition:.3s;position:relative;cursor:pointer}.anim-container .icons.material-icons{transition:.3s;-moz-transition:.3s;-webkit-transition:.3s;position:absolute;font-size:4em!important;height:1em;width:1em;position:absolute;left:0;line-height:normal}.anim-container .source{transform:rotate(-135deg);-moz-transform:rotate(-135deg);-webkit-transform:rotate(-135deg);opacity:0}.anim-container.morphed{transform:rotate(135deg);-moz-transform:rotate(135deg);-webkit-transform:rotate(135deg)}.anim-container.morphed .source{opacity:1;visibility:visible}.anim-container.morphed .target{opacity:0;visibility:hidden}.anim-container.tiny{height:1rem;width:1rem;font-size:.5rem}.anim-container.small{height:2rem;width:2rem;font-size:.5rem}.anim-container.medium{height:4rem;width:4rem;font-size:.5rem}.anim-container.large{height:6rem;width:6rem;font-size:.5rem}.anim-container.tiny .icons{font-size:2em!important}.anim-container.medium .icons{font-size:8em!important}.anim-container.large .icons{font-size:12em!important} \ No newline at end of file From 0f25335f8d2b47396ab89be07bc9f7ca78e7e1d6 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 7 May 2019 11:57:28 +0800 Subject: [PATCH 093/247] Fixed carousel cheking logic. Carousel could be set up even its not attached for future child population. --- .../design/addins/client/carousel/MaterialCarousel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java index 132b36d44..ba43dc6b8 100644 --- a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java +++ b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java @@ -271,7 +271,7 @@ public void play() { } protected Object command(String action, Object... params) { - if (container == null || !container.isAttached()) { + if (container == null) { GWT.log("Your carousel container is not yet initialized", new IllegalStateException()); } else { return $("#" + container.getId()).slick(action, params); From ee5583171588f35848d18ecdf5f58ab241233e8e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 8 May 2019 12:28:42 +0800 Subject: [PATCH 094/247] Fixed MaterialStepper Vertical no longer works --- .../addins/client/stepper/MaterialStepper.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index a80371def..2cd809bd9 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -7,9 +7,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. @@ -46,6 +46,7 @@ import gwt.material.design.client.base.mixin.CssNameMixin; import gwt.material.design.client.base.mixin.StatusDisplayMixin; import gwt.material.design.client.base.mixin.ToggleStyleMixin; +import gwt.material.design.client.base.viewport.Resolution; import gwt.material.design.client.constants.Axis; import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; @@ -159,6 +160,10 @@ public void setDetectOrientation(boolean detectOrientation) { } protected void detectAndApplyOrientation() { + if (getAxis() != null && getAxis() == Axis.VERTICAL && !Window.matchMedia(Resolution.ALL_MOBILE.asMediaQuery())) { + return; + } + if (Window.matchMedia("(orientation: portrait)")) { setAxis(Axis.VERTICAL); } else { @@ -181,7 +186,7 @@ public void add(MaterialStep step) { public void insert(MaterialStep step, int index) { super.insert(step, index); - + registerStep(step); } @@ -335,7 +340,7 @@ public int getCurrentStepIndex() { } public MaterialStep getStep(int step) { - return getStepByIndex(step - 1); + return getStepByIndex(step - 1); } public MaterialStep getStepByIndex(int stepIndex) { From 6f585ff04076061c5616e9c7434e52a9fae6eec6 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 8 May 2019 17:03:18 +0800 Subject: [PATCH 095/247] Fixed MaterialTree: NullPointerException when deselectSelectedItem execute #378 --- .../gwt/material/design/addins/client/tree/MaterialTree.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java index aee67d934..2dbf4a043 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java @@ -98,7 +98,9 @@ protected void onLoad() { } } MaterialTreeItem treeItem = event.getSelectedItem(); - treeItem.addStyleName(AddinsCssName.SELECTED); + if (treeItem != null) { + treeItem.addStyleName(AddinsCssName.SELECTED); + } setSelectedItem(treeItem); })); } From 7663ceccdf5bb73a8e913079689023b56194d5ce Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 8 May 2019 20:48:06 +0800 Subject: [PATCH 096/247] Iteration for 2.2-rc1 release --- README.md | 4 ++-- pom.xml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1a0ecf6c7..d7434b8ed 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.2 +## Current Version 2.2-rc1 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.2 + 2.2-rc1 ``` diff --git a/pom.xml b/pom.xml index 1f7b05757..d0100c263 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.2-SNAPSHOT + 2.2-rc1 gwt-material-addins gwt-lib Gwt Material Addins - 2.2-SNAPSHOT + 2.2-rc1 Extra Components of GWT Material Framework - 2.2-SNAPSHOT + 2.2-rc1 scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.2-SNAPSHOT + v2.2-rc1 From ee7c77ac8233a4ed9dcde0917e5ea7cbad60d9a6 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 8 May 2019 20:49:58 +0800 Subject: [PATCH 097/247] Fixed license headers --- .../client/carousel/MaterialCarousel.java | 6 ++++-- .../client/combobox/MaterialComboBox.java | 4 ++-- .../combobox/events/HasComboBoxHandlers.java | 19 +++++++++++++++++++ .../client/stepper/MaterialStepper.java | 6 +++--- .../client/dob/DateOfBirthPicker.java | 4 ++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java index ba43dc6b8..8bc379e4c 100644 --- a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java +++ b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java @@ -20,7 +20,6 @@ package gwt.material.design.addins.client.carousel; import com.google.gwt.core.client.GWT; -import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Document; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; @@ -42,7 +41,10 @@ import gwt.material.design.client.base.mixin.CssTypeMixin; import gwt.material.design.client.base.mixin.ToggleStyleMixin; import gwt.material.design.client.constants.CssName; -import gwt.material.design.client.ui.*; +import gwt.material.design.client.ui.MaterialButton; +import gwt.material.design.client.ui.MaterialImage; +import gwt.material.design.client.ui.MaterialPanel; +import gwt.material.design.client.ui.MaterialTab; import java.util.List; diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 40afbd4a2..da4793741 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java b/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java index 3cbf27586..40324f91b 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.combobox.events; import com.google.gwt.event.logical.shared.HasCloseHandlers; diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 2cd809bd9..fddf4273f 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -7,9 +7,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. @@ -614,4 +614,4 @@ protected ToggleStyleMixin getToggleFixedStepWidth() { } return toggleFixedStepWidth; } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index abb6547ad..7fb8c135a 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -7,9 +7,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 b521feac04a3b787c7a33425bef528add7215d5c Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 May 2019 15:36:45 +0800 Subject: [PATCH 098/247] Fixed deprecated URL.createObjectURL(mediaStream) for MaterialCameraCapture --- .../client/camera/MaterialCameraCapture.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java b/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java index cc2bf22b8..2cd3aeffa 100644 --- a/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java +++ b/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java @@ -242,14 +242,23 @@ protected void nativePlay(Element video) { Navigator.mediaDevices.getUserMedia(constraints).then(streamObj -> { mediaStream = (MediaStream) streamObj; - if (URL.createObjectURL(mediaStream) != null) { - $(video).attr("src", URL.createObjectURL(mediaStream)); - } else if (WebkitURL.createObjectURL(mediaStream) != null) { - $(video).attr("src", WebkitURL.createObjectURL(mediaStream)); - } - if (video instanceof VideoElement) { - ((VideoElement) video).play(); + + if (mediaStream != null) { + try { + video.setPropertyObject("srcObject", mediaStream); + } catch (Exception e) { + if (URL.createObjectURL(mediaStream) != null) { + $(video).attr("src", URL.createObjectURL(mediaStream)); + } else if (WebkitURL.createObjectURL(mediaStream) != null) { + $(video).attr("src", WebkitURL.createObjectURL(mediaStream)); + } + } finally { + if (video instanceof VideoElement) { + ((VideoElement) video).play(); + } + } } + onCameraCaptureLoad(); return null; }).catchException(error -> { From bc0f287dfacb3692ad5b8f639be5c7a843be3841 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 May 2019 21:59:37 +0800 Subject: [PATCH 099/247] Preparation for 2.2-rc1 release --- .../design/addins/client/ui/MaterialInputMaskTest.java | 5 +++-- .../design/addins/client/ui/MaterialTimePickerTest.java | 5 +---- .../material/design/addins/client/ui/MaterialTreeTest.java | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java index c7823defa..e41eafffe 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialInputMaskTest.java @@ -31,6 +31,7 @@ public class MaterialInputMaskTest extends MaterialValueBoxTest { - firedOpenHandler[0] = true; JQueryElement cancelButton = $(".lolliclock-buttons .lolliclock-button:nth-child(1)"); assertNotNull(cancelButton); assertEquals(CANCEL_TEXT, cancelButton.text()); @@ -220,7 +218,6 @@ protected void checkOkCancelTextConfigs(MaterialTimePicker timePicker) { assertEquals(OK_TEXT, okButton.text()); }); - JsTimePicker.$(timePicker.getTimeInput().getElement()).lolliclock("show"); - assertTrue(firedOpenHandler[0]); + JsTimePicker.$(timePicker.getElement()).lolliclock("show"); } } diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialTreeTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialTreeTest.java index d46ff30f9..b55ffdd44 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialTreeTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialTreeTest.java @@ -215,6 +215,7 @@ public void testImageItems() { assertEquals(0, tree.getWidgetCount()); MaterialTreeItem item = new MaterialTreeItem(); + item.setText("Tree Item"); tree.add(item); assertEquals(1, tree.getWidgetCount()); From 1be09cccb904bf5fee4341601ee29c92a7ace7a4 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 May 2019 22:39:39 +0800 Subject: [PATCH 100/247] Iteration for next snapshot --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index d0100c263..1f7b05757 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.2-rc1 + 2.2-SNAPSHOT gwt-material-addins gwt-lib Gwt Material Addins - 2.2-rc1 + 2.2-SNAPSHOT Extra Components of GWT Material Framework - 2.2-rc1 + 2.2-SNAPSHOT scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.2-rc1 + v2.2-SNAPSHOT From 7a76338e74d43a62172714803a8695ec8e000cdd Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 13 May 2019 06:57:00 +0800 Subject: [PATCH 101/247] Fixed combobox Opening Multiple type. --- .../design/addins/client/combobox/MaterialComboBox.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index da4793741..8493d2af0 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -202,7 +202,9 @@ public void load() { // Tab Focus support body().on("focus", "#" + getId() + " .select2", (e, param1) -> { - open(); + if (!isMultiple()) { + open(); + } return true; }); From 9661556b9fa23258cb64730103c212db83e7166c Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 13 May 2019 14:07:01 +0800 Subject: [PATCH 102/247] Standard fixed for TimePicker disappears on Chrome version 73 --- .../client/timepicker/MaterialTimePicker.java | 1 + .../timepicker/resources/js/timepicker.js | 250 +++++++++--------- .../timepicker/resources/js/timepicker.min.js | 2 +- 3 files changed, 130 insertions(+), 123 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java index 5454677cf..b4266256e 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java @@ -304,6 +304,7 @@ public String getUniqueId() { public void setUniqueId(String uniqueId) { options.uniqueId = uniqueId; + timeInput.setId(uniqueId); } public String getCancelText() { diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js index a762d6e15..38796497d 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.js @@ -314,6 +314,15 @@ this.g = g; this.canvas = canvas; + + // Chrome 73 suggested solution for Timepicker being fubared when opening. + // Refer to https://github.com/GwtMaterialDesign/gwt-material/commit/0670c85ce2a1ee2c28be906fb12f4c0435321ce6 + document.querySelector("#" + $(input).attr("id")).addEventListener('pointerdown', function(event) { + if (event.target && event.target.setPointerCapture) { + event.target.setPointerCapture(event.pointerId) + } + }); + raiseCallback(this.options.init); } @@ -366,145 +375,142 @@ // Show popover LolliClock.prototype.show = function () { - var _this = this; - setTimeout(function () { - //_this.input.trigger('blur'); - if (_this.isShown) { - return; - } - - raiseCallback(_this.options.beforeShow); - var self = _this; + //this.input.trigger('blur'); + if (this.isShown) { + return; + } - _this.popover.addClass(_this.options.orientation); + raiseCallback(this.options.beforeShow); + var self = this; - // Initialize - if (!_this.isAppended) { - // Append popover to body - $(document.body).append(_this.popover); - _this.isAppended = true; + this.popover.addClass(this.options.orientation); - // Reset position when resize - $(window).on('resize.lolliclock' + _this.id, function () { - if (self.isShown) { - self.locate(); - } - }); + // Initialize + if (!this.isAppended) { + // Append popover to body + $(document.body).append(this.popover); + this.isAppended = true; - // Reset position on scroll - $(window).on('scroll.lolliclock', function () { - if (self.isShown) { - self.locate(); - } - }); + // Reset position when resize + $(window).on('resize.lolliclock' + this.id, function () { + if (self.isShown) { + self.locate(); + } + }); - //Add listeners - _this.AmPmButtons.on('click', function (e) { - self.changeAmPm(e.currentTarget.children[1].innerHTML); - }); - _this.spanMinutes.on('click', function () { - self.toggleView('minutes'); - }); - _this.spanHours.on('click', function () { - self.toggleView('hours'); - }); - _this.spanAmPm.on('click', function () { - self.changeAmPm(); - }); - } + // Reset position on scroll + $(window).on('scroll.lolliclock', function () { + if (self.isShown) { + self.locate(); + } + }); - // Set position - self.locate(); - - //animate show - _this.plate.addClass('animate'); - _this.header.addClass('animate'); - _this.popover.addClass('animate'); - _this.AmPmButtons.addClass('animate'); - _this.spanNewTime.addClass('animate'); - _this.spanOldTime.addClass('animate'); - !_this.options.autoclose && _this.closeButtons.addClass('animate'); - - _this.plate.on('webkitAnimationEnd animationend MSAnimationEnd oanimationend', function () { - self.plate.removeClass("animate"); - self.header.removeClass("animate"); - self.popover.removeClass("animate"); - self.AmPmButtons.removeClass("animate"); - self.spanNewTime.removeClass("animate"); - self.spanOldTime.removeClass("animate"); - !self.options.autoclose && self.closeButtons.removeClass("animate"); - self.plate.off('webkitAnimationEnd animationend MSAnimationEnd oanimationend'); + //Add listeners + this.AmPmButtons.on('click', function (e) { + self.changeAmPm(e.currentTarget.children[1].innerHTML); + }); + this.spanMinutes.on('click', function () { + self.toggleView('minutes'); }); + this.spanHours.on('click', function () { + self.toggleView('hours'); + }); + this.spanAmPm.on('click', function () { + self.changeAmPm(); + }); + } - //Get the time - function timeToDate(time) { - var parts = time.split(':'); - if (parts.length === 2){ - var hours = +parts[0]; - var minAM = parts[1].split(' '); - if (minAM.length === 2) { - var mins = minAM[0]; - if (minAM[1] === 'PM') hours += 12; - return new Date(1970, 1, 1, hours, mins); - } + // Set position + self.locate(); + + //animate show + this.plate.addClass('animate'); + this.header.addClass('animate'); + this.popover.addClass('animate'); + this.AmPmButtons.addClass('animate'); + this.spanNewTime.addClass('animate'); + this.spanOldTime.addClass('animate'); + !this.options.autoclose && this.closeButtons.addClass('animate'); + + this.plate.on('webkitAnimationEnd animationend MSAnimationEnd oanimationend', function () { + self.plate.removeClass("animate"); + self.header.removeClass("animate"); + self.popover.removeClass("animate"); + self.AmPmButtons.removeClass("animate"); + self.spanNewTime.removeClass("animate"); + self.spanOldTime.removeClass("animate"); + !self.options.autoclose && self.closeButtons.removeClass("animate"); + self.plate.off('webkitAnimationEnd animationend MSAnimationEnd oanimationend'); + }); + + //Get the time + function timeToDate(time) { + var parts = time.split(':'); + if (parts.length === 2){ + var hours = +parts[0]; + var minAM = parts[1].split(' '); + if (minAM.length === 2) { + var mins = minAM[0]; + if (minAM[1] === 'PM') hours += 12; + return new Date(1970, 1, 1, hours, mins); } - return new Date('x'); } + return new Date('x'); + } - function isValidTime(time) { - return !isNaN(timeToDate(time).getTime()); - } + function isValidTime(time) { + return !isNaN(timeToDate(time).getTime()); + } - var value; - var inputValue = _this.input.prop('value'); - var defaultValue = _this.options.startTime; - var placeholderValue = _this.input.prop('placeholder'); - - if (inputValue && isValidTime(inputValue)) { - value = timeToDate(inputValue); - } else if (defaultValue === 'now') { - value = new Date(); - } else if (defaultValue && isValidTime(defaultValue)) { - value = timeToDate(defaultValue); - } else if (placeholderValue && isValidTime(placeholderValue)) { - value = timeToDate(placeholderValue); - } else { - value = new Date(); - } - if(_this.options.hour24) { - _this.hours = value.getHours() - } else { - _this.hours = value.getHours()%12; - _this.amOrPm = value.getHours() > 11 ? "AM" : "PM"; - } - _this.minutes = value.getMinutes(); - //purposefully wrong because we change it next line + var value; + var inputValue = this.input.prop('value'); + var defaultValue = this.options.startTime; + var placeholderValue = this.input.prop('placeholder'); + + if (inputValue && isValidTime(inputValue)) { + value = timeToDate(inputValue); + } else if (defaultValue === 'now') { + value = new Date(); + } else if (defaultValue && isValidTime(defaultValue)) { + value = timeToDate(defaultValue); + } else if (placeholderValue && isValidTime(placeholderValue)) { + value = timeToDate(placeholderValue); + } else { + value = new Date(); + } + if(this.options.hour24) { + this.hours = value.getHours() + } else { + this.hours = value.getHours()%12; + this.amOrPm = value.getHours() > 11 ? "AM" : "PM"; + } + this.minutes = value.getMinutes(); + //purposefully wrong because we change it next line - _this.changeAmPm(); + this.changeAmPm(); - // Set time - self.toggleView('minutes'); - self.toggleView('hours'); + // Set time + self.toggleView('minutes'); + self.toggleView('hours'); - self.isShown = true; + self.isShown = true; - // Hide when clicking or tabbing on any element except the clock, input - $(document).on('click.lolliclock.' + _this.id + ' focusin.lolliclock.' + _this.id, function (e) { - var target = $(e.target); - if (target.closest(self.popover).length === 0 && - target.closest(self.input).length === 0) { - self.done(); - } - }); + // Hide when clicking or tabbing on any element except the clock, input + $(document).on('click.lolliclock.' + this.id + ' focusin.lolliclock.' + this.id, function (e) { + var target = $(e.target); + if (target.closest(self.popover).length === 0 && + target.closest(self.input).length === 0) { + self.done(); + } + }); - // Hide when ESC is pressed - $(document).on('keyup.lolliclock.' + _this.id, function (e) { - if (e.keyCode === 27) { - self.hide(); - } - }); - raiseCallback(_this.options.afterShow); - }, 100); + // Hide when ESC is pressed + $(document).on('keyup.lolliclock.' + this.id, function (e) { + if (e.keyCode === 27) { + self.hide(); + } + }); + raiseCallback(this.options.afterShow); }; // Hide popover diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js index 917ea64da..336a1e759 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/js/timepicker.min.js @@ -1 +1 @@ -!function(){var t=window.jQuery;k.DEFAULTS={startTime:"",autoclose:!1,vibrate:!0,hour24:!1,orientation:"portrait",cancelText:"CANCEL",okText:"OK"};var i="ontouchstart"in window,o="mousedown"+(i?" touchstart":""),l="mousemove.lolliclock"+(i?" touchmove.lolliclock":""),e="mouseup.lolliclock"+(i?" touchend.lolliclock":""),s=navigator.vibravarte?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,n="http://www.w3.org/2000/svg";function a(t){return document.createElementNS(n,t)}function c(t){return(t<10?"0":"")+t}var d=0;var r=84,h=50,u=70,p=12,m=2*r,v=350,f=['
','
','
','
','
','
','
',"
",':','
','
','
',"
","
",'',"
",'
','
','
','
','
',"
",'
','
','
','
AM
',"
",'
','
','
','
PM
',"
","
","
","
","
"].join("");function k(i,s){var n,k,w=t(f),b=w.find(".lolliclock-popover"),A=w.find(".lolliclock-plate"),M=w.find(".lolliclock-dial-hours"),C=w.find(".lolliclock-dial-minutes"),y="INPUT"===i.prop("tagName"),P=y?i:i.find("input"),T=this;if(this.id=(k=++d+"",(n="lolli")?n+k:k),this.element=i,this.options=s,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=y,this.input=P,this.popover=w,this.plate=A,this.hoursView=M,this.minutesView=C,this.header=w.find(".lolliclock-header"),this.spanHours=w.find(".lolliclock-hours"),this.spanMinutes=w.find(".lolliclock-minutes"),this.spanNewTime=w.find(".lolliclock-time-new"),this.spanOldTime=w.find(".lolliclock-time-old"),this.spanAmPm=w.find(".lolliclock-am-pm"),this.amOrPm="PM",this.AmPmButtons=w.find(".lolliclock-ampm-btn"),this.amButton=w.find("#lolliclock-btn-am"),this.pmButton=w.find("#lolliclock-btn-pm"),this.options.hour24&&(this.AmPmButtons.hide(),this.spanAmPm.hide()),w.addClass(this.options.orientation),!s.autoclose){this.popover.css("height","380px");var x=t('
').appendTo(b);t('
'+s.cancelText+"
").click(t.proxy(this.hide,this)).appendTo(x),t('
'+s.okText+"
").click(t.proxy(this.done,this)).appendTo(x),this.closeButtons=w.find(".lolliclock-button")}P.on("focus.lolliclock click.lolliclock",t.proxy(this.show,this));var V,E,B,N=t('
');if(s.hour24){for(V=1;V<13;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:r+Math.sin(B)*h-p,top:r-Math.cos(B)*h-p}),E.html(V),M.append(E);for(V=13;V<=24;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:r+Math.sin(B)*u-p,top:r-Math.cos(B)*u-p}),24===V?E.html("00"):E.html(V),M.append(E)}else for(V=1;V<13;V++)E=N.clone(),B=V/6*Math.PI,E.css({left:r+Math.sin(B)*u-p,top:r-Math.cos(B)*u-p}),E.html(V),M.append(E);for(V=0;V<60;V+=5)E=N.clone(),B=V/30*Math.PI,E.css({left:r+Math.sin(B)*u-p,top:r-Math.cos(B)*u-p}),E.html(c(V)),C.append(E);A.on(o,function(i){var o=A.offset(),n=/^touch/.test(i.type),a=o.left+r,c=o.top+r,d=(n?i.originalEvent.touches[0]:i).pageX-a,m=(n?i.originalEvent.touches[0]:i).pageY-c,f=Math.sqrt(d*d+m*m),k=!1;if(outsideMode=!0,fu-p)outsideMode=!0;else{if(!(f>h-p&&fs?s:a,c.left=l<8?8:l>e?e:l,o.css(c),o.show()},k.prototype.show=function(){var i=this;setTimeout(function(){if(!i.isShown){g(i.options.beforeShow);var o,l=i;i.popover.addClass(i.options.orientation),i.isAppended||(t(document.body).append(i.popover),i.isAppended=!0,t(window).on("resize.lolliclock"+i.id,function(){l.isShown&&l.locate()}),t(window).on("scroll.lolliclock",function(){l.isShown&&l.locate()}),i.AmPmButtons.on("click",function(t){l.changeAmPm(t.currentTarget.children[1].innerHTML)}),i.spanMinutes.on("click",function(){l.toggleView("minutes")}),i.spanHours.on("click",function(){l.toggleView("hours")}),i.spanAmPm.on("click",function(){l.changeAmPm()})),l.locate(),i.plate.addClass("animate"),i.header.addClass("animate"),i.popover.addClass("animate"),i.AmPmButtons.addClass("animate"),i.spanNewTime.addClass("animate"),i.spanOldTime.addClass("animate"),!i.options.autoclose&&i.closeButtons.addClass("animate"),i.plate.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){l.plate.removeClass("animate"),l.header.removeClass("animate"),l.popover.removeClass("animate"),l.AmPmButtons.removeClass("animate"),l.spanNewTime.removeClass("animate"),l.spanOldTime.removeClass("animate"),!l.options.autoclose&&l.closeButtons.removeClass("animate"),l.plate.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend")});var e=i.input.prop("value"),s=i.options.startTime,n=i.input.prop("placeholder");o=e&&c(e)?a(e):"now"===s?new Date:s&&c(s)?a(s):n&&c(n)?a(n):new Date,i.options.hour24?i.hours=o.getHours():(i.hours=o.getHours()%12,i.amOrPm=o.getHours()>11?"AM":"PM"),i.minutes=o.getMinutes(),i.changeAmPm(),l.toggleView("minutes"),l.toggleView("hours"),l.isShown=!0,t(document).on("click.lolliclock."+i.id+" focusin.lolliclock."+i.id,function(i){var o=t(i.target);0===o.closest(l.popover).length&&0===o.closest(l.input).length&&l.done()}),t(document).on("keyup.lolliclock."+i.id,function(t){27===t.keyCode&&l.hide()}),g(i.options.afterShow)}function a(t){var i=t.split(":");if(2===i.length){var o=+i[0],l=i[1].split(" ");if(2===l.length){var e=l[0];return"PM"===l[1]&&(o+=12),new Date(1970,1,1,o,e)}}return new Date("x")}function c(t){return!isNaN(a(t).getTime())}},100)},k.prototype.hide=function(){g(this.options.beforeHide);var i=this;i.popover.addClass("animate-out"),i.plate.addClass("animate-out"),i.header.addClass("animate-out"),i.AmPmButtons.addClass("animate-out"),!i.options.autoclose&&i.closeButtons.addClass("animate-out"),this.popover.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){t(i.spanHours[0].childNodes[0]).html(""),t(i.spanMinutes[0].childNodes[0]).html(""),i.popover.removeClass("animate-out"),i.plate.removeClass("animate-out"),i.header.removeClass("animate-out"),i.AmPmButtons.removeClass("animate-out"),!i.options.autoclose&&i.closeButtons.removeClass("animate-out"),i.popover.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend"),t(document).off("click.lolliclock."+i.id+" focusin.lolliclock."+i.id),t(document).off("keyup.lolliclock."+i.id),i.popover.hide(),g(i.options.afterHide)}),i.isShown=!1},k.prototype.toggleView=function(i,o){var e="hours"===i,s=e?this.hoursView:this.minutesView,n=e?this.minutesView:this.hoursView;if(this.currentView=i,this.spanHours.toggleClass("lolliclock-primary-text",e),this.spanMinutes.toggleClass("lolliclock-primary-text",!e),n.addClass("lolliclock-dial-out"),s.css("visibility","visible").removeClass("lolliclock-dial-out"),this.resetClock(o),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){n.css("visibility","hidden")},v),e)this.plate.off(l);else{var a=this;this.plate.on(l,function(i){var o=a.plate.offset(),l=o.left+r,e=o.top+r,s=i.pageX-l,n=i.pageY-e,c=Math.sqrt(s*s+n*n);c>u-p&&c+n.html()||!n.html())&&(a.html(e),n.addClass("old-up"),a.addClass("new-up")),this.g.insertBefore(this.hand,this.bearing),this.g.insertBefore(this.bg,this.fg),this.bg.setAttribute("class","lolliclock-canvas-bg");var f=h;l&&(f=u);var k=Math.sin(d)*f,g=-Math.cos(d)*f;this.hand.setAttribute("x2",Math.sin(d)*(f-p)),this.hand.setAttribute("y2",-Math.cos(d)*(f-p)),this.bg.setAttribute("cx",k),this.bg.setAttribute("cy",g),this.fg.setAttribute("cx",k),this.fg.setAttribute("cy",g)},k.prototype.done=function(){g(this.options.beforeDone);var t=this.input.prop("value"),i="";(i=this.options.hour24?c(this.hours)+":"+c(this.minutes):this.hours+":"+c(this.minutes)+" "+this.amOrPm)!==t&&(this.input.prop("value",i),this.input.trigger("input"),this.input.trigger("change")),this.hide()},k.prototype.remove=function(){this.element.removeData("lolliclock"),this.input.off("focus.lolliclock click.lolliclock"),this.isShown&&this.hide(),this.isAppended&&(t(window).off("resize.lolliclock"+this.id),t(window).off("scroll.lolliclock"+this.id),this.popover.remove())},t.fn.lolliclock=function(i){var o=Array.prototype.slice.call(arguments,1);return this.each(function(){var l=t(this),e=l.data("lolliclock");if(e)"function"==typeof e[i]&&e[i].apply(e,o);else{var s=t.extend({},k.DEFAULTS,l.data(),"object"==typeof i&&i);l.data("lolliclock",new k(l,s))}})}}(); \ No newline at end of file +!function(){var t=window.jQuery;k.DEFAULTS={startTime:"",autoclose:!1,vibrate:!0,hour24:!1,orientation:"portrait",cancelText:"CANCEL",okText:"OK"};var i="ontouchstart"in window,o="mousedown"+(i?" touchstart":""),e="mousemove.lolliclock"+(i?" touchmove.lolliclock":""),s="mouseup.lolliclock"+(i?" touchend.lolliclock":""),l=navigator.vibravarte?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,n="http://www.w3.org/2000/svg";function a(t){return document.createElementNS(n,t)}function c(t){return(t<10?"0":"")+t}var h=0;var d=84,r=50,u=70,p=12,m=2*d,v=350,f=['
','
','
','
','
','
','
',"
",':','
','
','
',"
","
",'',"
",'
','
','
','
','
',"
",'
','
','
','
AM
',"
",'
','
','
','
PM
',"
","
","
","
","
"].join("");function k(i,l){var n,k,w=t(f),b=w.find(".lolliclock-popover"),A=w.find(".lolliclock-plate"),C=w.find(".lolliclock-dial-hours"),M=w.find(".lolliclock-dial-minutes"),y="INPUT"===i.prop("tagName"),P=y?i:i.find("input"),T=this;if(this.id=(k=++h+"",(n="lolli")?n+k:k),this.element=i,this.options=l,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=y,this.input=P,this.popover=w,this.plate=A,this.hoursView=C,this.minutesView=M,this.header=w.find(".lolliclock-header"),this.spanHours=w.find(".lolliclock-hours"),this.spanMinutes=w.find(".lolliclock-minutes"),this.spanNewTime=w.find(".lolliclock-time-new"),this.spanOldTime=w.find(".lolliclock-time-old"),this.spanAmPm=w.find(".lolliclock-am-pm"),this.amOrPm="PM",this.AmPmButtons=w.find(".lolliclock-ampm-btn"),this.amButton=w.find("#lolliclock-btn-am"),this.pmButton=w.find("#lolliclock-btn-pm"),this.options.hour24&&(this.AmPmButtons.hide(),this.spanAmPm.hide()),w.addClass(this.options.orientation),!l.autoclose){this.popover.css("height","380px");var x=t('
').appendTo(b);t('
'+l.cancelText+"
").click(t.proxy(this.hide,this)).appendTo(x),t('
'+l.okText+"
").click(t.proxy(this.done,this)).appendTo(x),this.closeButtons=w.find(".lolliclock-button")}P.on("focus.lolliclock click.lolliclock",t.proxy(this.show,this));var V,E,B,S=t('
');if(l.hour24){for(V=1;V<13;V++)E=S.clone(),B=V/6*Math.PI,E.css({left:d+Math.sin(B)*r-p,top:d-Math.cos(B)*r-p}),E.html(V),C.append(E);for(V=13;V<=24;V++)E=S.clone(),B=V/6*Math.PI,E.css({left:d+Math.sin(B)*u-p,top:d-Math.cos(B)*u-p}),24===V?E.html("00"):E.html(V),C.append(E)}else for(V=1;V<13;V++)E=S.clone(),B=V/6*Math.PI,E.css({left:d+Math.sin(B)*u-p,top:d-Math.cos(B)*u-p}),E.html(V),C.append(E);for(V=0;V<60;V+=5)E=S.clone(),B=V/30*Math.PI,E.css({left:d+Math.sin(B)*u-p,top:d-Math.cos(B)*u-p}),E.html(c(V)),M.append(E);A.on(o,function(i){var o=A.offset(),n=/^touch/.test(i.type),a=o.left+d,c=o.top+d,h=(n?i.originalEvent.touches[0]:i).pageX-a,m=(n?i.originalEvent.touches[0]:i).pageY-c,f=Math.sqrt(h*h+m*m),k=!1;if(outsideMode=!0,fu-p)outsideMode=!0;else{if(!(f>r-p&&fl?l:a,c.left=e<8?8:e>s?s:e,o.css(c),o.show()},k.prototype.show=function(){if(!this.isShown){g(this.options.beforeShow);var i,o=this;this.popover.addClass(this.options.orientation),this.isAppended||(t(document.body).append(this.popover),this.isAppended=!0,t(window).on("resize.lolliclock"+this.id,function(){o.isShown&&o.locate()}),t(window).on("scroll.lolliclock",function(){o.isShown&&o.locate()}),this.AmPmButtons.on("click",function(t){o.changeAmPm(t.currentTarget.children[1].innerHTML)}),this.spanMinutes.on("click",function(){o.toggleView("minutes")}),this.spanHours.on("click",function(){o.toggleView("hours")}),this.spanAmPm.on("click",function(){o.changeAmPm()})),o.locate(),this.plate.addClass("animate"),this.header.addClass("animate"),this.popover.addClass("animate"),this.AmPmButtons.addClass("animate"),this.spanNewTime.addClass("animate"),this.spanOldTime.addClass("animate"),!this.options.autoclose&&this.closeButtons.addClass("animate"),this.plate.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){o.plate.removeClass("animate"),o.header.removeClass("animate"),o.popover.removeClass("animate"),o.AmPmButtons.removeClass("animate"),o.spanNewTime.removeClass("animate"),o.spanOldTime.removeClass("animate"),!o.options.autoclose&&o.closeButtons.removeClass("animate"),o.plate.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend")});var e=this.input.prop("value"),s=this.options.startTime,l=this.input.prop("placeholder");i=e&&a(e)?n(e):"now"===s?new Date:s&&a(s)?n(s):l&&a(l)?n(l):new Date,this.options.hour24?this.hours=i.getHours():(this.hours=i.getHours()%12,this.amOrPm=i.getHours()>11?"AM":"PM"),this.minutes=i.getMinutes(),this.changeAmPm(),o.toggleView("minutes"),o.toggleView("hours"),o.isShown=!0,t(document).on("click.lolliclock."+this.id+" focusin.lolliclock."+this.id,function(i){var e=t(i.target);0===e.closest(o.popover).length&&0===e.closest(o.input).length&&o.done()}),t(document).on("keyup.lolliclock."+this.id,function(t){27===t.keyCode&&o.hide()}),g(this.options.afterShow)}function n(t){var i=t.split(":");if(2===i.length){var o=+i[0],e=i[1].split(" ");if(2===e.length){var s=e[0];return"PM"===e[1]&&(o+=12),new Date(1970,1,1,o,s)}}return new Date("x")}function a(t){return!isNaN(n(t).getTime())}},k.prototype.hide=function(){g(this.options.beforeHide);var i=this;i.popover.addClass("animate-out"),i.plate.addClass("animate-out"),i.header.addClass("animate-out"),i.AmPmButtons.addClass("animate-out"),!i.options.autoclose&&i.closeButtons.addClass("animate-out"),this.popover.on("webkitAnimationEnd animationend MSAnimationEnd oanimationend",function(){t(i.spanHours[0].childNodes[0]).html(""),t(i.spanMinutes[0].childNodes[0]).html(""),i.popover.removeClass("animate-out"),i.plate.removeClass("animate-out"),i.header.removeClass("animate-out"),i.AmPmButtons.removeClass("animate-out"),!i.options.autoclose&&i.closeButtons.removeClass("animate-out"),i.popover.off("webkitAnimationEnd animationend MSAnimationEnd oanimationend"),t(document).off("click.lolliclock."+i.id+" focusin.lolliclock."+i.id),t(document).off("keyup.lolliclock."+i.id),i.popover.hide(),g(i.options.afterHide)}),i.isShown=!1},k.prototype.toggleView=function(i,o){var s="hours"===i,l=s?this.hoursView:this.minutesView,n=s?this.minutesView:this.hoursView;if(this.currentView=i,this.spanHours.toggleClass("lolliclock-primary-text",s),this.spanMinutes.toggleClass("lolliclock-primary-text",!s),n.addClass("lolliclock-dial-out"),l.css("visibility","visible").removeClass("lolliclock-dial-out"),this.resetClock(o),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){n.css("visibility","hidden")},v),s)this.plate.off(e);else{var a=this;this.plate.on(e,function(i){var o=a.plate.offset(),e=o.left+d,s=o.top+d,l=i.pageX-e,n=i.pageY-s,c=Math.sqrt(l*l+n*n);c>u-p&&c+n.html()||!n.html())&&(a.html(s),n.addClass("old-up"),a.addClass("new-up")),this.g.insertBefore(this.hand,this.bearing),this.g.insertBefore(this.bg,this.fg),this.bg.setAttribute("class","lolliclock-canvas-bg");var f=r;e&&(f=u);var k=Math.sin(h)*f,g=-Math.cos(h)*f;this.hand.setAttribute("x2",Math.sin(h)*(f-p)),this.hand.setAttribute("y2",-Math.cos(h)*(f-p)),this.bg.setAttribute("cx",k),this.bg.setAttribute("cy",g),this.fg.setAttribute("cx",k),this.fg.setAttribute("cy",g)},k.prototype.done=function(){g(this.options.beforeDone);var t=this.input.prop("value"),i="";(i=this.options.hour24?c(this.hours)+":"+c(this.minutes):this.hours+":"+c(this.minutes)+" "+this.amOrPm)!==t&&(this.input.prop("value",i),this.input.trigger("input"),this.input.trigger("change")),this.hide()},k.prototype.remove=function(){this.element.removeData("lolliclock"),this.input.off("focus.lolliclock click.lolliclock"),this.isShown&&this.hide(),this.isAppended&&(t(window).off("resize.lolliclock"+this.id),t(window).off("scroll.lolliclock"+this.id),this.popover.remove())},t.fn.lolliclock=function(i){var o=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=t(this),s=e.data("lolliclock");if(s)"function"==typeof s[i]&&s[i].apply(s,o);else{var l=t.extend({},k.DEFAULTS,e.data(),"object"==typeof i&&i);e.data("lolliclock",new k(e,l))}})}}(); \ No newline at end of file From fb37e513b03b8f78dbd6e58070c4b51d8e9282d6 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 22 May 2019 16:53:44 +0800 Subject: [PATCH 103/247] Fixed DateOfBirthPicker --- .../material/design/incubator/client/dob/DateOfBirthPicker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 7fb8c135a..62c621f6e 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -211,7 +211,7 @@ public void setValue(Date value) { this.value = value; year.setValue(value.getYear() + 1900); - day.setValue(value.getDay()); + day.setValue(value.getDate()); month.setSingleValue(value.getMonth()); } From 90495bab3dcb47aefa4a032edb408fdba124cc2e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 26 May 2019 09:05:14 +0800 Subject: [PATCH 104/247] HeroVideo and Keyboard requirements POC --- .../incubator/client/hero/HeroVideo.java | 136 ++++ .../client/hero/HeroVideoClientBundle.java | 39 ++ .../hero/HeroVideoDebugClientBundle.java | 39 ++ .../keyboard/NumericScreenKeyboard.java | 22 + .../client/keyboard/ScreenKeyboard.java | 222 +++++++ .../keyboard/ScreenKeyboardClientBundle.java | 43 ++ .../keyboard/binder/DefaultShiftBinder.java | 19 + .../client/keyboard/binder/KeyBinder.java | 9 + .../keyboard/constants/KeyboardButton.java | 86 +++ .../events/BeforeFirstRenderEvent.java | 61 ++ .../keyboard/events/BeforeRenderEvent.java | 61 ++ .../keyboard/events/ChangeAllEvent.java | 69 ++ .../client/keyboard/events/ChangeEvent.java | 68 ++ .../events/HasScreenKeyboardHandlers.java | 38 ++ .../client/keyboard/events/InitEvent.java | 61 ++ .../client/keyboard/events/KeyPressEvent.java | 69 ++ .../client/keyboard/events/RenderEvent.java | 62 ++ .../client/keyboard/js/Keyboard.java | 102 +++ .../keyboard/js/KeyboardButtonTheme.java | 15 + .../client/keyboard/js/KeyboardLayout.java | 21 + .../client/keyboard/js/KeyboardOptions.java | 351 ++++++++++ .../client/keyboard/js/SimpleKeyboard.java | 12 + .../client/hero/resources/css/hero-video.css | 9 + .../hero/resources/css/hero-video.min.css | 1 + .../css/screen-keyboard-custom.min.css | 1 + .../resources/css/screen-keyboard.min.css | 12 + .../resources/js/screen-keyboard.min.js | 612 ++++++++++++++++++ 27 files changed, 2240 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java create mode 100644 src/main/java/gwt/material/design/incubator/client/hero/HeroVideoClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/hero/HeroVideoDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboardClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeFirstRenderEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeRenderEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java create mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard-custom.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/keyboard/resources/js/screen-keyboard.min.js diff --git a/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java new file mode 100644 index 000000000..69e22e5d5 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java @@ -0,0 +1,136 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.hero; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.SourceElement; +import com.google.gwt.dom.client.VideoElement; +import com.google.gwt.user.client.DOM; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.base.JsLoader; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.base.IncubatorWidget; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; + +public class HeroVideo extends MaterialWidget implements JsLoader { + + static { + IncubatorWidget.showWarning(InfiniteScrollPanel.class); + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(HeroVideoDebugClientBundle.INSTANCE.heroVideoDebugCss()); + } else { + MaterialDesignBase.injectCss(HeroVideoClientBundle.INSTANCE.heroVideoCss()); + } + } + + + private boolean loop = true; + private boolean autoplay = true; + private boolean muted = true; + private String type = "video/webm"; + private String alt = "Hero Video"; + private String src; + + public HeroVideo() { + super(Document.get().createVideoElement(), "hero-video"); + } + + @Override + protected void onLoad() { + super.onLoad(); + + + } + + @Override + public void load() { + VideoElement element = getElement().cast(); + element.setLoop(loop); + element.setAutoplay(autoplay); + element.setMuted(muted); + + SourceElement sourceElement = DOM.createElement("source").cast(); + sourceElement.setType(type); + sourceElement.setAttribute("alt", alt); + sourceElement.setSrc(src); + element.appendChild(sourceElement); + } + + @Override + public void unload() { + getElement().removeAllChildren(); + } + + @Override + public void reload() { + unload(); + load(); + } + + public boolean isLoop() { + return loop; + } + + public void setLoop(boolean loop) { + this.loop = loop; + } + + public boolean isAutoplay() { + return autoplay; + } + + public void setAutoplay(boolean autoplay) { + this.autoplay = autoplay; + } + + public boolean isMuted() { + return muted; + } + + public void setMuted(boolean muted) { + this.muted = muted; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getAlt() { + return alt; + } + + public void setAlt(String alt) { + this.alt = alt; + } + + public String getSrc() { + return src; + } + + public void setSrc(String src) { + this.src = src; + reload(); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/hero/HeroVideoClientBundle.java b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideoClientBundle.java new file mode 100644 index 000000000..6ff282036 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideoClientBundle.java @@ -0,0 +1,39 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.hero; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; + +//@formatter:off + +/** + * Client Bundle for {@link InfiniteScrollPanel} + * + * @author kevzlou7979 + */ +public interface HeroVideoClientBundle extends ClientBundle { + HeroVideoClientBundle INSTANCE = GWT.create(HeroVideoClientBundle.class); + + @Source("resources/css/hero-video.min.css") + TextResource heroVideoCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/hero/HeroVideoDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideoDebugClientBundle.java new file mode 100644 index 000000000..f9924da7e --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideoDebugClientBundle.java @@ -0,0 +1,39 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.hero; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; + +//@formatter:off + +/** + * Debug Client Bundle for {@link InfiniteScrollPanel} + * + * @author kevzlou7979 + */ +public interface HeroVideoDebugClientBundle extends ClientBundle { + HeroVideoDebugClientBundle INSTANCE = GWT.create(HeroVideoDebugClientBundle.class); + + @Source("resources/css/hero-video.css") + TextResource heroVideoDebugCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java new file mode 100644 index 000000000..0cfae467f --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java @@ -0,0 +1,22 @@ +package gwt.material.design.incubator.client.keyboard; + +import gwt.material.design.incubator.client.keyboard.js.KeyboardLayout; + +public class NumericScreenKeyboard extends ScreenKeyboard { + + public NumericScreenKeyboard() { + super(); + } + + @Override + protected void load() { + super.load(); + + KeyboardLayout layout = new KeyboardLayout(); + layout.defaultLayout = new String[]{"1 2 3", "4 5 6", "7 8 9", "{shift} 0 -", "{bksp}"}; + layout.shiftLayout = new String[]{"! / #", "$ % ^", "& * (", "{shift} ) +", "{bksp}"}; + options.setLayout(layout); + options.setTheme("hg-theme-default hg-layout-numeric numeric-theme"); + updateOptions(options); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java new file mode 100644 index 000000000..6fbc5d181 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java @@ -0,0 +1,222 @@ +package gwt.material.design.incubator.client.keyboard; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.event.shared.HandlerRegistration; +import gwt.material.design.client.MaterialDesign; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.incubator.client.keyboard.binder.DefaultShiftBinder; +import gwt.material.design.incubator.client.keyboard.binder.KeyBinder; +import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; +import gwt.material.design.incubator.client.keyboard.events.*; +import gwt.material.design.incubator.client.keyboard.js.Keyboard; +import gwt.material.design.incubator.client.keyboard.js.KeyboardOptions; +import gwt.material.design.incubator.client.keyboard.js.SimpleKeyboard; +import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jquery.client.api.JQuery; + +/** + * On Screen Keyboard support + * + * @author kevzlou7979 + * @see Website + * @see Documentation + * @see Demos + */ +public class ScreenKeyboard extends MaterialWidget implements HasScreenKeyboardHandlers { + + static { + MaterialDesign.injectCss(ScreenKeyboardClientBundle.INSTANCE.screenKeyboardCss()); + MaterialDesign.injectCss(ScreenKeyboardClientBundle.INSTANCE.screenKeyboardCustomCss()); + MaterialDesign.injectDebugJs(ScreenKeyboardClientBundle.INSTANCE.screenKeyboardJs()); + } + + private static final String KEYBOARD_PROPERTY = "Keyboard"; + private static final String SIMPLE_KEYBOARD_PROPERTY = "SimpleKeyboard"; + protected Keyboard keyboard; + protected KeyboardOptions options = new KeyboardOptions(); + protected KeyBinder shiftBinding = new DefaultShiftBinder(); + + public ScreenKeyboard() { + super(Document.get().createDivElement(), "simple-keyboard"); + } + + @Override + protected void onLoad() { + super.onLoad(); + + load(); + } + + protected void load() { + // Initial SimpleKeyboard Defaults + SimpleKeyboard simpleKeyboard = (SimpleKeyboard) JQuery.window().getPropertyObject(SIMPLE_KEYBOARD_PROPERTY); + JQuery.window().setPropertyObject(KEYBOARD_PROPERTY, simpleKeyboard._default); + + if (options != null) { + // Setup events + options.beforeFirstRender = () -> BeforeFirstRenderEvent.fire(this); + options.beforeRender = () -> BeforeRenderEvent.fire(this); + options.onRender = () -> RenderEvent.fire(this); + options.onInit = () -> InitEvent.fire(this); + options.onKeyPress = button -> { + KeyboardButton keyboardButton = null; + if (button != null) { + keyboardButton = KeyboardButton.get(button); + shiftBinding.bind(this, keyboardButton); + } + KeyPressEvent.fire(this, keyboardButton); + }; + options.onChange = input -> ChangeEvent.fire(this, input); + options.onChangeAll = input -> ChangeAllEvent.fire(this, input); + + // Construct Keyboard with required options + keyboard = new Keyboard(options); + } + } + + /** + * Clear the keyboard’s input. + */ + public void clearInput() { + getKeyboard().clearInput(); + } + + /** + * Clear the keyboard’s specific input + * Must have been previously set using the "inputName" prop. + */ + public void clearInput(String inputName) { + getKeyboard().clearInput(inputName); + } + + /** + * Get the keyboard’s input (You can also get it from the onChange prop). + */ + public String getInput() { + return getKeyboard().getInput(); + } + + /** + * Get the keyboard’s input (You can also get it from the onChange prop). + * Must have been previously set using the "inputName" prop. + */ + public String getInput(String inputName) { + return getKeyboard().getInput(inputName); + } + + /** + * Set the keyboard’s input. Useful if you want to track input changes made outside simple-keyboard. + */ + public void setInput(String input) { + getKeyboard().setInput(input); + } + + /** + * Set the keyboard’s input. Useful if you want to track input changes made outside simple-keyboard. + * Must have been previously set using the "inputName" prop. + */ + public void setInput(String input, String inputName) { + getKeyboard().setInput(input, inputName); + } + + /** + * Replaces the entire internal input object. The difference with “setInput” is that “setInput” only changes a + * single key of the input object, while “replaceInput” replaces the full input object. + */ + public void replaceInput(Object object) { + getKeyboard().replaceInput(object); + } + + /** + * Set new option or modify existing ones after initialization. The changes are applied immediately. + */ + public void updateOptions(KeyboardOptions options) { + getKeyboard().setOptions(options); + } + + /** + * Send a command to all simple-keyboard instances at once (if you have multiple instances). + */ + public void dispatch(Functions.Func1 method) { + getKeyboard().dispatch(method); + } + + /** + * Get the DOM Element of a button. If there are several buttons with the same name, an array of the DOM Elements + * is returned. + */ + public Object getButtonElement(String buttonName) { + return getKeyboard().getButtonElement(buttonName); + } + + /** + * Adds an entry to the buttonTheme. Basically a way to add a class to a button. + */ + public void addButtonTheme(String buttons, String classNames) { + getKeyboard().addButtonTheme(buttons, classNames); + } + + /** + * Removes an entry to the buttonTheme. Basically a way to remove a class previously added to a button through + * buttonTheme or addButtonTheme. + * + * @param clasNames + */ + public void removeButtonTheme(String buttons, String clasNames) { + getKeyboard().removeButtonTheme(buttons, clasNames); + } + + public KeyboardOptions getOptions() { + return options; + } + + public void setOptions(KeyboardOptions options) { + this.options = options; + } + + public Keyboard getKeyboard() { + return keyboard; + } + + public KeyBinder getShiftBinding() { + return shiftBinding; + } + + /** + * Set the default shift binding registration. + * @see DefaultShiftBinder + */ + public void setShiftBinding(KeyBinder shiftBinding) { + this.shiftBinding = shiftBinding; + } + + @Override + public HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler) { + return addHandler(handler, KeyPressEvent.getType()); + } + + @Override + public HandlerRegistration addChangeHandler(ChangeEvent.ChangeHandler handler) { + return addHandler(handler, ChangeEvent.getType()); + } + + @Override + public HandlerRegistration addChangeAllHandler(ChangeAllEvent.ChangeAllHandler handler) { + return addHandler(handler, ChangeAllEvent.getType()); + } + + @Override + public HandlerRegistration addBeforeFirstRenderHandler(BeforeFirstRenderEvent.BeforeFirstRenderHandler handler) { + return addHandler(handler, BeforeFirstRenderEvent.getType()); + } + + @Override + public HandlerRegistration addRenderHandler(RenderEvent.RenderHandler handler) { + return addHandler(handler, RenderEvent.getType()); + } + + @Override + public HandlerRegistration addInitHandler(InitEvent.InitHandler handler) { + return addHandler(handler, InitEvent.getType()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboardClientBundle.java b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboardClientBundle.java new file mode 100644 index 000000000..9f620f89b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboardClientBundle.java @@ -0,0 +1,43 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.language.LanguageSelector; + +/** + * Client Resources for {@link LanguageSelector} + * + * @author kevzlou7979 + */ +public interface ScreenKeyboardClientBundle extends ClientBundle { + ScreenKeyboardClientBundle INSTANCE = GWT.create(ScreenKeyboardClientBundle.class); + + @Source("resources/css/screen-keyboard.min.css") + TextResource screenKeyboardCss(); + + @Source("resources/css/screen-keyboard-custom.min.css") + TextResource screenKeyboardCustomCss(); + + @Source("resources/js/screen-keyboard.min.js") + TextResource screenKeyboardJs(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java new file mode 100644 index 000000000..1b45804ff --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java @@ -0,0 +1,19 @@ +package gwt.material.design.incubator.client.keyboard.binder; + +import gwt.material.design.incubator.client.keyboard.ScreenKeyboard; +import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; +import gwt.material.design.incubator.client.keyboard.js.KeyboardOptions; + +public class DefaultShiftBinder implements KeyBinder { + + @Override + public void bind(ScreenKeyboard screenKeyboard, KeyboardButton button) { + if (button != null && (button.equals(KeyboardButton.SHIFT) || button.equals(KeyboardButton.LOCK))) { + String currentLayout = screenKeyboard.getOptions().getLayoutName(); + String shiftToggle = currentLayout.equals("default") ? "shift" : "default"; + KeyboardOptions options = screenKeyboard.getOptions(); + options.setLayoutName(shiftToggle); + screenKeyboard.updateOptions(options); + } + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java new file mode 100644 index 000000000..ac20f9728 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java @@ -0,0 +1,9 @@ +package gwt.material.design.incubator.client.keyboard.binder; + +import gwt.material.design.incubator.client.keyboard.ScreenKeyboard; +import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; + +public interface KeyBinder { + + void bind(ScreenKeyboard keyboard, KeyboardButton button); +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java b/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java new file mode 100644 index 000000000..3802e4600 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java @@ -0,0 +1,86 @@ +package gwt.material.design.incubator.client.keyboard.constants; + +import java.util.Arrays; + +public enum KeyboardButton { + + BKSP("{bksp}", "backspace"), + BACKSPACE("{backspace}", "backspace"), + ENTER("{enter}", "< enter"), + SHIFT("{shift}", "shift"), + SHIFTLEFT("{shiftleft}", "shift"), + SHIFTRIGHT("{shiftright}", "shift"), + ALT("{alt}", "alt"), + S("{s}", "shift"), + TAB("{tab}", "tab"), + LOCK("{lock}", "caps"), + CAPSLOCK("{capslock}", "caps"), + ACCEPT("{accept}", "Submit"), + SPACE("{space}", " "), + DOUBLE_BACKWARSLASH("{//}", " "), + ESC("{esc}", "esc"), + ESCAPE("{escape}", "esc"), + F1("{f1}", "f1"), + F2("{f2}", "f2"), + F3("{f3}", "f3"), + F4("{f4}", "f4"), + F5("{f5}", "f5"), + F6("{f6}", "f6"), + F7("{f7}", "f7"), + F8("{f8}", "f8"), + F9("{f9}", "f9"), + F10("{f10}", "f10"), + F11("{f11}", "f11"), + F12("{f12}", "f12"), + NUMPADDIVIDE("{numpaddivide}", "/"), + NUMLOCK("{numlock}", "lock"), + ARROWUP("{arrowup}", "\u2191"), + ARROWLEFT("{arrowleft}", "\u2190"), + ARROWDOWN("{arrowdown}", "\u2193"), + ARROWRIGHT("{arrowright}", "\u2192"), + PRTSCR("{prtscr}", "print"), + SCROLLLOCK("{scrolllock}", "scroll"), + PAUSE("{pause}", "pause"), + INSERT("{insert}", "ins"), + HOME("{home}", "home"), + PAGEUP("{pageup}", "up"), + DELETE("{delete}", "del"), + END("{end}", "end"), + PAGEDOWN("{pagedown}", "down"), + NUMPADMULTIPLY("{numpadmultiply}", "*"), + NUMPADSUBTRACT("{numpadsubtract}", "-"), + NUMPADADD("{numpadadd}", "+"), + NUMPADENTER("{numpadenter}", "enter"), + PERIOD("{period}", "."), + NUMPADDECIMAL("{numpaddecimal}", "."), + NUMPAD0("{numpad0}", "0"), + NUMPAD1("{numpad1}", "1"), + NUMPAD2("{numpad2}", "2"), + NUMPAD3("{numpad3}", "3"), + NUMPAD4("{numpad4}", "4"), + NUMPAD5("{numpad5}", "5"), + NUMPAD6("{numpad6}", "6"), + NUMPAD7("{numpad7}", "7"), + NUMPAD8("{numpad8}", "8"), + NUMPAD9("{numpad9}", "9"); + private String id; + private String name; + + + KeyboardButton(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public static KeyboardButton get(String id) { + return Arrays.stream(values()).filter(keyboardButton -> id.equals(keyboardButton.getId())).findAny().orElse(null); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeFirstRenderEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeFirstRenderEvent.java new file mode 100644 index 000000000..7727036d3 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeFirstRenderEvent.java @@ -0,0 +1,61 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +//@formatter:off + +/** + * Executes the callback function before the first simple-keyboard render. + * + * @author kevzlou7979 + */ +public class BeforeFirstRenderEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + public BeforeFirstRenderEvent() { + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new BeforeFirstRenderEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(BeforeFirstRenderHandler handler) { + handler.onBeforeFirstRender(this); + } + + public interface BeforeFirstRenderHandler extends EventHandler { + void onBeforeFirstRender(BeforeFirstRenderEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeRenderEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeRenderEvent.java new file mode 100644 index 000000000..ceb094f4e --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/BeforeRenderEvent.java @@ -0,0 +1,61 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +//@formatter:off + +/** + * Executes the callback function before a simple-keyboard render. + * + * @author kevzlou7979 + */ +public class BeforeRenderEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + public BeforeRenderEvent() { + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new BeforeRenderEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(BeforeRenderHandler handler) { + handler.onBeforeRender(this); + } + + public interface BeforeRenderHandler extends EventHandler { + void onBeforeRender(BeforeRenderEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java new file mode 100644 index 000000000..21f8dafe8 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java @@ -0,0 +1,69 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +//@formatter:off + +/** + * Executes the callback function on input change. Returns the input object with all defined inputs. + * This is useful if you’re handling several inputs with simple-keyboard, as specified in the “Using several inputs” guide. + * + * @author kevzlou7979 + */ +public class ChangeAllEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + private String input; + + public ChangeAllEvent(String input) { + this.input = input; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, String input) { + source.fireEvent(new ChangeAllEvent(input)); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public String getInput() { + return input; + } + + @Override + protected void dispatch(ChangeAllHandler handler) { + handler.onChangeAll(this); + } + + public interface ChangeAllHandler extends EventHandler { + void onChangeAll(ChangeAllEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeEvent.java new file mode 100644 index 000000000..40a3c33cb --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeEvent.java @@ -0,0 +1,68 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +//@formatter:off + +/** + * Executes the callback function on input change. Returns the current input’s string. + * + * @author kevzlou7979 + */ +public class ChangeEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + private String input; + + public ChangeEvent(String input) { + this.input = input; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, String message) { + source.fireEvent(new ChangeEvent(message)); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ChangeHandler handler) { + handler.onChange(this); + } + + public String getInput() { + return input; + } + + public interface ChangeHandler extends EventHandler { + void onChange(ChangeEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java new file mode 100644 index 000000000..255c2143f --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java @@ -0,0 +1,38 @@ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.HandlerRegistration; + +public interface HasScreenKeyboardHandlers { + + /** + * Executes the callback function on key press. Returns button layout name (i.e.: “{shift}”). + */ + HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler); + + /** + * Executes the callback function on input change. Returns the current input’s string. + */ + HandlerRegistration addChangeHandler(ChangeEvent.ChangeHandler handler); + + /** + * Executes the callback function on input change. Returns the input object with all defined inputs. + * This is useful if you’re handling several inputs with simple-keyboard, as specified in the “Using several inputs” guide. + */ + HandlerRegistration addChangeAllHandler(ChangeAllEvent.ChangeAllHandler handler); + + /** + * Executes the callback function before the first simple-keyboard render. + */ + HandlerRegistration addBeforeFirstRenderHandler(BeforeFirstRenderEvent.BeforeFirstRenderHandler handler); + + /** + * Executes the callback function every time simple-keyboard is rendered (e.g: when you change layouts). + */ + HandlerRegistration addRenderHandler(RenderEvent.RenderHandler handler); + + /** + * Executes the callback function once simple-keyboard is rendered for the first time (on initialization). + */ + HandlerRegistration addInitHandler(InitEvent.InitHandler handler); + +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java new file mode 100644 index 000000000..ff39c4530 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java @@ -0,0 +1,61 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +//@formatter:off + +/** + * Executes the callback function once simple-keyboard is rendered for the first time (on initialization). + * + * @author kevzlou7979 + */ +public class InitEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + public InitEvent() { + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new InitEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(InitHandler handler) { + handler.onInit(this); + } + + public interface InitHandler extends EventHandler { + void onInit(InitEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java new file mode 100644 index 000000000..b1a55da78 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java @@ -0,0 +1,69 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; +import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; + +//@formatter:off + +/** + * Executes the callback function on key press. Returns button layout name (i.e.: “{shift}”). + * + * @author kevzlou7979 + */ +public class KeyPressEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + private KeyboardButton button; + + public KeyPressEvent(KeyboardButton button) { + this.button = button; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, KeyboardButton message) { + source.fireEvent(new KeyPressEvent(message)); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(KeyPressHandler handler) { + handler.onKeyPress(this); + } + + public KeyboardButton getButton() { + return button; + } + + public interface KeyPressHandler extends EventHandler { + void onKeyPress(KeyPressEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java new file mode 100644 index 000000000..0dd79bf26 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java @@ -0,0 +1,62 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2018 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.keyboard.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HasHandlers; + +//@formatter:off + +/** + * Executes the callback function every time simple-keyboard is rendered (e.g: when you change layouts). + * + * @author kevzlou7979 + */ +public class RenderEvent extends GwtEvent { + + public static final Type TYPE = new Type<>(); + + + public RenderEvent() { + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source) { + source.fireEvent(new RenderEvent()); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(RenderHandler handler) { + handler.onRender(this); + } + + public interface RenderHandler extends EventHandler { + void onRender(RenderEvent event); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java new file mode 100644 index 000000000..24da40de5 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java @@ -0,0 +1,102 @@ +package gwt.material.design.incubator.client.keyboard.js; + +import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +/** + * JSInterop class for Keyboard + * + * @author kevzlou7979 + * @see Documentation + */ +@JsType(isNative = true, namespace = JsPackage.GLOBAL) +public class Keyboard { + + protected Keyboard() { + } + + public Keyboard(KeyboardOptions options) { + } + + /** + * Clear the keyboard’s input. + */ + @JsMethod + public native void clearInput(); + + /** + * Clear the keyboard’s specific input + * Must have been previously set using the "inputName" prop. + */ + @JsMethod + public native void clearInput(String inputName); + + /** + * Get the keyboard’s input (You can also get it from the onChange prop). + */ + @JsMethod + public native String getInput(); + + /** + * Get the keyboard’s input (You can also get it from the onChange prop). + * Must have been previously set using the "inputName" prop. + */ + @JsMethod + public native String getInput(String inputName); + + /** + * Set the keyboard’s input. Useful if you want to track input changes made outside simple-keyboard. + */ + @JsMethod + public native void setInput(String input); + + /** + * Set the keyboard’s input. Useful if you want to track input changes made outside simple-keyboard. + * Must have been previously set using the "inputName" prop. + */ + @JsMethod + public native void setInput(String input, String inputName); + + /** + * Replaces the entire internal input object. The difference with “setInput” is that “setInput” only changes a + * single key of the input object, while “replaceInput” replaces the full input object. + */ + @JsMethod + public native void replaceInput(Object object); + + /** + * Set new option or modify existing ones after initialization. The changes are applied immediately. + */ + @JsMethod + public native void setOptions(KeyboardOptions options); + + /** + * Send a command to all simple-keyboard instances at once (if you have multiple instances). + */ + @JsMethod + public native void dispatch(Functions.Func1 func); + + /** + * Get the DOM Element of a button. If there are several buttons with the same name, an array of the DOM Elements + * is returned. + */ + @JsMethod + public native Object getButtonElement(String buttonName); + + /** + * Adds an entry to the buttonTheme. Basically a way to add a class to a button. + */ + @JsMethod + public native void addButtonTheme(String buttons, String classNames); + + /** + * Removes an entry to the buttonTheme. Basically a way to remove a class previously added to a button through + * buttonTheme or addButtonTheme. + * + * @param clasNames + */ + @JsMethod + public native void removeButtonTheme(String buttons, String clasNames); +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java new file mode 100644 index 000000000..ca29712bc --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java @@ -0,0 +1,15 @@ +package gwt.material.design.incubator.client.keyboard.js; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class KeyboardButtonTheme { + + @JsProperty(name = "class") + public String className; + + @JsProperty + public String buttons; +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java new file mode 100644 index 000000000..326894f0b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java @@ -0,0 +1,21 @@ +package gwt.material.design.incubator.client.keyboard.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class KeyboardLayout { + + @JsProperty(name = "default") + public String[] defaultLayout; + + @JsProperty(name = "shift") + public String[] shiftLayout; + + @JsOverlay + public final String[] getDefaultLayout() { + return defaultLayout; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java new file mode 100644 index 000000000..e46dbc13f --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java @@ -0,0 +1,351 @@ +package gwt.material.design.incubator.client.keyboard.js; + +import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class KeyboardOptions { + + /** + * Properties + */ + @JsProperty + private KeyboardLayout layout; + + @JsProperty + private String layoutName; + + @JsProperty + private Object display; + + @JsProperty + private boolean mergeDisplay; + + @JsProperty + private String theme; + + @JsProperty + private boolean debug; + + @JsProperty + private boolean useMouseEvents; + + @JsProperty + private boolean useTouchEvents; + + @JsProperty + private boolean autoUseTouchEvents; + + @JsProperty + private boolean preventMouseDownDefault; + + @JsProperty + private boolean stopMouseDownPropagation; + + @JsProperty + private boolean disableCaretPositioning; + + @JsProperty + private boolean useButtonTag; + + @JsProperty + private boolean newLineOnEnter; + + @JsProperty + private boolean tabCharOnTab; + + @JsProperty + private String inputName; + + @JsProperty + private int maxLength; + + @JsProperty + private String inputPattern; + + @JsProperty + private boolean disableRowButtonContainers; + + @JsProperty + private boolean syncInstanceInputs; + + @JsProperty + private boolean physicalKeyboardHighlight; + + @JsProperty + private String physicalKeyboardHighlightTextColor; + + @JsProperty + private String physicalKeyboardHighlightBgColor; + + @JsProperty + private KeyboardButtonTheme buttonTheme; + + /** + * Events + */ + + @JsProperty + public Functions.Func1 onChange; + + @JsProperty + public Functions.Func1 onKeyPress; + + @JsProperty + public Functions.Func onRender; + + @JsProperty + public Functions.Func beforeFirstRender; + + @JsProperty + public Functions.Func beforeRender; + + @JsProperty + public Functions.Func onInit; + + @JsProperty + public Functions.Func1 onChangeAll; + + @JsOverlay + public final KeyboardLayout getLayout() { + return layout; + } + + @JsOverlay + public final void setLayout(KeyboardLayout layout) { + this.layout = layout; + } + + @JsOverlay + public final String getLayoutName() { + return layoutName; + } + + @JsOverlay + public final void setLayoutName(String layoutName) { + this.layoutName = layoutName; + } + + @JsOverlay + public final Object getDisplay() { + return display; + } + + @JsOverlay + public final void setDisplay(Object display) { + this.display = display; + } + + @JsOverlay + public final boolean isMergeDisplay() { + return mergeDisplay; + } + + @JsOverlay + public final void setMergeDisplay(boolean mergeDisplay) { + this.mergeDisplay = mergeDisplay; + } + + @JsOverlay + public final String getTheme() { + return theme; + } + + @JsOverlay + public final void setTheme(String theme) { + this.theme = theme; + } + + @JsOverlay + public final boolean isDebug() { + return debug; + } + + @JsOverlay + public final void setDebug(boolean debug) { + this.debug = debug; + } + + @JsOverlay + public final boolean isUseMouseEvents() { + return useMouseEvents; + } + + @JsOverlay + public final void setUseMouseEvents(boolean useMouseEvents) { + this.useMouseEvents = useMouseEvents; + } + + @JsOverlay + public final boolean isUseTouchEvents() { + return useTouchEvents; + } + + @JsOverlay + public final void setUseTouchEvents(boolean useTouchEvents) { + this.useTouchEvents = useTouchEvents; + } + + @JsOverlay + public final boolean isAutoUseTouchEvents() { + return autoUseTouchEvents; + } + + @JsOverlay + public final void setAutoUseTouchEvents(boolean autoUseTouchEvents) { + this.autoUseTouchEvents = autoUseTouchEvents; + } + + @JsOverlay + public final boolean isPreventMouseDownDefault() { + return preventMouseDownDefault; + } + + @JsOverlay + public final void setPreventMouseDownDefault(boolean preventMouseDownDefault) { + this.preventMouseDownDefault = preventMouseDownDefault; + } + + @JsOverlay + public final boolean isStopMouseDownPropagation() { + return stopMouseDownPropagation; + } + + @JsOverlay + public final void setStopMouseDownPropagation(boolean stopMouseDownPropagation) { + this.stopMouseDownPropagation = stopMouseDownPropagation; + } + + @JsOverlay + public final boolean isDisableCaretPositioning() { + return disableCaretPositioning; + } + + @JsOverlay + public final void setDisableCaretPositioning(boolean disableCaretPositioning) { + this.disableCaretPositioning = disableCaretPositioning; + } + + @JsOverlay + public final boolean isUseButtonTag() { + return useButtonTag; + } + + @JsOverlay + public final void setUseButtonTag(boolean useButtonTag) { + this.useButtonTag = useButtonTag; + } + + @JsOverlay + public final boolean isNewLineOnEnter() { + return newLineOnEnter; + } + + @JsOverlay + public final void setNewLineOnEnter(boolean newLineOnEnter) { + this.newLineOnEnter = newLineOnEnter; + } + + @JsOverlay + public final boolean isTabCharOnTab() { + return tabCharOnTab; + } + + @JsOverlay + public final void setTabCharOnTab(boolean tabCharOnTab) { + this.tabCharOnTab = tabCharOnTab; + } + + @JsOverlay + public final String getInputName() { + return inputName; + } + + @JsOverlay + public final void setInputName(String inputName) { + this.inputName = inputName; + } + + @JsOverlay + public final int getMaxLength() { + return maxLength; + } + + @JsOverlay + public final void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + @JsOverlay + public final String getInputPattern() { + return inputPattern; + } + + @JsOverlay + public final void setInputPattern(String inputPattern) { + this.inputPattern = inputPattern; + } + + @JsOverlay + public final boolean isDisableRowButtonContainers() { + return disableRowButtonContainers; + } + + @JsOverlay + public final void setDisableRowButtonContainers(boolean disableRowButtonContainers) { + this.disableRowButtonContainers = disableRowButtonContainers; + } + + @JsOverlay + public final boolean isSyncInstanceInputs() { + return syncInstanceInputs; + } + + @JsOverlay + public final void setSyncInstanceInputs(boolean syncInstanceInputs) { + this.syncInstanceInputs = syncInstanceInputs; + } + + @JsOverlay + public final boolean isPhysicalKeyboardHighlight() { + return physicalKeyboardHighlight; + } + + @JsOverlay + public final void setPhysicalKeyboardHighlight(boolean physicalKeyboardHighlight) { + this.physicalKeyboardHighlight = physicalKeyboardHighlight; + } + + @JsOverlay + public final String getPhysicalKeyboardHighlightTextColor() { + return physicalKeyboardHighlightTextColor; + } + + @JsOverlay + public final void setPhysicalKeyboardHighlightTextColor(String physicalKeyboardHighlightTextColor) { + this.physicalKeyboardHighlightTextColor = physicalKeyboardHighlightTextColor; + } + + @JsOverlay + public final String getPhysicalKeyboardHighlightBgColor() { + return physicalKeyboardHighlightBgColor; + } + + @JsOverlay + public final void setPhysicalKeyboardHighlightBgColor(String physicalKeyboardHighlightBgColor) { + this.physicalKeyboardHighlightBgColor = physicalKeyboardHighlightBgColor; + } + + @JsOverlay + public final KeyboardButtonTheme getButtonTheme() { + return buttonTheme; + } + + @JsOverlay + public final void setButtonTheme(KeyboardButtonTheme buttonTheme) { + this.buttonTheme = buttonTheme; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java new file mode 100644 index 000000000..09567a1ae --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java @@ -0,0 +1,12 @@ +package gwt.material.design.incubator.client.keyboard.js; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class SimpleKeyboard { + + @JsProperty(name = "default") + public Object _default; +} diff --git a/src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.css b/src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.css new file mode 100644 index 000000000..91cfad473 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.css @@ -0,0 +1,9 @@ +.hero-video { + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + width: 100%; + max-width: 100%; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.min.css b/src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.min.css new file mode 100644 index 000000000..d3eb460c4 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/hero/resources/css/hero-video.min.css @@ -0,0 +1 @@ +.hero-video{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;max-width:100%} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard-custom.min.css b/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard-custom.min.css new file mode 100644 index 000000000..606b63ae1 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard-custom.min.css @@ -0,0 +1 @@ +.numeric-theme{max-width:320px;margin:0 auto}.numeric-theme+.simple-keyboard-preview{max-width:320px}.simple-keyboard.hg-theme-default.numeric-theme .hg-button.hg-standardBtn.hg-button-at{max-width:none} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard.min.css b/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard.min.css new file mode 100644 index 000000000..2ff1ed1d0 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/css/screen-keyboard.min.css @@ -0,0 +1,12 @@ +/*! + * + * simple-keyboard v2.21.3 + * https://github.com/hodgef/simple-keyboard + * + * Copyright (c) Francisco Hodge (https://github.com/hodgef) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */body,html{margin:0;padding:0}.simple-keyboard{font-family:HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;overflow:hidden;touch-action:manipulation}.simple-keyboard .hg-row{display:-webkit-flex;display:flex}.simple-keyboard .hg-row:not(:last-child){margin-bottom:5px}.simple-keyboard .hg-row .hg-button-container,.simple-keyboard .hg-row .hg-button:not(:last-child){margin-right:5px}.simple-keyboard .hg-row>div:last-child{margin-right:0}.simple-keyboard .hg-row .hg-button-container{display:-webkit-flex;display:flex}.simple-keyboard .hg-button{display:inline-block;-webkit-flex-grow:1;flex-grow:1;cursor:pointer}.simple-keyboard .hg-button span{pointer-events:none}.simple-keyboard.hg-theme-default{background-color:rgba(0,0,0,.1);padding:5px;border-radius:5px}.simple-keyboard.hg-theme-default .hg-button{box-shadow:0 0 3px -1px rgba(0,0,0,.3);height:40px;border-radius:5px;box-sizing:border-box;padding:5px;background:#fff;border-bottom:1px solid #b5b5b5;cursor:pointer;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.simple-keyboard button.hg-button{border-width:0;outline:0;font-size:inherit}.simple-keyboard.hg-theme-default:not(.hg-touch-events) .hg-button:active{background:#e4e4e4}.simple-keyboard.hg-theme-default.hg-layout-numeric .hg-button{width:33.3%;height:60px;-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center}.simple-keyboard.hg-theme-default .hg-button.hg-button-numpadadd,.simple-keyboard.hg-theme-default .hg-button.hg-button-numpadenter{height:85px}.simple-keyboard.hg-theme-default .hg-button.hg-button-numpad0{width:105px}.simple-keyboard.hg-theme-default .hg-button.hg-button-com{max-width:85px}.simple-keyboard.hg-theme-default .hg-button.hg-standardBtn.hg-button-at{max-width:45px}.simple-keyboard.hg-theme-default .hg-button.hg-selectedButton{background:rgba(5,25,70,.53);color:#fff}.simple-keyboard.hg-theme-default .hg-button.hg-standardBtn[data-skbtn=".com"]{max-width:82px}.simple-keyboard.hg-theme-default .hg-button.hg-standardBtn[data-skbtn="@"]{max-width:60px} +/*# sourceMappingURL=index.css.map */ \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/js/screen-keyboard.min.js b/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/js/screen-keyboard.min.js new file mode 100644 index 000000000..87bc625ae --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/keyboard/resources/js/screen-keyboard.min.js @@ -0,0 +1,612 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! + * + * simple-keyboard v2.21.3 + * https://github.com/hodgef/simple-keyboard + * + * Copyright (c) Francisco Hodge (https://github.com/hodgef) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ +!function (t, e) { + "object" === typeof exports && "object" === typeof module ? module.exports = e() : "function" === typeof define && define.amd ? define("SimpleKeyboard", [], e) : "object" === typeof exports ? exports.SimpleKeyboard = e() : t.SimpleKeyboard = e() +}(window, function () { + return function (t) { + var e = {}; + + function n(o) { + if (e[o]) return e[o].exports; + var i = e[o] = {i: o, l: !1, exports: {}}; + return t[o].call(i.exports, i, i.exports, n), i.l = !0, i.exports + } + + return n.m = t, n.c = e, n.d = function (t, e, o) { + n.o(t, e) || Object.defineProperty(t, e, {enumerable: !0, get: o}) + }, n.r = function (t) { + "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {value: "Module"}), Object.defineProperty(t, "__esModule", {value: !0}) + }, n.t = function (t, e) { + if (1 & e && (t = n(t)), 8 & e) return t; + if (4 & e && "object" === typeof t && t && t.__esModule) return t; + var o = Object.create(null); + if (n.r(o), Object.defineProperty(o, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) for (var i in t) n.d(o, i, function (e) { + return t[e] + }.bind(null, i)); + return o + }, n.n = function (t) { + var e = t && t.__esModule ? function () { + return t.default + } : function () { + return t + }; + return n.d(e, "a", e), e + }, n.o = function (t, e) { + return Object.prototype.hasOwnProperty.call(t, e) + }, n.p = "", n(n.s = 0) + }([function (t, e, n) { + t.exports = n(2) + }, function (t, e, n) { + }, function (t, e, n) { + "use strict"; + n.r(e); + n(1); + + function o(t, e) { + for (var n = 0; n < e.length; n++) { + var o = e[n]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) + } + } + + var i = function () { + function t(e) { + !function (t, e) { + if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.simpleKeyboardInstance = e, this.initKeyboardListener = this.initKeyboardListener.bind(this), this.getSimpleKeyboardLayoutKey = this.getSimpleKeyboardLayoutKey.bind(this), this.initKeyboardListener() + } + + var e, n, i; + return e = t, (n = [{ + key: "initKeyboardListener", value: function () { + var t = this; + document.addEventListener("keydown", function (e) { + if (t.simpleKeyboardInstance.options.physicalKeyboardHighlight) { + var n = t.getSimpleKeyboardLayoutKey(e); + t.simpleKeyboardInstance.dispatch(function (e) { + var o = e.getButtonElement(n) || e.getButtonElement("{".concat(n, "}")); + o && (o.style.backgroundColor = t.simpleKeyboardInstance.options.physicalKeyboardHighlightBgColor || "#9ab4d0", o.style.color = t.simpleKeyboardInstance.options.physicalKeyboardHighlightTextColor || "white") + }) + } + }), document.addEventListener("keyup", function (e) { + if (t.simpleKeyboardInstance.options.physicalKeyboardHighlight) { + var n = t.getSimpleKeyboardLayoutKey(e); + t.simpleKeyboardInstance.dispatch(function (t) { + var e = t.getButtonElement(n) || t.getButtonElement("{".concat(n, "}")); + e && e.removeAttribute && e.removeAttribute("style") + }) + } + }) + } + }, { + key: "getSimpleKeyboardLayoutKey", value: function (t) { + var e; + return ((e = t.code.includes("Numpad") || t.code.includes("Shift") || t.code.includes("Space") || t.code.includes("Backspace") || t.code.includes("Control") || t.code.includes("Alt") || t.code.includes("Meta") ? t.code : t.key) !== e.toUpperCase() || "F" === t.code[0] && Number.isInteger(Number(t.code[1])) && t.code.length <= 3) && (e = e.toLowerCase()), e + } + }]) && o(e.prototype, n), i && o(e, i), t + }(); + + function s(t, e) { + for (var n = 0; n < e.length; n++) { + var o = e[n]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) + } + } + + var a = function () { + function t() { + !function (t, e) { + if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") + }(this, t) + } + + var e, n, o; + return e = t, o = [{ + key: "getDefaultLayout", value: function () { + return { + default: ["` 1 2 3 4 5 6 7 8 9 0 - = {bksp}", "{tab} q w e r t y u i o p [ ] \\", "{lock} a s d f g h j k l ; ' {enter}", "{shift} z x c v b n m , . / {shift}", ".com @ {space}"], + shift: ["~ ! @ # $ % ^ & * ( ) _ + {bksp}", "{tab} Q W E R T Y U I O P { } |", '{lock} A S D F G H J K L : " {enter}', "{shift} Z X C V B N M < > ? {shift}", ".com @ {space}"] + } + } + }], (n = null) && s(e.prototype, n), o && s(e, o), t + }(); + + function u(t) { + return (u = "function" === typeof Symbol && "symbol" === typeof Symbol.iterator ? function (t) { + return typeof t + } : function (t) { + return t && "function" === typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t + })(t) + } + + function r(t, e) { + for (var n = 0; n < e.length; n++) { + var o = e[n]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) + } + } + + var c = function () { + function t(e) { + !function (t, e) { + if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.simpleKeyboardInstance = e, t.bindMethods(t, this) + } + + var e, n, o; + return e = t, o = [{ + key: "bindMethods", value: function (t, e) { + var n = !0, o = !1, i = void 0; + try { + for (var s, a = Object.getOwnPropertyNames(t.prototype)[Symbol.iterator](); !(n = (s = a.next()).done); n = !0) { + var u = s.value; + "constructor" === u || "bindMethods" === u || (e[u] = e[u].bind(e)) + } + } catch (r) { + o = !0, i = r + } finally { + try { + n || null == a.return || a.return() + } finally { + if (o) throw i + } + } + } + }], (n = [{ + key: "getButtonClass", value: function (t) { + var e = t.includes("{") && t.includes("}") && "{//}" !== t ? "functionBtn" : "standardBtn", + n = t.replace("{", "").replace("}", ""), o = ""; + return "standardBtn" !== e && (o = " hg-button-".concat(n)), "hg-".concat(e).concat(o) + } + }, { + key: "getDefaultDiplay", value: function () { + return { + "{bksp}": "backspace", + "{backspace}": "backspace", + "{enter}": "< enter", + "{shift}": "shift", + "{shiftleft}": "shift", + "{shiftright}": "shift", + "{alt}": "alt", + "{s}": "shift", + "{tab}": "tab", + "{lock}": "caps", + "{capslock}": "caps", + "{accept}": "Submit", + "{space}": " ", + "{//}": " ", + "{esc}": "esc", + "{escape}": "esc", + "{f1}": "f1", + "{f2}": "f2", + "{f3}": "f3", + "{f4}": "f4", + "{f5}": "f5", + "{f6}": "f6", + "{f7}": "f7", + "{f8}": "f8", + "{f9}": "f9", + "{f10}": "f10", + "{f11}": "f11", + "{f12}": "f12", + "{numpaddivide}": "/", + "{numlock}": "lock", + "{arrowup}": "\u2191", + "{arrowleft}": "\u2190", + "{arrowdown}": "\u2193", + "{arrowright}": "\u2192", + "{prtscr}": "print", + "{scrolllock}": "scroll", + "{pause}": "pause", + "{insert}": "ins", + "{home}": "home", + "{pageup}": "up", + "{delete}": "del", + "{end}": "end", + "{pagedown}": "down", + "{numpadmultiply}": "*", + "{numpadsubtract}": "-", + "{numpadadd}": "+", + "{numpadenter}": "enter", + "{period}": ".", + "{numpaddecimal}": ".", + "{numpad0}": "0", + "{numpad1}": "1", + "{numpad2}": "2", + "{numpad3}": "3", + "{numpad4}": "4", + "{numpad5}": "5", + "{numpad6}": "6", + "{numpad7}": "7", + "{numpad8}": "8", + "{numpad9}": "9" + } + } + }, { + key: "getButtonDisplayName", value: function (t, e, n) { + return (e = n ? Object.assign({}, this.getDefaultDiplay(), e) : e || this.getDefaultDiplay())[t] || t + } + }, { + key: "getUpdatedInput", value: function (t, e, n, o, i) { + var s = e; + return ("{bksp}" === t || "{backspace}" === t) && s.length > 0 ? s = this.removeAt(s, o, i) : "{space}" === t ? s = this.addStringAt(s, " ", o, i) : "{tab}" !== t || "boolean" === typeof n.tabCharOnTab && !1 === n.tabCharOnTab ? "{enter}" !== t && "{numpadenter}" !== t || !n.newLineOnEnter ? t.includes("numpad") && Number.isInteger(Number(t[t.length - 2])) ? s = this.addStringAt(s, t[t.length - 2], o, i) : "{numpaddivide}" === t ? s = this.addStringAt(s, "/", o, i) : "{numpadmultiply}" === t ? s = this.addStringAt(s, "*", o, i) : "{numpadsubtract}" === t ? s = this.addStringAt(s, "-", o, i) : "{numpadadd}" === t ? s = this.addStringAt(s, "+", o, i) : "{numpaddecimal}" === t ? s = this.addStringAt(s, ".", o, i) : "{" === t || "}" === t ? s = this.addStringAt(s, t, o, i) : t.includes("{") || t.includes("}") || (s = this.addStringAt(s, t, o, i)) : s = this.addStringAt(s, "\n", o, i) : s = this.addStringAt(s, "\t", o, i), s + } + }, { + key: "updateCaretPos", value: function (t, e) { + var n = this.updateCaretPosAction(this.simpleKeyboardInstance, t, e); + this.simpleKeyboardInstance.options.syncInstanceInputs && this.simpleKeyboardInstance.dispatch(function (t) { + t.caretPosition = n + }) + } + }, { + key: "updateCaretPosAction", value: function (t, e, n) { + return n ? t.caretPosition > 0 && (t.caretPosition = t.caretPosition - e) : t.caretPosition = t.caretPosition + e, this.simpleKeyboardInstance.options.debug && console.log("Caret at:", t.caretPosition, "(".concat(t.keyboardDOMClass, ")")), t.caretPosition + } + }, { + key: "addStringAt", value: function (t, e, n, o) { + var i; + return n || 0 === n ? (i = [t.slice(0, n), e, t.slice(n)].join(""), this.isMaxLengthReached() || o && this.updateCaretPos(e.length)) : i = t + e, i + } + }, { + key: "removeAt", value: function (t, e, n) { + if (0 === this.simpleKeyboardInstance.caretPosition) return t; + var o, i = /([\uD800-\uDBFF][\uDC00-\uDFFF])/g; + return e && e >= 0 ? t.substring(e - 2, e).match(i) ? (o = t.substr(0, e - 2) + t.substr(e), n && this.updateCaretPos(2, !0)) : (o = t.substr(0, e - 1) + t.substr(e), n && this.updateCaretPos(1, !0)) : t.slice(-2).match(i) ? (o = t.slice(0, -2), n && this.updateCaretPos(2, !0)) : (o = t.slice(0, -1), n && this.updateCaretPos(1, !0)), o + } + }, { + key: "handleMaxLength", value: function (t, e, n) { + var o = e.maxLength, i = t[e.inputName], s = i.length === o; + if (n.length <= i.length) return !1; + if (Number.isInteger(o)) return e.debug && console.log("maxLength (num) reached:", s), s ? (this.maxLengthReached = !0, !0) : (this.maxLengthReached = !1, !1); + if ("object" === u(o)) { + var a = i.length === o[e.inputName]; + return e.debug && console.log("maxLength (obj) reached:", a), a ? (this.maxLengthReached = !0, !0) : (this.maxLengthReached = !1, !1) + } + } + }, { + key: "isMaxLengthReached", value: function () { + return Boolean(this.maxLengthReached) + } + }, { + key: "isTouchDevice", value: function () { + return "ontouchstart" in window || navigator.maxTouchPoints + } + }, { + key: "pointerEventsSupported", value: function () { + return window.PointerEvent + } + }, { + key: "camelCase", value: function (t) { + return t.toLowerCase().trim().split(/[.\-_\s]/g).reduce(function (t, e) { + return e.length ? t + e[0].toUpperCase() + e.slice(1) : t + }) + } + }, { + key: "countInArray", value: function (t, e) { + return t.reduce(function (t, n) { + return t + (n === e) + }, 0) + } + }]) && r(e.prototype, n), o && r(e, o), t + }(); + + function l(t) { + return (l = "function" === typeof Symbol && "symbol" === typeof Symbol.iterator ? function (t) { + return typeof t + } : function (t) { + return t && "function" === typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t + })(t) + } + + function h(t, e) { + for (var n = 0; n < e.length; n++) { + var o = e[n]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) + } + } + + var d = function () { + function t() { + var e = this; + !function (t, e) { + if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.registerModule = function (t, n) { + e.modules[t] || (e.modules[t] = {}), n(e.modules[t]) + }; + var n = "string" === typeof (arguments.length <= 0 ? void 0 : arguments[0]) ? arguments.length <= 0 ? void 0 : arguments[0] : ".simple-keyboard", + o = "object" === l(arguments.length <= 0 ? void 0 : arguments[0]) ? arguments.length <= 0 ? void 0 : arguments[0] : arguments.length <= 1 ? void 0 : arguments[1]; + if (o || (o = {}), this.utilities = new c(this), this.keyboardDOM = document.querySelector(n), this.options = o, this.options.layoutName = this.options.layoutName || "default", this.options.theme = this.options.theme || "hg-theme-default", this.options.inputName = this.options.inputName || "default", this.options.preventMouseDownDefault = this.options.preventMouseDownDefault || !1, this.keyboardPluginClasses = "", c.bindMethods(t, this), this.input = {}, this.input[this.options.inputName] = "", this.keyboardDOMClass = n.split(".").join(""), this.buttonElements = {}, !this.keyboardDOM) throw console.warn('"'.concat(n, '" was not found in the DOM.')), new Error("KEYBOARD_DOM_ERROR"); + this.render(), window.SimpleKeyboardInstances || (window.SimpleKeyboardInstances = {}), window.SimpleKeyboardInstances[this.utilities.camelCase(this.keyboardDOMClass)] = this, this.physicalKeyboardInterface = new i(this), this.modules = {}, this.loadModules() + } + + var e, n, o; + return e = t, (n = [{ + key: "handleButtonClicked", value: function (t) { + var e = this.options.debug; + if ("{//}" === t) return !1; + "function" === typeof this.options.onKeyPress && this.options.onKeyPress(t), this.input[this.options.inputName] || (this.input[this.options.inputName] = ""); + var n = this.utilities.getUpdatedInput(t, this.input[this.options.inputName], this.options, this.caretPosition); + if (this.input[this.options.inputName] !== n && (!this.options.inputPattern || this.options.inputPattern && this.inputPatternIsValid(n))) { + if (this.options.maxLength && this.utilities.handleMaxLength(this.input, this.options, n)) return !1; + this.input[this.options.inputName] = this.utilities.getUpdatedInput(t, this.input[this.options.inputName], this.options, this.caretPosition, !0), e && console.log("Input changed:", this.input), this.options.syncInstanceInputs && this.syncInstanceInputs(this.input), "function" === typeof this.options.onChange && this.options.onChange(this.input[this.options.inputName]), "function" === typeof this.options.onChangeAll && this.options.onChangeAll(this.input) + } + e && console.log("Key pressed:", t) + } + }, { + key: "handleButtonMouseDown", value: function (t, e) { + var n = this; + this.options.preventMouseDownDefault && e.preventDefault(), this.options.stopMouseDownPropagation && e.stopPropagation(), this.isMouseHold = !0, this.holdInteractionTimeout && clearTimeout(this.holdInteractionTimeout), this.holdTimeout && clearTimeout(this.holdTimeout), this.holdTimeout = setTimeout(function () { + !n.isMouseHold || (t.includes("{") || t.includes("}")) && "{delete}" !== t && "{backspace}" !== t && "{bksp}" !== t && "{space}" !== t && "{tab}" !== t || (n.options.debug && console.log("Button held:", t), n.handleButtonHold(t, e)), clearTimeout(n.holdTimeout) + }, 500) + } + }, { + key: "handleButtonMouseUp", value: function () { + this.isMouseHold = !1, this.holdInteractionTimeout && clearTimeout(this.holdInteractionTimeout) + } + }, { + key: "handleButtonHold", value: function (t) { + var e = this; + this.holdInteractionTimeout && clearTimeout(this.holdInteractionTimeout), this.holdInteractionTimeout = setTimeout(function () { + e.isMouseHold ? (e.handleButtonClicked(t), e.handleButtonHold(t)) : clearTimeout(e.holdInteractionTimeout) + }, 100) + } + }, { + key: "syncInstanceInputs", value: function () { + var t = this; + this.dispatch(function (e) { + e.replaceInput(t.input), e.caretPosition = t.caretPosition + }) + } + }, { + key: "clearInput", value: function (t) { + t = t || this.options.inputName, this.input[t] = "", this.caretPosition = 0, this.options.syncInstanceInputs && this.syncInstanceInputs(this.input) + } + }, { + key: "getInput", value: function (t) { + return t = t || this.options.inputName, this.options.syncInstanceInputs && this.syncInstanceInputs(this.input), this.input[t] + } + }, { + key: "setInput", value: function (t, e) { + e = e || this.options.inputName, this.input[e] = t, this.options.syncInstanceInputs && this.syncInstanceInputs(this.input) + } + }, { + key: "replaceInput", value: function (t) { + this.input = t + } + }, { + key: "setOptions", value: function (t) { + t = t || {}, this.options = Object.assign(this.options, t), this.onSetOptions(t), this.render() + } + }, { + key: "onSetOptions", value: function (t) { + t.inputName && (this.options.debug && console.log("inputName changed. caretPosition reset."), this.caretPosition = null) + } + }, { + key: "clear", value: function () { + this.keyboardDOM.innerHTML = "", this.keyboardDOM.className = this.keyboardDOMClass, this.buttonElements = {} + } + }, { + key: "dispatch", value: function (t) { + if (!window.SimpleKeyboardInstances) throw console.warn("SimpleKeyboardInstances is not defined. Dispatch cannot be called."), new Error("INSTANCES_VAR_ERROR"); + return Object.keys(window.SimpleKeyboardInstances).forEach(function (e) { + t(window.SimpleKeyboardInstances[e], e) + }) + } + }, { + key: "addButtonTheme", value: function (t, e) { + var n = this; + if (!e || !t) return !1; + t.split(" ").forEach(function (o) { + e.split(" ").forEach(function (e) { + n.options.buttonTheme || (n.options.buttonTheme = []); + var i = !1; + n.options.buttonTheme.map(function (t) { + if (t.class.split(" ").includes(e)) { + i = !0; + var n = t.buttons.split(" "); + n.includes(o) || (i = !0, n.push(o), t.buttons = n.join(" ")) + } + return t + }), i || n.options.buttonTheme.push({class: e, buttons: t}) + }) + }), this.render() + } + }, { + key: "removeButtonTheme", value: function (t, e) { + var n = this; + if (!t && !e) return this.options.buttonTheme = [], this.render(), !1; + t && Array.isArray(this.options.buttonTheme) && this.options.buttonTheme.length && (t.split(" ").forEach(function (t, o) { + n.options.buttonTheme.map(function (o, i) { + if (e && e.includes(o.class) || !e) { + var s = o.buttons.split(" ").filter(function (e) { + return e !== t + }); + s.length ? o.buttons = s.join(" ") : (n.options.buttonTheme.splice(i, 1), o = null) + } + return o + }) + }), this.render()) + } + }, { + key: "getButtonElement", value: function (t) { + var e, n = this.buttonElements[t]; + return n && (e = n.length > 1 ? n : n[0]), e + } + }, { + key: "inputPatternIsValid", value: function (t) { + var e, n = this.options.inputPattern; + if ((e = n instanceof RegExp ? n : n[this.options.inputName]) && t) { + var o = e.test(t); + return this.options.debug && console.log('inputPattern ("'.concat(e, '"): ').concat(o ? "passed" : "did not pass!")), o + } + return !0 + } + }, { + key: "handleCaret", value: function () { + this.caretPosition = null; + var t = window.SimpleKeyboardInstances; + (t && Object.keys(t)[0] === this.utilities.camelCase(this.keyboardDOMClass) || !t) && (this.options.debug && console.log("Caret handling started (".concat(this.keyboardDOMClass, ")")), document.addEventListener("keyup", this.caretEventHandler), document.addEventListener("mouseup", this.caretEventHandler), document.addEventListener("touchend", this.caretEventHandler)) + } + }, { + key: "caretEventHandler", value: function (t) { + var e; + t.target.tagName && (e = t.target.tagName.toLowerCase()), this.dispatch(function (n) { + n.isMouseHold && (n.isMouseHold = !1), "textarea" !== e && "input" !== e || n.options.disableCaretPositioning ? n.options.disableCaretPositioning && (n.caretPosition = null) : (n.caretPosition = t.target.selectionStart, n.options.debug && console.log("Caret at: ", t.target.selectionStart, t.target.tagName.toLowerCase(), "(".concat(n.keyboardDOMClass, ")"))) + }) + } + }, { + key: "getButtonTheme", value: function () { + var t = this, e = {}; + return this.options.buttonTheme.forEach(function (n) { + var o; + n.buttons && n.class ? ("string" === typeof n.buttons && (o = n.buttons.split(" ")), o && o.forEach(function (o) { + var i = e[o]; + i ? t.utilities.countInArray(i.split(" "), n.class) || (e[o] = "".concat(i, " ").concat(n.class)) : e[o] = n.class + })) : console.warn('buttonTheme row is missing the "buttons" or the "class". Please check the documentation.') + }), e + } + }, { + key: "onTouchDeviceDetected", value: function () { + this.processAutoTouchEvents(), this.disableContextualWindow() + } + }, { + key: "disableContextualWindow", value: function () { + window.oncontextmenu = function (t) { + if (t.target.classList.contains("hg-button")) return t.preventDefault(), t.stopPropagation(), !1 + } + } + }, { + key: "processAutoTouchEvents", value: function () { + this.options.autoUseTouchEvents && (this.options.useTouchEvents = !0, this.options.debug && console.log("autoUseTouchEvents: Touch device detected, useTouchEvents enabled.")) + } + }, { + key: "onInit", value: function () { + this.options.debug && console.log("".concat(this.keyboardDOMClass, " Initialized")), this.handleCaret(), "function" === typeof this.options.onInit && this.options.onInit() + } + }, { + key: "beforeFirstRender", value: function () { + this.utilities.isTouchDevice() && this.onTouchDeviceDetected(), "function" === typeof this.options.beforeFirstRender && this.options.beforeFirstRender(), !this.utilities.pointerEventsSupported() || this.options.useTouchEvents || this.options.useMouseEvents || this.options.debug && console.log("Using PointerEvents as it is supported by this browser"), this.options.useTouchEvents && this.options.debug && console.log("useTouchEvents has been enabled. Only touch events will be used.") + } + }, { + key: "beforeRender", value: function () { + "function" === typeof this.options.beforeRender && this.options.beforeRender() + } + }, { + key: "onRender", value: function () { + "function" === typeof this.options.onRender && this.options.onRender() + } + }, { + key: "onModulesLoaded", value: function () { + "function" === typeof this.options.onModulesLoaded && this.options.onModulesLoaded() + } + }, { + key: "loadModules", value: function () { + var t = this; + Array.isArray(this.options.modules) && (this.options.modules.forEach(function (e) { + var n = new e; + if (n.constructor.name && "Function" !== n.constructor.name) { + var o = "module-".concat(t.utilities.camelCase(n.constructor.name)); + t.keyboardPluginClasses = t.keyboardPluginClasses + " ".concat(o) + } + n.init(t) + }), this.keyboardPluginClasses = this.keyboardPluginClasses + " modules-loaded", this.render(), this.onModulesLoaded()) + } + }, { + key: "getModuleProp", value: function (t, e) { + return !!this.modules[t] && this.modules[t][e] + } + }, { + key: "getModulesList", value: function () { + return Object.keys(this.modules) + } + }, { + key: "parseRowDOMContainers", value: function (t, e, n, o) { + var i = this, s = Array.from(t.children), a = 0; + return s.length && n.forEach(function (n, u) { + var r = o[u]; + if (!r || !(r > n)) return !1; + var c = n - a, l = r - a, h = document.createElement("div"); + h.className += "hg-button-container"; + var d = "".concat(i.options.layoutName, "-r").concat(e, "c").concat(u); + h.setAttribute("data-skUID", d); + var p = s.splice(c, l - c + 1); + a = l - c, p.forEach(function (t) { + return h.appendChild(t) + }), s.splice(c, 0, h), t.innerHTML = "", s.forEach(function (e) { + return t.appendChild(e) + }), i.options.debug && console.log("rowDOMContainer", p, c, l, a + 1) + }), t + } + }, { + key: "render", value: function () { + var t = this; + this.clear(), this.initialized || this.beforeFirstRender(), this.beforeRender(); + var e = "hg-layout-".concat(this.options.layoutName), + n = this.options.layout || a.getDefaultLayout(), o = this.options.useTouchEvents || !1, + i = o ? "hg-touch-events" : "", s = this.options.useMouseEvents || !1, + u = this.options.disableRowButtonContainers, + r = Array.isArray(this.options.buttonTheme) ? this.getButtonTheme() : {}; + this.keyboardDOM.className += " ".concat(this.options.theme, " ").concat(e, " ").concat(this.keyboardPluginClasses, " ").concat(i), n[this.options.layoutName].forEach(function (e, n) { + var i = e.split(" "), a = document.createElement("div"); + a.className += "hg-row"; + var c = [], l = []; + i.forEach(function (e, i) { + var h = !u && e.includes("[") && e.length > 1, d = !u && e.includes("]") && e.length > 1; + h && (c.push(i), e = e.replace(/\[/g, "")), d && (l.push(i), e = e.replace(/\]/g, "")); + var p = t.utilities.getButtonClass(e), f = r[e], + y = t.utilities.getButtonDisplayName(e, t.options.display, t.options.mergeDisplay), + m = t.options.useButtonTag ? "button" : "div", b = document.createElement(m); + b.className += "hg-button ".concat(p).concat(f ? " " + f : ""), !t.utilities.pointerEventsSupported() || o || s ? o ? (b.ontouchstart = function (n) { + t.handleButtonClicked(e), t.handleButtonMouseDown(e, n) + }, b.ontouchend = function (e) { + return t.handleButtonMouseUp() + }, b.ontouchcancel = function (e) { + return t.handleButtonMouseUp() + }) : (b.onclick = function () { + t.isMouseHold = !1, t.handleButtonClicked(e) + }, b.onmousedown = function (n) { + t.handleButtonMouseDown(e, n) + }) : (b.onpointerdown = function (n) { + t.handleButtonClicked(e), t.handleButtonMouseDown(e, n) + }, b.onpointerup = function (e) { + t.handleButtonMouseUp() + }, b.onpointercancel = function (e) { + return t.handleButtonMouseUp() + }), b.setAttribute("data-skBtn", e); + var v = "".concat(t.options.layoutName, "-r").concat(n, "b").concat(i); + b.setAttribute("data-skBtnUID", v), b.setAttribute("data-displayLabel", y); + var g = document.createElement("span"); + g.innerHTML = y, b.appendChild(g), t.buttonElements[e] || (t.buttonElements[e] = []), t.buttonElements[e].push(b), a.appendChild(b) + }), a = t.parseRowDOMContainers(a, n, c, l), t.keyboardDOM.appendChild(a) + }), this.onRender(), this.initialized || (this.initialized = !0, !this.utilities.pointerEventsSupported() || o || s ? o ? (document.ontouchend = function (e) { + return t.handleButtonMouseUp() + }, document.ontouchcancel = function (e) { + return t.handleButtonMouseUp() + }) : o || (document.onmouseup = function () { + return t.handleButtonMouseUp() + }) : document.onpointerup = function () { + return t.handleButtonMouseUp() + }, this.onInit()) + } + }]) && h(e.prototype, n), o && h(e, o), t + }(); + e.default = d + }]) +}); +//# sourceMappingURL=index.js.map \ No newline at end of file From c5f3ab7fbfb26391bdfe6b05d3c99cf184728f1e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 29 May 2019 08:51:21 +0800 Subject: [PATCH 105/247] Added missing license headers --- .../incubator/client/hero/HeroVideo.java | 4 ++-- .../keyboard/NumericScreenKeyboard.java | 19 +++++++++++++++++++ .../client/keyboard/ScreenKeyboard.java | 19 +++++++++++++++++++ .../keyboard/binder/DefaultShiftBinder.java | 19 +++++++++++++++++++ .../client/keyboard/binder/KeyBinder.java | 19 +++++++++++++++++++ .../keyboard/constants/KeyboardButton.java | 19 +++++++++++++++++++ .../keyboard/events/ChangeAllEvent.java | 4 ++-- .../events/HasScreenKeyboardHandlers.java | 19 +++++++++++++++++++ .../client/keyboard/events/InitEvent.java | 4 ++-- .../client/keyboard/events/RenderEvent.java | 4 ++-- .../client/keyboard/js/Keyboard.java | 19 +++++++++++++++++++ .../keyboard/js/KeyboardButtonTheme.java | 19 +++++++++++++++++++ .../client/keyboard/js/KeyboardLayout.java | 19 +++++++++++++++++++ .../client/keyboard/js/KeyboardOptions.java | 19 +++++++++++++++++++ .../client/keyboard/js/SimpleKeyboard.java | 19 +++++++++++++++++++ 15 files changed, 217 insertions(+), 8 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java index 69e22e5d5..ba26ba419 100644 --- a/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java +++ b/src/main/java/gwt/material/design/incubator/client/hero/HeroVideo.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java index 0cfae467f..4f9b639a4 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard; import gwt.material.design.incubator.client.keyboard.js.KeyboardLayout; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java index 6fbc5d181..1e8b889ae 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard; import com.google.gwt.dom.client.Document; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java index 1b45804ff..b833e01a4 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.binder; import gwt.material.design.incubator.client.keyboard.ScreenKeyboard; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java index ac20f9728..88f5e5ef1 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.binder; import gwt.material.design.incubator.client.keyboard.ScreenKeyboard; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java b/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java index 3802e4600..3df40f05b 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/constants/KeyboardButton.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.constants; import java.util.Arrays; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java index 21f8dafe8..22697e513 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/ChangeAllEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java index 255c2143f..536937926 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.events; import com.google.gwt.event.shared.HandlerRegistration; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java index ff39c4530..32246c82f 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/InitEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java index 0dd79bf26..612da1d53 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/RenderEvent.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java index 24da40de5..412777a9d 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.js; import gwt.material.design.jquery.client.api.Functions; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java index ca29712bc..6aca46e48 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardButtonTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.js; import jsinterop.annotations.JsPackage; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java index 326894f0b..df03bad8a 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java index e46dbc13f..9f0427cf7 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardOptions.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.js; import gwt.material.design.jquery.client.api.Functions; diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java index 09567a1ae..52dbddc9a 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/SimpleKeyboard.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.keyboard.js; import jsinterop.annotations.JsPackage; From fdca58e1ebd95b8c24e1f6f0d5658fbc5e864d10 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 10 Jun 2019 11:51:18 +0800 Subject: [PATCH 106/247] Removal of ChartJs Addition of LocalForage (IndexedDB Wrapper) incubator widget Preparation for 2.2 Official Release --- README.md | 8 +- pom.xml | 8 +- .../client/chart/chartjs/BarChart.java | 37 - .../client/chart/chartjs/BubbleChart.java | 31 - .../client/chart/chartjs/DoughnutChart.java | 31 - .../client/chart/chartjs/LineChart.java | 31 - .../client/chart/chartjs/PieChart.java | 31 - .../client/chart/chartjs/PolarAreaChart.java | 31 - .../client/chart/chartjs/RadarChart.java | 31 - .../client/chart/chartjs/ScatterChart.java | 31 - .../chart/chartjs/base/AbstractChart.java | 209 - .../chart/chartjs/base/HasChartFeatures.java | 115 - .../chart/chartjs/base/HasGlobalOptions.java | 37 - .../chartjs/base/constants/ChartType.java | 42 - .../client/chart/chartjs/js/Chart.java | 83 - .../client/chart/chartjs/js/ChartData.java | 35 - .../chartjs/js/datasets/BarChartDataSets.java | 67 - .../chartjs/js/datasets/BubbleDataSets.java | 64 - .../chartjs/js/datasets/ChartDataSets.java | 59 - .../chartjs/js/datasets/DoughnutDataSets.java | 49 - .../js/datasets/LineChartDataSets.java | 188 - .../chartjs/js/datasets/PolarDataSets.java | 49 - .../js/datasets/RadarChartDataSets.java | 88 - .../chartjs/js/datasets/ScatterDataSets.java | 91 - .../chartjs/js/options/GlobalOptions.java | 48 - .../chartjs/js/options/LineChartOptions.java | 40 - .../js/options/global/ChartOptions.java | 46 - .../js/options/global/ElementOptions.java | 28 - .../js/options/global/LabelOptions.java | 56 - .../js/options/global/LayoutOptions.java | 31 - .../js/options/global/LegendOptions.java | 55 - .../js/options/global/PaddingOptions.java | 40 - .../js/options/global/TitleOptions.java | 55 - .../client/keyboard/ScreenKeyboard.java | 7 +- .../events/HasScreenKeyboardHandlers.java | 2 +- .../client/keyboard/js/Keyboard.java | 5 + .../Driver.java} | 7 +- .../incubator/client/storage/LocalForage.java | 117 + .../LocalForageOptions.java} | 21 +- .../LocalStorageClientBundle.java} | 13 +- .../LocalStorageClientDebugBundle.java} | 13 +- .../chartjs/resources.js/Chart.bundle.js | 18755 ---------------- .../chartjs/resources.js/Chart.bundle.min.js | 10 - .../storage/resources/js/localforage.js | 2797 +++ .../storage/resources/js/localforage.min.js | 7 + 45 files changed, 2972 insertions(+), 20627 deletions(-) delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/BarChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/BubbleChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/DoughnutChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/LineChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/PieChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/PolarAreaChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/RadarChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/ScatterChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/AbstractChart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasChartFeatures.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasGlobalOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/constants/ChartType.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/Chart.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/ChartData.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BarChartDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BubbleDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ChartDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/DoughnutDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/LineChartDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/PolarDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/RadarChartDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ScatterDataSets.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/GlobalOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/LineChartOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ChartOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ElementOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LabelOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LayoutOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LegendOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/PaddingOptions.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TitleOptions.java rename src/main/java/gwt/material/design/incubator/client/{chart/chartjs/js/options/global/TooltipOptions.java => storage/Driver.java} (83%) create mode 100644 src/main/java/gwt/material/design/incubator/client/storage/LocalForage.java rename src/main/java/gwt/material/design/incubator/client/{chart/chartjs/js/options/global/AnimationOptions.java => storage/LocalForageOptions.java} (72%) rename src/main/java/gwt/material/design/incubator/client/{chart/chartjs/ChartClientBundle.java => storage/LocalStorageClientBundle.java} (69%) rename src/main/java/gwt/material/design/incubator/client/{chart/chartjs/ChartDebugClientBundle.java => storage/LocalStorageClientDebugBundle.java} (68%) delete mode 100644 src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.js delete mode 100644 src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.min.js create mode 100644 src/main/resources/gwt/material/design/incubator/client/storage/resources/js/localforage.js create mode 100644 src/main/resources/gwt/material/design/incubator/client/storage/resources/js/localforage.min.js diff --git a/README.md b/README.md index d7434b8ed..484206c02 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,21 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.2-rc1 +## Current Version 2.2 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.2-rc1 + 2.2 ``` -## Snapshot Version 2.2-SNAPSHOT +## Snapshot Version 2.3-SNAPSHOT ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.2-SNAPSHOT + 2.3-SNAPSHOT ``` diff --git a/pom.xml b/pom.xml index 1f7b05757..3443dc244 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.2-SNAPSHOT + 2.2 gwt-material-addins gwt-lib Gwt Material Addins - 2.2-SNAPSHOT + 2.2 Extra Components of GWT Material Framework - 2.2-SNAPSHOT + 2.2 scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.2-SNAPSHOT + v2.2 diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/BarChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/BarChart.java deleted file mode 100644 index f26d79698..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/BarChart.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.BarChartDataSets; - -/** - * A bar chart provides a way of showing data values represented as vertical bars. It is sometimes used to show trend - * data, and the comparison of multiple data sets side by side. - * - * @author kevzlou7979@gmail.com - */ -public class BarChart extends AbstractChart { - - public BarChart() { - super(ChartType.BAR); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/BubbleChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/BubbleChart.java deleted file mode 100644 index 8193975b0..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/BubbleChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.BarChartDataSets; - -public class BubbleChart extends AbstractChart { - - public BubbleChart() { - super(ChartType.RADAR); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/DoughnutChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/DoughnutChart.java deleted file mode 100644 index 3e109ae77..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/DoughnutChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.LineChartDataSets; - -public class DoughnutChart extends AbstractChart { - - public DoughnutChart() { - super(ChartType.LINE); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/LineChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/LineChart.java deleted file mode 100644 index 25a585638..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/LineChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.LineChartDataSets; - -public class LineChart extends AbstractChart { - - public LineChart() { - super(ChartType.LINE); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/PieChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/PieChart.java deleted file mode 100644 index 8c2c6a4c8..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/PieChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.BarChartDataSets; - -public class PieChart extends AbstractChart { - - public PieChart() { - super(ChartType.PIE); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/PolarAreaChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/PolarAreaChart.java deleted file mode 100644 index 51c6a3c4d..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/PolarAreaChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.LineChartDataSets; - -public class PolarAreaChart extends AbstractChart { - - public PolarAreaChart() { - super(ChartType.LINE); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/RadarChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/RadarChart.java deleted file mode 100644 index 1c4630ff1..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/RadarChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.BarChartDataSets; - -public class RadarChart extends AbstractChart { - - public RadarChart() { - super(ChartType.RADAR); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ScatterChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ScatterChart.java deleted file mode 100644 index 411a691c2..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ScatterChart.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs; - -import gwt.material.design.incubator.client.chart.chartjs.base.AbstractChart; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.BarChartDataSets; - -public class ScatterChart extends AbstractChart { - - public ScatterChart() { - super(ChartType.RADAR); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/AbstractChart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/AbstractChart.java deleted file mode 100644 index 6842def46..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/AbstractChart.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.base; - -import com.google.gwt.dom.client.Document; -import gwt.material.design.addins.client.MaterialAddins; -import gwt.material.design.client.MaterialDesign; -import gwt.material.design.client.base.JsLoader; -import gwt.material.design.client.base.MaterialWidget; -import gwt.material.design.incubator.client.chart.chartjs.ChartClientBundle; -import gwt.material.design.incubator.client.chart.chartjs.ChartDebugClientBundle; -import gwt.material.design.incubator.client.chart.chartjs.base.constants.ChartType; -import gwt.material.design.incubator.client.chart.chartjs.js.Chart; -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.ChartDataSets; -import gwt.material.design.incubator.client.chart.chartjs.js.options.GlobalOptions; -import gwt.material.design.incubator.client.chart.chartjs.js.options.global.*; -import gwt.material.design.jquery.client.api.Event; -import gwt.material.design.jscore.client.api.core.Element; - -import java.util.List; - -public class AbstractChart extends MaterialWidget implements JsLoader, HasChartFeatures { - - static { - if (MaterialAddins.isDebug()) { - MaterialDesign.injectDebugJs(ChartDebugClientBundle.INSTANCE.chartDebugJs()); - } else { - MaterialDesign.injectJs(ChartClientBundle.INSTANCE.chartJs()); - } - } - - private Chart chart; - private GlobalOptions globalOptions = GlobalOptions.create(); - - public AbstractChart(ChartType type) { - super(Document.get().createCanvasElement()); - globalOptions.type = type.getName(); - } - - @Override - protected void onLoad() { - super.onLoad(); - - load(); - } - - @Override - public void load() { - chart = new Chart(getElement(), globalOptions); - } - - @Override - protected void onUnload() { - super.onUnload(); - unload(); - } - - @Override - public void unload() { - chart.destroy(); - } - - @Override - public void reload() { - unload(); - load(); - } - - public String[] getLabels() { - return globalOptions.data.labels; - } - - public void setLabels(String... labels) { - globalOptions.data.labels = labels; - update(); - } - - public void setDatasets(T[] datasets) { - globalOptions.data.datasets = datasets; - update(); - } - - public T[] getDatasets() { - return (T[]) globalOptions.data.datasets; - } - - public void setDatasets(List datasets) { - setDatasets((T[]) datasets.toArray()); - } - - @Override - public void destroy() { - chart.destroy(); - } - - @Override - public void update() { - if (chart != null) { - chart.update(globalOptions); - } - } - - @Override - public void reset() { - chart.reset(); - } - - @Override - public void render(GlobalOptions options) { - chart.render(options); - } - - @Override - public void stop() { - chart.stop(); - } - - @Override - public void resize() { - chart.resize(); - } - - @Override - public String toBase64Image() { - return chart.toBase64Image(); - } - - @Override - public String generateLegend() { - return chart.generateLegend(); - } - - @Override - public Element getElementAtEvent(Event event) { - return chart.getElementAtEvent(event); - } - - @Override - public List getElementsAtEvent(Event event) { - return chart.getElementsAtEvent(event); - } - - @Override - public List getDatasetAtEvent(Event event) { - return chart.getDatasetAtEvent(event); - } - - @Override - public Object getDatasetMeta(int index) { - return chart.getDatasetMeta(index); - } - - public GlobalOptions getGlobalOptions() { - return globalOptions; - } - - @Override - public void setAnimationOptions(AnimationOptions animationOptions) { - globalOptions.options.animation = animationOptions; - update(); - } - - @Override - public void setLayoutOptions(LayoutOptions layoutOptions) { - globalOptions.options.layout = layoutOptions; - update(); - } - - @Override - public void setLegendOptions(LegendOptions legendOptions) { - globalOptions.options.legend = legendOptions; - update(); - } - - @Override - public void setTooltipOptions(TooltipOptions tooltipOptions) { - globalOptions.options.tooltip = tooltipOptions; - update(); - } - - @Override - public void setTitleOptions(TitleOptions titleOptions) { - globalOptions.options.title = titleOptions; - update(); - } - - @Override - public void setElementOptions(ElementOptions elementOptions) { - globalOptions.options.elements = elementOptions; - update(); - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasChartFeatures.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasChartFeatures.java deleted file mode 100644 index 8c200533f..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasChartFeatures.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.base; - -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.ChartDataSets; -import gwt.material.design.incubator.client.chart.chartjs.js.options.GlobalOptions; -import gwt.material.design.jquery.client.api.Event; -import gwt.material.design.jscore.client.api.core.Element; - -import java.util.List; - -public interface HasChartFeatures extends HasGlobalOptions { - - void setLabels(String... labels); - - void setDatasets(T[] datasets); - - /** - * Use this to destroy any chart instances that are created. This will clean up any references stored to - * the chart object within Chart.js, along with any associated event listeners attached by Chart.js. - * This must be called before the canvas is reused for a new chart. - */ - void destroy(); - - /** - * Triggers an update of the chart. This can be safely called after updating the data object. - * This will update all scales, legends, and then re-render the chart. - */ - void update(); - - /** - * Reset the chart to it's state before the initial animation. A new animation can then be triggered using update. - */ - void reset(); - - /** - * Triggers a redraw of all chart elements. Note, this does not update elements for new data. Use .update() in that case. - * See {@link #update(GlobalOptions)} for more details on the config object. - */ - void render(GlobalOptions options); - - /** - * Use this to stop any current animation loop. This will pause the chart during any current animation frame. - * Call .render() to re-animate. - */ - void stop(); - - /** - * Use this to manually resize the canvas element. This is run each time the canvas container is resized, - * but you can call this method manually if you change the size of the canvas nodes container element. - */ - void resize(); - - /** - * Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful. - */ - void clear(); - - /** - * This returns a base 64 encoded string of the chart in it's current state. - */ - String toBase64Image(); - - /** - * Returns an HTML string of a legend for that chart. The legend is generated from the legendCallback in the options. - */ - String generateLegend(); - - /** - * Calling getElementAtEvent(event) on your Chart instance passing an argument of an event, or jQuery event, - * will return the single element at the event position. If there are multiple items within range, only the first is returned. - * The value returned from this method is an array with a single parameter. An array is used to keep a consistent API between - * the get*AtEvent methods. - */ - Element getElementAtEvent(Event event); - - /** - * Looks for the element under the event point, then returns all elements at the same data index. This is used internally - * for 'label' mode highlighting.Calling getElementsAtEvent(event) on your Chart instance passing an argument of an event, - * or jQuery event, will return the point elements that are at that the same position of that event. - *

- * This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. - */ - List getElementsAtEvent(Event event); - - /** - * Looks for the element under the event point, then returns all elements from that dataset. - * This is used internally for 'dataset' mode highlighting - */ - List getDatasetAtEvent(Event event); - - /** - * Looks for the dataset that matches the current index and returns that metadata. - * This returned data has all of the metadata that is used to construct the chart. - * The data property of the metadata will contain information about each point, rectangle, etc. depending on the chart type. - */ - Object getDatasetMeta(int index); -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasGlobalOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasGlobalOptions.java deleted file mode 100644 index 76a53359a..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/HasGlobalOptions.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.base; - -import gwt.material.design.incubator.client.chart.chartjs.js.options.global.*; - -public interface HasGlobalOptions { - - void setAnimationOptions(AnimationOptions animationOptions); - - void setLayoutOptions(LayoutOptions layoutOptions); - - void setLegendOptions(LegendOptions legendOptions); - - void setTooltipOptions(TooltipOptions tooltipOptions); - - void setTitleOptions(TitleOptions titleOptions); - - void setElementOptions(ElementOptions elementOptions); -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/constants/ChartType.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/constants/ChartType.java deleted file mode 100644 index 779fbd54e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/base/constants/ChartType.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.base.constants; - -public enum ChartType { - - LINE("line"), - BAR("bar"), - RADAR("radar"), - PIE("pie"), - DOUGHNUT("doughnut"), - POLAR_AREA("polarArea"), - BUBBLE("bubble"), - SCATTER("scatter"); - - private final String name; - - ChartType(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/Chart.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/Chart.java deleted file mode 100644 index e3e2ed247..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/Chart.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js; - -import com.google.gwt.canvas.dom.client.Context2d; -import gwt.material.design.incubator.client.chart.chartjs.js.options.GlobalOptions; -import gwt.material.design.jquery.client.api.Event; -import gwt.material.design.jscore.client.api.core.Element; -import jsinterop.annotations.JsMethod; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsType; - -import java.util.List; - -/** - * JSInterop utils for ChartJs - * - * @author kevzlou7979@gmail.com - * @see ChartJs API - */ -@JsType(isNative = true, namespace = JsPackage.GLOBAL) -public class Chart { - - public Chart(Context2d context, GlobalOptions options) {} - - public Chart(com.google.gwt.dom.client.Element element, GlobalOptions options) {} - - @JsMethod - public native void destroy(); - - @JsMethod - public native void update(GlobalOptions options); - - @JsMethod - public native void reset(); - - @JsMethod - public native void render(GlobalOptions options); - - @JsMethod - public native void stop(); - - @JsMethod - public native void resize(); - - @JsMethod - public native void clear(); - - @JsMethod - public native String toBase64Image(); - - @JsMethod - public native String generateLegend(); - - @JsMethod - public native Element getElementAtEvent(Event event); - - @JsMethod - public native List getElementsAtEvent(Event event); - - @JsMethod - public native List getDatasetAtEvent(Event event); - - @JsMethod - public native Object getDatasetMeta(int index); -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/ChartData.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/ChartData.java deleted file mode 100644 index 63b7dfa27..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/ChartData.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js; - -import gwt.material.design.incubator.client.chart.chartjs.js.datasets.ChartDataSets; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class ChartData { - - @JsProperty - public String[] labels; - - @JsProperty - public ChartDataSets[] datasets; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BarChartDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BarChartDataSets.java deleted file mode 100644 index c96cdf5ca..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BarChartDataSets.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsIgnore; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class BarChartDataSets extends ChartDataSets { - - @JsProperty - public String label; - - @JsProperty - public String xAxisID; - - @JsProperty - public String yAxisID; - - @JsProperty - public String backgroundColor; - - @JsProperty - public String borderColor; - - @JsProperty - public int borderWidth; - - @JsProperty - public String borderSkipped; - - @JsProperty - public String hoverBackgroundColor; - - @JsProperty - public String hoverBorderColor; - - @JsProperty - public int hoverBorderWidth; - - @JsProperty - public Object[] data; - - @JsIgnore - public void setLabel(String label) { - this.label = label; - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BubbleDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BubbleDataSets.java deleted file mode 100644 index 5f4e0f830..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/BubbleDataSets.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class BubbleDataSets extends ChartDataSets { - - @JsProperty - public String label; - - @JsProperty - public String backgroundColor; - - @JsProperty - public String borderColor; - - @JsProperty - public int[] borderWidth; - - @JsProperty - public Object[] data; - - @JsProperty - public String hoverBackgroundColor; - - @JsProperty - public String hoverBorderColor; - - @JsProperty - public int hoverBorderWidth; - - @JsProperty - public int hoverRadius; - - @JsProperty - public int hitRadius; - - @JsProperty - public String pointStyle; - - @JsProperty - private int radius; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ChartDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ChartDataSets.java deleted file mode 100644 index 5189f6a64..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ChartDataSets.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class ChartDataSets { - - @JsProperty - private String label; - - @JsProperty - private Object[] data; - - @JsOverlay - public final String getLabel() { - return label; - } - - /** - * The label for the dataset which appears in the legend and tooltips. - */ - @JsOverlay - public void setLabel(String label) { - this.label = label; - } - - @JsOverlay - public final Object[] getData() { - return data; - } - - @JsOverlay - public final void setData(Object... data) { - this.data = data; - } - -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/DoughnutDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/DoughnutDataSets.java deleted file mode 100644 index 410f274be..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/DoughnutDataSets.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class DoughnutDataSets extends ChartDataSets { - - @JsProperty - public String label; - - @JsProperty - public String[] backgroundColor; - - @JsProperty - public String[] borderColor; - - @JsProperty - public int[] borderWidth; - - @JsProperty - public String[] hoverBackgroundColor; - - @JsProperty - public String[] hoverBorderColor; - - @JsProperty - public int[] hoverBorderWidth; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/LineChartDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/LineChartDataSets.java deleted file mode 100644 index 98db6e3df..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/LineChartDataSets.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -/** - * The line chart allows a number of properties to be specified for each dataset. These are used to set display - * properties for a specific dataset. For example, the colour of a line is generally set this way. - * All point* properties can be specified as an array. If these are set to an array value, the first - * value applies to the first point, the second value to the second point, and so on. - * - * @author kevzlou7979@gmail.com - */ -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class LineChartDataSets extends ChartDataSets { - - /** - * The ID of the x axis to plot this dataset on. If not specified, this defaults to the ID of the first found x axis - */ - @JsProperty - public String xAxisID; - - /** - * The ID of the y axis to plot this dataset on. If not specified, this defaults to the ID of the first found y axis. - */ - @JsProperty - public String yAxisID; - - /** - * The fill color under the line. - */ - @JsProperty - public String backgroundColor; - - /** - * The color of the line. - */ - @JsProperty - public String borderColor; - - /** - * The width of the line in pixels. - */ - @JsProperty - public int borderWidth; - - /** - * Length and spacing of dashes. - */ - @JsProperty - public int[] borderDash; - - /** - * Offset for line dashes. - */ - @JsProperty - public int borderDashOffset; - - /** - * Cap style of the line. - */ - @JsProperty - public String borderCapStyle; - - /** - * Line joint style. - */ - @JsProperty - public String borderJoinStyle; - - /** - * Algorithm used to interpolate a smooth curve from the discrete data points. - */ - @JsProperty - public String cubicInterpolationMode; - - /** - * How to fill the area under the line. - */ - @JsProperty - public Object fill; - - /** - * Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic - * interpolation is used. - */ - @JsProperty - public int lineTension; - - /** - * The fill color for points. - */ - @JsProperty - public String pointBackgroundColor; - - /** - * The border color for points. - */ - @JsProperty - public String pointBorderColor; - - /** - * The width of the point border in pixels. - */ - @JsProperty - public int pointBorderWidth; - - /** - * The radius of the point shape. If set to 0, the point is not rendered. - */ - @JsProperty - public int pointRadius; - - /** - * Style of the point. - */ - @JsProperty - public String pointStyle; - - /** - * The pixel size of the non-displayed point that reacts to mouse events. - */ - @JsProperty - public int pointHitRadius; - - /** - * Point background color when hovered. - */ - @JsProperty - public String pointHoverBackgroundColor; - - /** - * Point border color when hovered. - */ - @JsProperty - public String pointHoverBorderColor; - - /** - * Border width of point when hovered. - */ - @JsProperty - public int pointHoverBorderWidth; - - /** - * The radius of the point when hovered. - */ - @JsProperty - public int pointHoverRadius; - - /** - * If false, the line is not drawn for this dataset. - */ - @JsProperty - public boolean showLine; - - /** - * If true, lines will be drawn between points with no or null data. If false, points with NaN data will create a - * break in the line - */ - @JsProperty - public boolean spanGaps; - - /** - * If the line is shown as a stepped line. - */ - @JsProperty - public Object steppedLine; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/PolarDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/PolarDataSets.java deleted file mode 100644 index 1a20c685e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/PolarDataSets.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class PolarDataSets extends ChartDataSets { - - @JsProperty - public String label; - - @JsProperty - public String[] backgroundColor; - - @JsProperty - public String[] borderColor; - - @JsProperty - public int[] borderWidth; - - @JsProperty - public String[] hoverBackgroundColor; - - @JsProperty - public String[] hoverBorderColor; - - @JsProperty - public int[] hoverBorderWidth; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/RadarChartDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/RadarChartDataSets.java deleted file mode 100644 index b1b94163e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/RadarChartDataSets.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class RadarChartDataSets extends ChartDataSets { - - @JsProperty - public String label; - - @JsProperty - public String backgroundColor; - - @JsProperty - public String borderColor; - - @JsProperty - public int borderWidth; - - @JsProperty - public int[] borderDash; - - @JsProperty - public int borderDashOffset; - - @JsProperty - public String borderCapStyle; - - @JsProperty - public String borderJoinStyle; - - @JsProperty - public String fill; - - @JsProperty - public int lineTension; - - @JsProperty - public String[] pointBackgroundColor; - - @JsProperty - public String[] pointBorderColor; - - @JsProperty - public int[] pointBorderWidth; - - @JsProperty - public int[] pointRadius; - - @JsProperty - public String[] pointStyle; - - @JsProperty - public int[] pointHitRadius; - - @JsProperty - public String[] pointHoverBackgroundColor; - - @JsProperty - public String[] pointHoverBorderColor; - - @JsProperty - public int[] pointHoverBorderWidth; - - @JsProperty - public int[] pointHoverRadius; -} \ No newline at end of file diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ScatterDataSets.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ScatterDataSets.java deleted file mode 100644 index 85c8fe0ea..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/datasets/ScatterDataSets.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.datasets; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class ScatterDataSets extends ChartDataSets { - - @JsProperty - public String label; - - @JsProperty - public String xAxisID; - - @JsProperty - public String yAxisID; - - @JsProperty - public String backgroundColor; - - @JsProperty - public String borderColor; - - @JsProperty - public int borderWidth; - - @JsProperty - public int[] borderDash; - - @JsProperty - public int borderDashOffset; - - @JsProperty - public String borderCapStyle; - - @JsProperty - public String borderJoinStyle; - - @JsProperty - public String cubicInterpolationMode; - - @JsProperty - public String fill; - - @JsProperty - public int lineTension; - - @JsProperty - public String pointBackgroundColor; - - @JsProperty - public String pointBorderColor; - - @JsProperty - public int pointHoverBorderWidth; - - @JsProperty - public int pointHoverRadius; - - @JsProperty - public boolean showLine; - - @JsProperty - public boolean spanGaps; - - @JsProperty - public String steppedLine; - - @JsProperty - public Object[] data; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/GlobalOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/GlobalOptions.java deleted file mode 100644 index 667df6b1e..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/GlobalOptions.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options; - -import gwt.material.design.incubator.client.chart.chartjs.js.ChartData; -import gwt.material.design.incubator.client.chart.chartjs.js.options.global.ChartOptions; -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class GlobalOptions { - - @JsProperty - public String type; - @JsProperty - public ChartData data; - @JsProperty - public ChartOptions options; - - private GlobalOptions() {} - - @JsOverlay - public final static GlobalOptions create() { - GlobalOptions globalOptions = new GlobalOptions(); - globalOptions.data = new ChartData(); - globalOptions.options = new ChartOptions(); - return globalOptions; - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/LineChartOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/LineChartOptions.java deleted file mode 100644 index 5ccf5acb2..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/LineChartOptions.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class LineChartOptions { - - /** - * If false, the lines between points are not drawn. (Default: true) - */ - @JsProperty - public boolean showLines; - - /** - * If false, the lines between points are not drawn. (Default: false) - */ - @JsProperty - public boolean spanGaps; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ChartOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ChartOptions.java deleted file mode 100644 index f94256f3f..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ChartOptions.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class ChartOptions { - - @JsProperty - public AnimationOptions animation; - - @JsProperty - public LayoutOptions layout; - - @JsProperty - public LegendOptions legend; - - @JsProperty - public TitleOptions title; - - @JsProperty - public TooltipOptions tooltip; - - @JsProperty - public ElementOptions elements; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ElementOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ElementOptions.java deleted file mode 100644 index 0b45720cc..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/ElementOptions.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class ElementOptions { - -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LabelOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LabelOptions.java deleted file mode 100644 index 9e4555ef8..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LabelOptions.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import gwt.material.design.jquery.client.api.Functions; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class LabelOptions { - - @JsProperty - public int boxWidth; - - @JsProperty - public int fontSize; - - @JsProperty - public String fontStyle; - - @JsProperty - public String fontColor; - - @JsProperty - public String fontFamily; - - @JsProperty - public int padding; - - @JsProperty - public Functions.Func generateLabels; - - @JsProperty - public Functions.Func filter; - - @JsProperty - public boolean usePointStyle; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LayoutOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LayoutOptions.java deleted file mode 100644 index 829270d72..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LayoutOptions.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class LayoutOptions { - - @JsProperty - public PaddingOptions padding; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LegendOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LegendOptions.java deleted file mode 100644 index 62e3a4523..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/LegendOptions.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import gwt.material.design.jquery.client.api.Functions; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -/** - * The chart legend displays data about the datasets that area appearing on the chart. - * - * @author kevzlou7979@gmail.com - */ -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class LegendOptions { - - @JsProperty - public boolean display; - - @JsProperty - public String position; - - @JsProperty - public boolean fullWidth; - - @JsProperty - public Functions.Func onClick; - - @JsProperty - public Functions.Func onHover; - - @JsProperty - public boolean reverse; - - @JsProperty - public LabelOptions labels; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/PaddingOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/PaddingOptions.java deleted file mode 100644 index 08fccf228..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/PaddingOptions.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class PaddingOptions { - - @JsProperty - public int left; - - @JsProperty - public int right; - - @JsProperty - public int top; - - @JsProperty - public int bottom; -} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TitleOptions.java b/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TitleOptions.java deleted file mode 100644 index 3f13e0c4b..000000000 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TitleOptions.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; - -@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class TitleOptions { - - @JsProperty - public boolean display; - - @JsProperty - public String position; - - @JsProperty - public int fontSize; - - @JsProperty - public String fontFamily; - - @JsProperty - public String fontColor; - - @JsProperty - public String fontStyle; - - @JsProperty - public int padding; - - @JsProperty - public String lineHeight; - - @JsProperty - public String text; -} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java index 1e8b889ae..bd8af53ff 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java @@ -20,6 +20,7 @@ package gwt.material.design.incubator.client.keyboard; import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; import com.google.gwt.event.shared.HandlerRegistration; import gwt.material.design.client.MaterialDesign; import gwt.material.design.client.base.MaterialWidget; @@ -209,8 +210,12 @@ public void setShiftBinding(KeyBinder shiftBinding) { this.shiftBinding = shiftBinding; } + public Element getKeyboardDOM() { + return keyboard.keyboardDOM; + } + @Override - public HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler) { + public HandlerRegistration addKeyboardPressHandler(KeyPressEvent.KeyPressHandler handler) { return addHandler(handler, KeyPressEvent.getType()); } diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java index 536937926..c8b81e5b3 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/HasScreenKeyboardHandlers.java @@ -26,7 +26,7 @@ public interface HasScreenKeyboardHandlers { /** * Executes the callback function on key press. Returns button layout name (i.e.: “{shift}”). */ - HandlerRegistration addKeyPressHandler(KeyPressEvent.KeyPressHandler handler); + HandlerRegistration addKeyboardPressHandler(KeyPressEvent.KeyPressHandler handler); /** * Executes the callback function on input change. Returns the current input’s string. diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java index 412777a9d..acf77ccf1 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/Keyboard.java @@ -19,9 +19,11 @@ */ package gwt.material.design.incubator.client.keyboard.js; +import com.google.gwt.dom.client.Element; import gwt.material.design.jquery.client.api.Functions; import jsinterop.annotations.JsMethod; import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; /** @@ -39,6 +41,9 @@ protected Keyboard() { public Keyboard(KeyboardOptions options) { } + @JsProperty + public Element keyboardDOM; + /** * Clear the keyboard’s input. */ diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TooltipOptions.java b/src/main/java/gwt/material/design/incubator/client/storage/Driver.java similarity index 83% rename from src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TooltipOptions.java rename to src/main/java/gwt/material/design/incubator/client/storage/Driver.java index 2a61eb583..c126bfda4 100644 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/TooltipOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/storage/Driver.java @@ -2,7 +2,7 @@ * #%L * GwtMaterial * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign + * Copyright (C) 2015 - 2019 GwtMaterialDesign * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,13 @@ * limitations under the License. * #L% */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; +package gwt.material.design.incubator.client.storage; + import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsType; @JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class TooltipOptions { +public class Driver { } diff --git a/src/main/java/gwt/material/design/incubator/client/storage/LocalForage.java b/src/main/java/gwt/material/design/incubator/client/storage/LocalForage.java new file mode 100644 index 000000000..309e17d98 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/storage/LocalForage.java @@ -0,0 +1,117 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.storage; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jquery.client.api.Promise; +import jsinterop.annotations.*; + +@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "localforage") +public class LocalForage { + + @JsProperty + public Driver LOCALSTORAGE; + + @JsProperty + public Driver WEBSQL; + + @JsProperty + public Driver INDEXEDDB; + + /** + * Data Api + **/ + + @JsMethod + public static native Promise getItem(String key); + + @JsMethod + public static native Promise setItem(String key, Object value); + + @JsMethod + public static native Promise clear(); + + @JsMethod + public static native Promise length(); + + @JsMethod + public static native Promise removeItem(String key); + + @JsMethod + public static native Promise key(int index); + + @JsMethod + public static native Promise keys(); + + @JsMethod + public static native Promise iterate(Functions.Func3 callback); + + /** + * Settings Api + */ + + @JsMethod + public native static void setDriver(Driver driver); + + @JsMethod + public native static void setDriver(Driver[] drivers); + + @JsMethod + public native static void config(LocalForageOptions options); + + /** + * Driver Api + */ + + @JsMethod + public static native void defineDriver(Object object); + + @JsMethod + public static native void Driver(); + + @JsMethod + public static native Promise ready(); + + @JsMethod + public static native boolean supports(Driver driver); + + /** + * Create Instance + */ + @JsMethod + public static native LocalForage createInstance(LocalForageOptions options); + + @JsMethod + public static native void dropInstance(); + + @JsMethod + public static native void dropInstance(LocalForageOptions options); + + @JsOverlay + public static final void injectResource() { + if (MaterialAddins.isDebug()) { + MaterialDesignBase.injectDebugJs(LocalStorageClientDebugBundle.INSTANCE.localForageDebugJs()); + } else { + MaterialDesignBase.injectJs(LocalStorageClientBundle.INSTANCE.localForage()); + } + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/AnimationOptions.java b/src/main/java/gwt/material/design/incubator/client/storage/LocalForageOptions.java similarity index 72% rename from src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/AnimationOptions.java rename to src/main/java/gwt/material/design/incubator/client/storage/LocalForageOptions.java index eb1e98ea7..9b4458d54 100644 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/js/options/global/AnimationOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/storage/LocalForageOptions.java @@ -2,7 +2,7 @@ * #%L * GwtMaterial * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign + * Copyright (C) 2015 - 2019 GwtMaterialDesign * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,25 +17,30 @@ * limitations under the License. * #L% */ -package gwt.material.design.incubator.client.chart.chartjs.js.options.global; +package gwt.material.design.incubator.client.storage; -import gwt.material.design.jquery.client.api.Functions; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; @JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) -public class AnimationOptions { +public class LocalForageOptions { @JsProperty - int duration; + public Driver driver; @JsProperty - String easing; + public String name; @JsProperty - Functions.Func onProgress; + public int size; @JsProperty - Functions.Func onComplete; + public String storeName; + + @JsProperty + public double version; + + @JsProperty + public String description; } diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ChartClientBundle.java b/src/main/java/gwt/material/design/incubator/client/storage/LocalStorageClientBundle.java similarity index 69% rename from src/main/java/gwt/material/design/incubator/client/chart/chartjs/ChartClientBundle.java rename to src/main/java/gwt/material/design/incubator/client/storage/LocalStorageClientBundle.java index f40c3c202..cada97ec2 100644 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ChartClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/storage/LocalStorageClientBundle.java @@ -2,7 +2,7 @@ * #%L * GwtMaterial * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign + * Copyright (C) 2015 - 2019 GwtMaterialDesign * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,15 +17,16 @@ * limitations under the License. * #L% */ -package gwt.material.design.incubator.client.chart.chartjs; +package gwt.material.design.incubator.client.storage; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.TextResource; -public interface ChartClientBundle extends ClientBundle { - ChartClientBundle INSTANCE = GWT.create(ChartClientBundle.class); +public interface LocalStorageClientBundle extends ClientBundle { - @Source("resources/js/Chart.bundle.min.js") - TextResource chartJs(); + LocalStorageClientBundle INSTANCE = GWT.create(LocalStorageClientBundle.class); + + @Source("resources/js/localforage.min.js") + TextResource localForage(); } diff --git a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ChartDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/storage/LocalStorageClientDebugBundle.java similarity index 68% rename from src/main/java/gwt/material/design/incubator/client/chart/chartjs/ChartDebugClientBundle.java rename to src/main/java/gwt/material/design/incubator/client/storage/LocalStorageClientDebugBundle.java index 2a133ad0e..562a3de25 100644 --- a/src/main/java/gwt/material/design/incubator/client/chart/chartjs/ChartDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/storage/LocalStorageClientDebugBundle.java @@ -2,7 +2,7 @@ * #%L * GwtMaterial * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign + * Copyright (C) 2015 - 2019 GwtMaterialDesign * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,15 +17,16 @@ * limitations under the License. * #L% */ -package gwt.material.design.incubator.client.chart.chartjs; +package gwt.material.design.incubator.client.storage; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.TextResource; -public interface ChartDebugClientBundle extends ClientBundle { - ChartDebugClientBundle INSTANCE = GWT.create(ChartDebugClientBundle.class); +public interface LocalStorageClientDebugBundle extends ClientBundle { - @Source("resources/js/Chart.bundle.js") - TextResource chartDebugJs(); + LocalStorageClientDebugBundle INSTANCE = GWT.create(LocalStorageClientDebugBundle.class); + + @Source("resources/js/localforage.js") + TextResource localForageDebugJs(); } diff --git a/src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.js b/src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.js deleted file mode 100644 index 04932c91a..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.js +++ /dev/null @@ -1,18755 +0,0 @@ -/*! - * Chart.js - * http://chartjs.org/ - * Version: 2.7.1 - * - * Copyright 2017 Nick Downie - * Released under the MIT license - * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md - */ -(function (f) { - if (typeof exports === "object" && typeof module !== "undefined") { - module.exports = f() - } else if (typeof define === "function" && define.amd) { - define([], f) - } else { - var g; - if (typeof window !== "undefined") { - g = window - } else if (typeof global !== "undefined") { - g = global - } else if (typeof self !== "undefined") { - g = self - } else { - g = this - } - g.Chart = f() - } -})(function () { - var define, module, exports; - return (function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require; - if (!u && a) return a(o, !0); - if (i) return i(o, !0); - var f = new Error("Cannot find module '" + o + "'"); - throw f.code = "MODULE_NOT_FOUND", f - } - var l = n[o] = {exports: {}}; - t[o][0].call(l.exports, function (e) { - var n = t[o][1][e]; - return s(n ? n : e) - }, l, l.exports, e, t, n, r) - } - return n[o].exports - } - - var i = typeof require == "function" && require; - for (var o = 0; o < r.length; o++) s(r[o]); - return s - })({ - 1: [function (require, module, exports) { - /* MIT license */ - var colorNames = require(5); - - module.exports = { - getRgba: getRgba, - getHsla: getHsla, - getRgb: getRgb, - getHsl: getHsl, - getHwb: getHwb, - getAlpha: getAlpha, - - hexString: hexString, - rgbString: rgbString, - rgbaString: rgbaString, - percentString: percentString, - percentaString: percentaString, - hslString: hslString, - hslaString: hslaString, - hwbString: hwbString, - keyword: keyword - } - - function getRgba(string) { - if (!string) { - return; - } - var abbr = /^#([a-fA-F0-9]{3})$/i, - hex = /^#([a-fA-F0-9]{6})$/i, - rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, - keyword = /(\w+)/; - - var rgb = [0, 0, 0], - a = 1, - match = string.match(abbr); - if (match) { - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i] + match[i], 16); - } - } - else if (match = string.match(hex)) { - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); - } - } - else if (match = string.match(rgba)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i + 1]); - } - a = parseFloat(match[4]); - } - else if (match = string.match(per)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); - } - a = parseFloat(match[4]); - } - else if (match = string.match(keyword)) { - if (match[1] == "transparent") { - return [0, 0, 0, 0]; - } - rgb = colorNames[match[1]]; - if (!rgb) { - return; - } - } - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = scale(rgb[i], 0, 255); - } - if (!a && a != 0) { - a = 1; - } - else { - a = scale(a, 0, 1); - } - rgb[3] = a; - return rgb; - } - - function getHsla(string) { - if (!string) { - return; - } - var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hsl); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - s = scale(parseFloat(match[2]), 0, 100), - l = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, s, l, a]; - } - } - - function getHwb(string) { - if (!string) { - return; - } - var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hwb); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - w = scale(parseFloat(match[2]), 0, 100), - b = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, w, b, a]; - } - } - - function getRgb(string) { - var rgba = getRgba(string); - return rgba && rgba.slice(0, 3); - } - - function getHsl(string) { - var hsla = getHsla(string); - return hsla && hsla.slice(0, 3); - } - - function getAlpha(string) { - var vals = getRgba(string); - if (vals) { - return vals[3]; - } - else if (vals = getHsla(string)) { - return vals[3]; - } - else if (vals = getHwb(string)) { - return vals[3]; - } - } - -// generators - function hexString(rgb) { - return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1]) - + hexDouble(rgb[2]); - } - - function rgbString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return rgbaString(rgba, alpha); - } - return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; - } - - function rgbaString(rgba, alpha) { - if (alpha === undefined) { - alpha = (rgba[3] !== undefined ? rgba[3] : 1); - } - return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] - + ", " + alpha + ")"; - } - - function percentString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return percentaString(rgba, alpha); - } - var r = Math.round(rgba[0] / 255 * 100), - g = Math.round(rgba[1] / 255 * 100), - b = Math.round(rgba[2] / 255 * 100); - - return "rgb(" + r + "%, " + g + "%, " + b + "%)"; - } - - function percentaString(rgba, alpha) { - var r = Math.round(rgba[0] / 255 * 100), - g = Math.round(rgba[1] / 255 * 100), - b = Math.round(rgba[2] / 255 * 100); - return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; - } - - function hslString(hsla, alpha) { - if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { - return hslaString(hsla, alpha); - } - return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; - } - - function hslaString(hsla, alpha) { - if (alpha === undefined) { - alpha = (hsla[3] !== undefined ? hsla[3] : 1); - } - return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " - + alpha + ")"; - } - -// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax -// (hwb have alpha optional & 1 is default value) - function hwbString(hwb, alpha) { - if (alpha === undefined) { - alpha = (hwb[3] !== undefined ? hwb[3] : 1); - } - return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" - + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; - } - - function keyword(rgb) { - return reverseNames[rgb.slice(0, 3)]; - } - -// helpers - function scale(num, min, max) { - return Math.min(Math.max(min, num), max); - } - - function hexDouble(num) { - var str = num.toString(16).toUpperCase(); - return (str.length < 2) ? "0" + str : str; - } - - -//create a list of reverse color names - var reverseNames = {}; - for (var name in colorNames) { - reverseNames[colorNames[name]] = name; - } - - }, {"5": 5}], 2: [function (require, module, exports) { - /* MIT license */ - var convert = require(4); - var string = require(1); - - var Color = function (obj) { - if (obj instanceof Color) { - return obj; - } - if (!(this instanceof Color)) { - return new Color(obj); - } - - this.valid = false; - this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - }; - - // parse Color() argument - var vals; - if (typeof obj === 'string') { - vals = string.getRgba(obj); - if (vals) { - this.setValues('rgb', vals); - } else if (vals = string.getHsla(obj)) { - this.setValues('hsl', vals); - } else if (vals = string.getHwb(obj)) { - this.setValues('hwb', vals); - } - } else if (typeof obj === 'object') { - vals = obj; - if (vals.r !== undefined || vals.red !== undefined) { - this.setValues('rgb', vals); - } else if (vals.l !== undefined || vals.lightness !== undefined) { - this.setValues('hsl', vals); - } else if (vals.v !== undefined || vals.value !== undefined) { - this.setValues('hsv', vals); - } else if (vals.w !== undefined || vals.whiteness !== undefined) { - this.setValues('hwb', vals); - } else if (vals.c !== undefined || vals.cyan !== undefined) { - this.setValues('cmyk', vals); - } - } - }; - - Color.prototype = { - isValid: function () { - return this.valid; - }, - rgb: function () { - return this.setSpace('rgb', arguments); - }, - hsl: function () { - return this.setSpace('hsl', arguments); - }, - hsv: function () { - return this.setSpace('hsv', arguments); - }, - hwb: function () { - return this.setSpace('hwb', arguments); - }, - cmyk: function () { - return this.setSpace('cmyk', arguments); - }, - - rgbArray: function () { - return this.values.rgb; - }, - hslArray: function () { - return this.values.hsl; - }, - hsvArray: function () { - return this.values.hsv; - }, - hwbArray: function () { - var values = this.values; - if (values.alpha !== 1) { - return values.hwb.concat([values.alpha]); - } - return values.hwb; - }, - cmykArray: function () { - return this.values.cmyk; - }, - rgbaArray: function () { - var values = this.values; - return values.rgb.concat([values.alpha]); - }, - hslaArray: function () { - var values = this.values; - return values.hsl.concat([values.alpha]); - }, - alpha: function (val) { - if (val === undefined) { - return this.values.alpha; - } - this.setValues('alpha', val); - return this; - }, - - red: function (val) { - return this.setChannel('rgb', 0, val); - }, - green: function (val) { - return this.setChannel('rgb', 1, val); - }, - blue: function (val) { - return this.setChannel('rgb', 2, val); - }, - hue: function (val) { - if (val) { - val %= 360; - val = val < 0 ? 360 + val : val; - } - return this.setChannel('hsl', 0, val); - }, - saturation: function (val) { - return this.setChannel('hsl', 1, val); - }, - lightness: function (val) { - return this.setChannel('hsl', 2, val); - }, - saturationv: function (val) { - return this.setChannel('hsv', 1, val); - }, - whiteness: function (val) { - return this.setChannel('hwb', 1, val); - }, - blackness: function (val) { - return this.setChannel('hwb', 2, val); - }, - value: function (val) { - return this.setChannel('hsv', 2, val); - }, - cyan: function (val) { - return this.setChannel('cmyk', 0, val); - }, - magenta: function (val) { - return this.setChannel('cmyk', 1, val); - }, - yellow: function (val) { - return this.setChannel('cmyk', 2, val); - }, - black: function (val) { - return this.setChannel('cmyk', 3, val); - }, - - hexString: function () { - return string.hexString(this.values.rgb); - }, - rgbString: function () { - return string.rgbString(this.values.rgb, this.values.alpha); - }, - rgbaString: function () { - return string.rgbaString(this.values.rgb, this.values.alpha); - }, - percentString: function () { - return string.percentString(this.values.rgb, this.values.alpha); - }, - hslString: function () { - return string.hslString(this.values.hsl, this.values.alpha); - }, - hslaString: function () { - return string.hslaString(this.values.hsl, this.values.alpha); - }, - hwbString: function () { - return string.hwbString(this.values.hwb, this.values.alpha); - }, - keyword: function () { - return string.keyword(this.values.rgb, this.values.alpha); - }, - - rgbNumber: function () { - var rgb = this.values.rgb; - return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - }, - - luminosity: function () { - // http://www.w3.org/TR/WCAG20/#relativeluminancedef - var rgb = this.values.rgb; - var lum = []; - for (var i = 0; i < rgb.length; i++) { - var chan = rgb[i] / 255; - lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); - } - return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; - }, - - contrast: function (color2) { - // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - var lum1 = this.luminosity(); - var lum2 = color2.luminosity(); - if (lum1 > lum2) { - return (lum1 + 0.05) / (lum2 + 0.05); - } - return (lum2 + 0.05) / (lum1 + 0.05); - }, - - level: function (color2) { - var contrastRatio = this.contrast(color2); - if (contrastRatio >= 7.1) { - return 'AAA'; - } - - return (contrastRatio >= 4.5) ? 'AA' : ''; - }, - - dark: function () { - // YIQ equation from http://24ways.org/2010/calculating-color-contrast - var rgb = this.values.rgb; - var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; - return yiq < 128; - }, - - light: function () { - return !this.dark(); - }, - - negate: function () { - var rgb = []; - for (var i = 0; i < 3; i++) { - rgb[i] = 255 - this.values.rgb[i]; - } - this.setValues('rgb', rgb); - return this; - }, - - lighten: function (ratio) { - var hsl = this.values.hsl; - hsl[2] += hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - darken: function (ratio) { - var hsl = this.values.hsl; - hsl[2] -= hsl[2] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - saturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] += hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - desaturate: function (ratio) { - var hsl = this.values.hsl; - hsl[1] -= hsl[1] * ratio; - this.setValues('hsl', hsl); - return this; - }, - - whiten: function (ratio) { - var hwb = this.values.hwb; - hwb[1] += hwb[1] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - blacken: function (ratio) { - var hwb = this.values.hwb; - hwb[2] += hwb[2] * ratio; - this.setValues('hwb', hwb); - return this; - }, - - greyscale: function () { - var rgb = this.values.rgb; - // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; - this.setValues('rgb', [val, val, val]); - return this; - }, - - clearer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha - (alpha * ratio)); - return this; - }, - - opaquer: function (ratio) { - var alpha = this.values.alpha; - this.setValues('alpha', alpha + (alpha * ratio)); - return this; - }, - - rotate: function (degrees) { - var hsl = this.values.hsl; - var hue = (hsl[0] + degrees) % 360; - hsl[0] = hue < 0 ? 360 + hue : hue; - this.setValues('hsl', hsl); - return this; - }, - - /** - * Ported from sass implementation in C - * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 - */ - mix: function (mixinColor, weight) { - var color1 = this; - var color2 = mixinColor; - var p = weight === undefined ? 0.5 : weight; - - var w = 2 * p - 1; - var a = color1.alpha() - color2.alpha(); - - var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; - var w2 = 1 - w1; - - return this - .rgb( - w1 * color1.red() + w2 * color2.red(), - w1 * color1.green() + w2 * color2.green(), - w1 * color1.blue() + w2 * color2.blue() - ) - .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); - }, - - toJSON: function () { - return this.rgb(); - }, - - clone: function () { - // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, - // making the final build way to big to embed in Chart.js. So let's do it manually, - // assuming that values to clone are 1 dimension arrays containing only numbers, - // except 'alpha' which is a number. - var result = new Color(); - var source = this.values; - var target = result.values; - var value, type; - - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - value = source[prop]; - type = ({}).toString.call(value); - if (type === '[object Array]') { - target[prop] = value.slice(0); - } else if (type === '[object Number]') { - target[prop] = value; - } else { - console.error('unexpected color value:', value); - } - } - } - - return result; - } - }; - - Color.prototype.spaces = { - rgb: ['red', 'green', 'blue'], - hsl: ['hue', 'saturation', 'lightness'], - hsv: ['hue', 'saturation', 'value'], - hwb: ['hue', 'whiteness', 'blackness'], - cmyk: ['cyan', 'magenta', 'yellow', 'black'] - }; - - Color.prototype.maxes = { - rgb: [255, 255, 255], - hsl: [360, 100, 100], - hsv: [360, 100, 100], - hwb: [360, 100, 100], - cmyk: [100, 100, 100, 100] - }; - - Color.prototype.getValues = function (space) { - var values = this.values; - var vals = {}; - - for (var i = 0; i < space.length; i++) { - vals[space.charAt(i)] = values[space][i]; - } - - if (values.alpha !== 1) { - vals.a = values.alpha; - } - - // {r: 255, g: 255, b: 255, a: 0.4} - return vals; - }; - - Color.prototype.setValues = function (space, vals) { - var values = this.values; - var spaces = this.spaces; - var maxes = this.maxes; - var alpha = 1; - var i; - - this.valid = true; - - if (space === 'alpha') { - alpha = vals; - } else if (vals.length) { - // [10, 10, 10] - values[space] = vals.slice(0, space.length); - alpha = vals[space.length]; - } else if (vals[space.charAt(0)] !== undefined) { - // {r: 10, g: 10, b: 10} - for (i = 0; i < space.length; i++) { - values[space][i] = vals[space.charAt(i)]; - } - - alpha = vals.a; - } else if (vals[spaces[space][0]] !== undefined) { - // {red: 10, green: 10, blue: 10} - var chans = spaces[space]; - - for (i = 0; i < space.length; i++) { - values[space][i] = vals[chans[i]]; - } - - alpha = vals.alpha; - } - - values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); - - if (space === 'alpha') { - return false; - } - - var capped; - - // cap values of the space prior converting all values - for (i = 0; i < space.length; i++) { - capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); - values[space][i] = Math.round(capped); - } - - // convert to all the other color spaces - for (var sname in spaces) { - if (sname !== space) { - values[sname] = convert[space][sname](values[space]); - } - } - - return true; - }; - - Color.prototype.setSpace = function (space, args) { - var vals = args[0]; - - if (vals === undefined) { - // color.rgb() - return this.getValues(space); - } - - // color.rgb(10, 10, 10) - if (typeof vals === 'number') { - vals = Array.prototype.slice.call(args); - } - - this.setValues(space, vals); - return this; - }; - - Color.prototype.setChannel = function (space, index, val) { - var svalues = this.values[space]; - if (val === undefined) { - // color.red() - return svalues[index]; - } else if (val === svalues[index]) { - // color.red(color.red()) - return this; - } - - // color.red(100) - svalues[index] = val; - this.setValues(space, svalues); - - return this; - }; - - if (typeof window !== 'undefined') { - window.Color = Color; - } - - module.exports = Color; - - }, {"1": 1, "4": 4}], 3: [function (require, module, exports) { - /* MIT license */ - - module.exports = { - rgb2hsl: rgb2hsl, - rgb2hsv: rgb2hsv, - rgb2hwb: rgb2hwb, - rgb2cmyk: rgb2cmyk, - rgb2keyword: rgb2keyword, - rgb2xyz: rgb2xyz, - rgb2lab: rgb2lab, - rgb2lch: rgb2lch, - - hsl2rgb: hsl2rgb, - hsl2hsv: hsl2hsv, - hsl2hwb: hsl2hwb, - hsl2cmyk: hsl2cmyk, - hsl2keyword: hsl2keyword, - - hsv2rgb: hsv2rgb, - hsv2hsl: hsv2hsl, - hsv2hwb: hsv2hwb, - hsv2cmyk: hsv2cmyk, - hsv2keyword: hsv2keyword, - - hwb2rgb: hwb2rgb, - hwb2hsl: hwb2hsl, - hwb2hsv: hwb2hsv, - hwb2cmyk: hwb2cmyk, - hwb2keyword: hwb2keyword, - - cmyk2rgb: cmyk2rgb, - cmyk2hsl: cmyk2hsl, - cmyk2hsv: cmyk2hsv, - cmyk2hwb: cmyk2hwb, - cmyk2keyword: cmyk2keyword, - - keyword2rgb: keyword2rgb, - keyword2hsl: keyword2hsl, - keyword2hsv: keyword2hsv, - keyword2hwb: keyword2hwb, - keyword2cmyk: keyword2cmyk, - keyword2lab: keyword2lab, - keyword2xyz: keyword2xyz, - - xyz2rgb: xyz2rgb, - xyz2lab: xyz2lab, - xyz2lch: xyz2lch, - - lab2xyz: lab2xyz, - lab2rgb: lab2rgb, - lab2lch: lab2lch, - - lch2lab: lch2lab, - lch2xyz: lch2xyz, - lch2rgb: lch2rgb - } - - - function rgb2hsl(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, s, l; - - if (max == min) - h = 0; - else if (r == max) - h = (g - b) / delta; - else if (g == max) - h = 2 + (b - r) / delta; - else if (b == max) - h = 4 + (r - g) / delta; - - h = Math.min(h * 60, 360); - - if (h < 0) - h += 360; - - l = (min + max) / 2; - - if (max == min) - s = 0; - else if (l <= 0.5) - s = delta / (max + min); - else - s = delta / (2 - max - min); - - return [h, s * 100, l * 100]; - } - - function rgb2hsv(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, s, v; - - if (max == 0) - s = 0; - else - s = (delta / max * 1000) / 10; - - if (max == min) - h = 0; - else if (r == max) - h = (g - b) / delta; - else if (g == max) - h = 2 + (b - r) / delta; - else if (b == max) - h = 4 + (r - g) / delta; - - h = Math.min(h * 60, 360); - - if (h < 0) - h += 360; - - v = ((max / 255) * 1000) / 10; - - return [h, s, v]; - } - - function rgb2hwb(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - h = rgb2hsl(rgb)[0], - w = 1 / 255 * Math.min(r, Math.min(g, b)), - b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); - - return [h, w * 100, b * 100]; - } - - function rgb2cmyk(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255, - c, m, y, k; - - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; - return [c * 100, m * 100, y * 100, k * 100]; - } - - function rgb2keyword(rgb) { - return reverseKeywords[JSON.stringify(rgb)]; - } - - function rgb2xyz(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255; - - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); - - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); - - return [x * 100, y * 100, z * 100]; - } - - function rgb2lab(rgb) { - var xyz = rgb2xyz(rgb), - x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; - } - - function rgb2lch(args) { - return lab2lch(rgb2lab(args)); - } - - function hsl2rgb(hsl) { - var h = hsl[0] / 360, - s = hsl[1] / 100, - l = hsl[2] / 100, - t1, t2, t3, rgb, val; - - if (s == 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) - t2 = l * (1 + s); - else - t2 = l + s - l * s; - t1 = 2 * l - t2; - - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * -(i - 1); - t3 < 0 && t3++; - t3 > 1 && t3--; - - if (6 * t3 < 1) - val = t1 + (t2 - t1) * 6 * t3; - else if (2 * t3 < 1) - val = t2; - else if (3 * t3 < 2) - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - else - val = t1; - - rgb[i] = val * 255; - } - - return rgb; - } - - function hsl2hsv(hsl) { - var h = hsl[0], - s = hsl[1] / 100, - l = hsl[2] / 100, - sv, v; - - if (l === 0) { - // no need to do calc on black - // also avoids divide by 0 error - return [0, 0, 0]; - } - - l *= 2; - s *= (l <= 1) ? l : 2 - l; - v = (l + s) / 2; - sv = (2 * s) / (l + s); - return [h, sv * 100, v * 100]; - } - - function hsl2hwb(args) { - return rgb2hwb(hsl2rgb(args)); - } - - function hsl2cmyk(args) { - return rgb2cmyk(hsl2rgb(args)); - } - - function hsl2keyword(args) { - return rgb2keyword(hsl2rgb(args)); - } - - - function hsv2rgb(hsv) { - var h = hsv[0] / 60, - s = hsv[1] / 100, - v = hsv[2] / 100, - hi = Math.floor(h) % 6; - - var f = h - Math.floor(h), - p = 255 * v * (1 - s), - q = 255 * v * (1 - (s * f)), - t = 255 * v * (1 - (s * (1 - f))), - v = 255 * v; - - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } - } - - function hsv2hsl(hsv) { - var h = hsv[0], - s = hsv[1] / 100, - v = hsv[2] / 100, - sl, l; - - l = (2 - s) * v; - sl = s * v; - sl /= (l <= 1) ? l : 2 - l; - sl = sl || 0; - l /= 2; - return [h, sl * 100, l * 100]; - } - - function hsv2hwb(args) { - return rgb2hwb(hsv2rgb(args)) - } - - function hsv2cmyk(args) { - return rgb2cmyk(hsv2rgb(args)); - } - - function hsv2keyword(args) { - return rgb2keyword(hsv2rgb(args)); - } - -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb - function hwb2rgb(hwb) { - var h = hwb[0] / 360, - wh = hwb[1] / 100, - bl = hwb[2] / 100, - ratio = wh + bl, - i, v, f, n; - - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } - - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; - if ((i & 0x01) != 0) { - f = 1 - f; - } - n = wh + f * (v - wh); // linear interpolation - - switch (i) { - default: - case 6: - case 0: - r = v; - g = n; - b = wh; - break; - case 1: - r = n; - g = v; - b = wh; - break; - case 2: - r = wh; - g = v; - b = n; - break; - case 3: - r = wh; - g = n; - b = v; - break; - case 4: - r = n; - g = wh; - b = v; - break; - case 5: - r = v; - g = wh; - b = n; - break; - } - - return [r * 255, g * 255, b * 255]; - } - - function hwb2hsl(args) { - return rgb2hsl(hwb2rgb(args)); - } - - function hwb2hsv(args) { - return rgb2hsv(hwb2rgb(args)); - } - - function hwb2cmyk(args) { - return rgb2cmyk(hwb2rgb(args)); - } - - function hwb2keyword(args) { - return rgb2keyword(hwb2rgb(args)); - } - - function cmyk2rgb(cmyk) { - var c = cmyk[0] / 100, - m = cmyk[1] / 100, - y = cmyk[2] / 100, - k = cmyk[3] / 100, - r, g, b; - - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); - return [r * 255, g * 255, b * 255]; - } - - function cmyk2hsl(args) { - return rgb2hsl(cmyk2rgb(args)); - } - - function cmyk2hsv(args) { - return rgb2hsv(cmyk2rgb(args)); - } - - function cmyk2hwb(args) { - return rgb2hwb(cmyk2rgb(args)); - } - - function cmyk2keyword(args) { - return rgb2keyword(cmyk2rgb(args)); - } - - - function xyz2rgb(xyz) { - var x = xyz[0] / 100, - y = xyz[1] / 100, - z = xyz[2] / 100, - r, g, b; - - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - - // assume sRGB - r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r = (r * 12.92); - - g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g = (g * 12.92); - - b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b = (b * 12.92); - - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); - - return [r * 255, g * 255, b * 255]; - } - - function xyz2lab(xyz) { - var x = xyz[0], - y = xyz[1], - z = xyz[2], - l, a, b; - - x /= 95.047; - y /= 100; - z /= 108.883; - - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); - - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; - } - - function xyz2lch(args) { - return lab2lch(xyz2lab(args)); - } - - function lab2xyz(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - x, y, z, y2; - - if (l <= 8) { - y = (l * 100) / 903.3; - y2 = (7.787 * (y / 100)) + (16 / 116); - } else { - y = 100 * Math.pow((l + 16) / 116, 3); - y2 = Math.pow(y / 100, 1 / 3); - } - - x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); - - z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); - - return [x, y, z]; - } - - function lab2lch(lab) { - var l = lab[0], - a = lab[1], - b = lab[2], - hr, h, c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; - if (h < 0) { - h += 360; - } - c = Math.sqrt(a * a + b * b); - return [l, c, h]; - } - - function lab2rgb(args) { - return xyz2rgb(lab2xyz(args)); - } - - function lch2lab(lch) { - var l = lch[0], - c = lch[1], - h = lch[2], - a, b, hr; - - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); - return [l, a, b]; - } - - function lch2xyz(args) { - return lab2xyz(lch2lab(args)); - } - - function lch2rgb(args) { - return lab2rgb(lch2lab(args)); - } - - function keyword2rgb(keyword) { - return cssKeywords[keyword]; - } - - function keyword2hsl(args) { - return rgb2hsl(keyword2rgb(args)); - } - - function keyword2hsv(args) { - return rgb2hsv(keyword2rgb(args)); - } - - function keyword2hwb(args) { - return rgb2hwb(keyword2rgb(args)); - } - - function keyword2cmyk(args) { - return rgb2cmyk(keyword2rgb(args)); - } - - function keyword2lab(args) { - return rgb2lab(keyword2rgb(args)); - } - - function keyword2xyz(args) { - return rgb2xyz(keyword2rgb(args)); - } - - var cssKeywords = { - aliceblue: [240, 248, 255], - antiquewhite: [250, 235, 215], - aqua: [0, 255, 255], - aquamarine: [127, 255, 212], - azure: [240, 255, 255], - beige: [245, 245, 220], - bisque: [255, 228, 196], - black: [0, 0, 0], - blanchedalmond: [255, 235, 205], - blue: [0, 0, 255], - blueviolet: [138, 43, 226], - brown: [165, 42, 42], - burlywood: [222, 184, 135], - cadetblue: [95, 158, 160], - chartreuse: [127, 255, 0], - chocolate: [210, 105, 30], - coral: [255, 127, 80], - cornflowerblue: [100, 149, 237], - cornsilk: [255, 248, 220], - crimson: [220, 20, 60], - cyan: [0, 255, 255], - darkblue: [0, 0, 139], - darkcyan: [0, 139, 139], - darkgoldenrod: [184, 134, 11], - darkgray: [169, 169, 169], - darkgreen: [0, 100, 0], - darkgrey: [169, 169, 169], - darkkhaki: [189, 183, 107], - darkmagenta: [139, 0, 139], - darkolivegreen: [85, 107, 47], - darkorange: [255, 140, 0], - darkorchid: [153, 50, 204], - darkred: [139, 0, 0], - darksalmon: [233, 150, 122], - darkseagreen: [143, 188, 143], - darkslateblue: [72, 61, 139], - darkslategray: [47, 79, 79], - darkslategrey: [47, 79, 79], - darkturquoise: [0, 206, 209], - darkviolet: [148, 0, 211], - deeppink: [255, 20, 147], - deepskyblue: [0, 191, 255], - dimgray: [105, 105, 105], - dimgrey: [105, 105, 105], - dodgerblue: [30, 144, 255], - firebrick: [178, 34, 34], - floralwhite: [255, 250, 240], - forestgreen: [34, 139, 34], - fuchsia: [255, 0, 255], - gainsboro: [220, 220, 220], - ghostwhite: [248, 248, 255], - gold: [255, 215, 0], - goldenrod: [218, 165, 32], - gray: [128, 128, 128], - green: [0, 128, 0], - greenyellow: [173, 255, 47], - grey: [128, 128, 128], - honeydew: [240, 255, 240], - hotpink: [255, 105, 180], - indianred: [205, 92, 92], - indigo: [75, 0, 130], - ivory: [255, 255, 240], - khaki: [240, 230, 140], - lavender: [230, 230, 250], - lavenderblush: [255, 240, 245], - lawngreen: [124, 252, 0], - lemonchiffon: [255, 250, 205], - lightblue: [173, 216, 230], - lightcoral: [240, 128, 128], - lightcyan: [224, 255, 255], - lightgoldenrodyellow: [250, 250, 210], - lightgray: [211, 211, 211], - lightgreen: [144, 238, 144], - lightgrey: [211, 211, 211], - lightpink: [255, 182, 193], - lightsalmon: [255, 160, 122], - lightseagreen: [32, 178, 170], - lightskyblue: [135, 206, 250], - lightslategray: [119, 136, 153], - lightslategrey: [119, 136, 153], - lightsteelblue: [176, 196, 222], - lightyellow: [255, 255, 224], - lime: [0, 255, 0], - limegreen: [50, 205, 50], - linen: [250, 240, 230], - magenta: [255, 0, 255], - maroon: [128, 0, 0], - mediumaquamarine: [102, 205, 170], - mediumblue: [0, 0, 205], - mediumorchid: [186, 85, 211], - mediumpurple: [147, 112, 219], - mediumseagreen: [60, 179, 113], - mediumslateblue: [123, 104, 238], - mediumspringgreen: [0, 250, 154], - mediumturquoise: [72, 209, 204], - mediumvioletred: [199, 21, 133], - midnightblue: [25, 25, 112], - mintcream: [245, 255, 250], - mistyrose: [255, 228, 225], - moccasin: [255, 228, 181], - navajowhite: [255, 222, 173], - navy: [0, 0, 128], - oldlace: [253, 245, 230], - olive: [128, 128, 0], - olivedrab: [107, 142, 35], - orange: [255, 165, 0], - orangered: [255, 69, 0], - orchid: [218, 112, 214], - palegoldenrod: [238, 232, 170], - palegreen: [152, 251, 152], - paleturquoise: [175, 238, 238], - palevioletred: [219, 112, 147], - papayawhip: [255, 239, 213], - peachpuff: [255, 218, 185], - peru: [205, 133, 63], - pink: [255, 192, 203], - plum: [221, 160, 221], - powderblue: [176, 224, 230], - purple: [128, 0, 128], - rebeccapurple: [102, 51, 153], - red: [255, 0, 0], - rosybrown: [188, 143, 143], - royalblue: [65, 105, 225], - saddlebrown: [139, 69, 19], - salmon: [250, 128, 114], - sandybrown: [244, 164, 96], - seagreen: [46, 139, 87], - seashell: [255, 245, 238], - sienna: [160, 82, 45], - silver: [192, 192, 192], - skyblue: [135, 206, 235], - slateblue: [106, 90, 205], - slategray: [112, 128, 144], - slategrey: [112, 128, 144], - snow: [255, 250, 250], - springgreen: [0, 255, 127], - steelblue: [70, 130, 180], - tan: [210, 180, 140], - teal: [0, 128, 128], - thistle: [216, 191, 216], - tomato: [255, 99, 71], - turquoise: [64, 224, 208], - violet: [238, 130, 238], - wheat: [245, 222, 179], - white: [255, 255, 255], - whitesmoke: [245, 245, 245], - yellow: [255, 255, 0], - yellowgreen: [154, 205, 50] - }; - - var reverseKeywords = {}; - for (var key in cssKeywords) { - reverseKeywords[JSON.stringify(cssKeywords[key])] = key; - } - - }, {}], 4: [function (require, module, exports) { - var conversions = require(3); - - var convert = function () { - return new Converter(); - } - - for (var func in conversions) { - // export Raw versions - convert[func + "Raw"] = (function (func) { - // accept array or plain args - return function (arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - return conversions[func](arg); - } - })(func); - - var pair = /(\w+)2(\w+)/.exec(func), - from = pair[1], - to = pair[2]; - - // export rgb2hsl and ["rgb"]["hsl"] - convert[from] = convert[from] || {}; - - convert[from][to] = convert[func] = (function (func) { - return function (arg) { - if (typeof arg == "number") - arg = Array.prototype.slice.call(arguments); - - var val = conversions[func](arg); - if (typeof val == "string" || val === undefined) - return val; // keyword - - for (var i = 0; i < val.length; i++) - val[i] = Math.round(val[i]); - return val; - } - })(func); - } - - - /* Converter does lazy conversion and caching */ - var Converter = function () { - this.convs = {}; - }; - - /* Either get the values for a space or - set the values for a space, depending on args */ - Converter.prototype.routeSpace = function (space, args) { - var values = args[0]; - if (values === undefined) { - // color.rgb() - return this.getValues(space); - } - // color.rgb(10, 10, 10) - if (typeof values == "number") { - values = Array.prototype.slice.call(args); - } - - return this.setValues(space, values); - }; - - /* Set the values for a space, invalidating cache */ - Converter.prototype.setValues = function (space, values) { - this.space = space; - this.convs = {}; - this.convs[space] = values; - return this; - }; - - /* Get the values for a space. If there's already - a conversion for the space, fetch it, otherwise - compute it */ - Converter.prototype.getValues = function (space) { - var vals = this.convs[space]; - if (!vals) { - var fspace = this.space, - from = this.convs[fspace]; - vals = convert[fspace][space](from); - - this.convs[space] = vals; - } - return vals; - }; - - ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (space) { - Converter.prototype[space] = function (vals) { - return this.routeSpace(space, arguments); - } - }); - - module.exports = convert; - }, {"3": 3}], 5: [function (require, module, exports) { - 'use strict' - - module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] - }; - - }, {}], 6: [function (require, module, exports) { -//! moment.js -//! version : 2.18.1 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com - - ;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - global.moment = factory() - }(this, (function () { - 'use strict'; - - var hookCallback; - - function hooks() { - return hookCallback.apply(null, arguments); - } - -// This is done to register the method called with moment() -// without creating circular dependencies. - function setHookCallback(callback) { - hookCallback = callback; - } - - function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; - } - - function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; - } - - function isObjectEmpty(obj) { - var k; - for (k in obj) { - // even if its not own property I'd still call it non-empty - return false; - } - return true; - } - - function isUndefined(input) { - return input === void 0; - } - - function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; - } - - function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; - } - - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function createUTC(input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } - - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty: false, - unusedTokens: [], - unusedInput: [], - overflow: -2, - charsLeftOver: 0, - nullInput: false, - invalidMonth: null, - invalidFormat: false, - userInvalidated: false, - iso: false, - parsedDateParts: [], - meridiem: null, - rfc2822: false, - weekdayMismatch: false - }; - } - - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } - - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; - - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; - } - - var some$1 = some; - - function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some$1.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; - } - - function createInvalid(flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } - - return m; - } - -// Plugins that add properties should also add the key here (null value), -// so we can properly clone ourselves. - var momentProperties = hooks.momentProperties = []; - - function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; - } - - var updateInProgress = false; - -// Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } - } - - function isMoment(obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); - } - - function absFloor(number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; - } - -// compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - var deprecations = {}; - - function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } - } - - hooks.suppressDeprecationWarnings = false; - hooks.deprecationHandler = null; - - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } - - function set(config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + (/\d{1,2}/).source); - } - - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } - } - return res; - } - - function Locale(config) { - if (config != null) { - this.set(config); - } - } - - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; - } - - var keys$1 = keys; - - var defaultCalendar = { - sameDay: '[Today at] LT', - nextDay: '[Tomorrow at] LT', - nextWeek: 'dddd [at] LT', - lastDay: '[Yesterday at] LT', - lastWeek: '[Last] dddd [at] LT', - sameElse: 'L' - }; - - function calendar(key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; - } - - var defaultLongDateFormat = { - LTS: 'h:mm:ss A', - LT: 'h:mm A', - L: 'MM/DD/YYYY', - LL: 'MMMM D, YYYY', - LLL: 'MMMM D, YYYY h:mm A', - LLLL: 'dddd, MMMM D, YYYY h:mm A' - }; - - function longDateFormat(key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; - } - - var defaultInvalidDate = 'Invalid date'; - - function invalidDate() { - return this._invalidDate; - } - - var defaultOrdinal = '%d'; - var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - - function ordinal(number) { - return this._ordinal.replace('%d', number); - } - - var defaultRelativeTime = { - future: 'in %s', - past: '%s ago', - s: 'a few seconds', - ss: '%d seconds', - m: 'a minute', - mm: '%d minutes', - h: 'an hour', - hh: '%d hours', - d: 'a day', - dd: '%d days', - M: 'a month', - MM: '%d months', - y: 'a year', - yy: '%d years' - }; - - function relativeTime(number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - } - - function pastFuture(diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); - } - - var aliases = {}; - - function addUnitAlias(unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; - } - - function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - var priorities = {}; - - function addUnitPriority(unit, priority) { - priorities[unit] = priority; - } - - function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; - } - - function makeGetSet(unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; - } - - function get(mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; - } - - function set$1(mom, unit, value) { - if (mom.isValid()) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - -// MOMENTS - - function stringGet(units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); - } - return this; - } - - - function stringSet(units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } - - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; - } - - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - - var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; - - var formatFunctions = {}; - - var formatTokenFunctions = {}; - -// token: 'M' -// padded: ['MM', 2] -// ordinal: 'Mo' -// callback: function () { this.month() + 1 } - function addFormatToken(token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } - } - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } - -// format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var match1 = /\d/; // 0 - 9 - var match2 = /\d\d/; // 00 - 99 - var match3 = /\d{3}/; // 000 - 999 - var match4 = /\d{4}/; // 0000 - 9999 - var match6 = /[+-]?\d{6}/; // -999999 - 999999 - var match1to2 = /\d\d?/; // 0 - 99 - var match3to4 = /\d\d\d\d?/; // 999 - 9999 - var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 - var match1to3 = /\d{1,3}/; // 0 - 999 - var match1to4 = /\d{1,4}/; // 0 - 9999 - var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - - var matchUnsigned = /\d+/; // 0 - inf - var matchSigned = /[+-]?\d+/; // -inf - inf - - var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z - var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - - var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - -// any word (or two) characters or numbers including two/three word month in arabic. -// includes scottish gaelic two word and hyphenated months - var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; - - - var regexes = {}; - - function addRegexToken(token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; - } - - function getParseRegexForToken(token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); - } - -// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); - } - - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - var tokens = {}; - - function addParseToken(token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } - } - - function addWeekParseToken(token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } - } - - var YEAR = 0; - var MONTH = 1; - var DATE = 2; - var HOUR = 3; - var MINUTE = 4; - var SECOND = 5; - var MILLISECOND = 6; - var WEEK = 7; - var WEEKDAY = 8; - - var indexOf; - - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } - - var indexOf$1 = indexOf; - - function daysInMonth(year, month) { - return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); - } - -// FORMATTING - - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); - - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); - - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); - -// ALIASES - - addUnitAlias('month', 'M'); - -// PRIORITY - - addUnitPriority('month', 8); - -// PARSING - - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); - }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; - }); - - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); - -// LOCALES - - var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - - function localeMonths(m, format) { - if (!m) { - return isArray(this._months) ? this._months : - this._months['standalone']; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; - } - - var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - - function localeMonthsShort(m, format) { - if (!m) { - return isArray(this._monthsShort) ? this._monthsShort : - this._monthsShort['standalone']; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } - - function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf$1.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf$1.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeMonthsParse(monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } - -// MOMENTS - - function setMonth(mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function getSetMonth(value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } - } - - function getDaysInMonth() { - return daysInMonth(this.year(), this.month()); - } - - var defaultMonthsShortRegex = matchWord; - - function monthsShortRegex(isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } - } - - var defaultMonthsRegex = matchWord; - - function monthsRegex(isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; - } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; - } - } - - function computeMonthsParse() { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - } - -// FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; - }); - - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); - - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - -// ALIASES - - addUnitAlias('year', 'y'); - -// PRIORITIES - - addUnitPriority('year', 1); - -// PARSING - - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); - - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); - -// HELPERS - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - -// HOOKS - - hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - -// MOMENTS - - var getSetYear = makeGetSet('FullYear', true); - - function getIsLeapYear() { - return isLeapYear(this.year()); - } - - function createDate(y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date = new Date(y, m, d, h, M, s, ms); - - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { - date.setFullYear(y); - } - return date; - } - - function createUTCDate(y) { - var date = new Date(Date.UTC.apply(null, arguments)); - - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - return date; - } - -// start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; - } - -// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear - }; - } - - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear - }; - } - - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } - -// FORMATTING - - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - -// ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - -// PRIORITIES - - addUnitPriority('week', 5); - addUnitPriority('isoWeek', 5); - -// PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - -// HELPERS - -// LOCALES - - function localeWeek(mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow: 0, // Sunday is the first day of the week. - doy: 6 // The week that contains Jan 1st is the first week of the year. - }; - - function localeFirstDayOfWeek() { - return this._week.dow; - } - - function localeFirstDayOfYear() { - return this._week.doy; - } - -// MOMENTS - - function getSetWeek(input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek(input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - -// FORMATTING - - addFormatToken('d', 0, 'do', 'day'); - - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); - - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); - }); - - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); - -// ALIASES - - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - -// PRIORITY - addUnitPriority('day', 11); - addUnitPriority('weekday', 11); - addUnitPriority('isoWeekday', 11); - -// PARSING - - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); - - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); - }); - -// HELPERS - - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; - } - - function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; - } - -// LOCALES - - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - - function localeWeekdays(m, format) { - if (!m) { - return isArray(this._weekdays) ? this._weekdays : - this._weekdays['standalone']; - } - return isArray(this._weekdays) ? this._weekdays[m.day()] : - this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; - } - - var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); - - function localeWeekdaysShort(m) { - return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; - } - - var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); - - function localeWeekdaysMin(m) { - return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; - } - - function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf$1.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf$1.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf$1.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf$1.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeWeekdaysParse(weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - } - -// MOMENTS - - function getSetDayOfWeek(input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } - - function getSetLocaleDayOfWeek(input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - - function getSetISODayOfWeek(input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } - } - - var defaultWeekdaysRegex = matchWord; - - function weekdaysRegex(isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } - } - - var defaultWeekdaysShortRegex = matchWord; - - function weekdaysShortRegex(isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; - } - } - - var defaultWeekdaysMinRegex = matchWord; - - function weekdaysMinRegex(isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; - } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } - } - - - function computeWeekdaysParse() { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); - } - -// FORMATTING - - function hFormat() { - return this.hours() % 12 || 12; - } - - function kFormat() { - return this.hours() || 24; - } - - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); - - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - - addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - function meridiem(token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); - } - - meridiem('a', true); - meridiem('A', false); - -// ALIASES - - addUnitAlias('hour', 'h'); - -// PRIORITY - addUnitPriority('hour', 13); - -// PARSING - - function matchMeridiem(isStrict, locale) { - return locale._meridiemParse; - } - - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('k', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - addRegexToken('kk', match1to2, match2); - - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); - - addParseToken(['H', 'HH'], HOUR); - addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; - }); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); - -// LOCALES - - function localeIsPM(input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - } - - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; - - function localeMeridiem(hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - } - - -// MOMENTS - -// Setting the hour should keep the time, because the user explicitly -// specified which hour he wants. So trying to maintain the same hour (in -// a new timezone) makes sense. Adding/subtracting hours does not follow -// this rule. - var getSetHour = makeGetSet('Hours', true); - -// months -// week -// weekdays -// meridiem - var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, - - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, - - week: defaultLocaleWeek, - - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - - meridiemParse: defaultLocaleMeridiemParse - }; - -// internal storage for locale config files - var locales = {}; - var localeFamilies = {}; - var globalLocale; - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - -// pick the locale from the array -// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each -// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return null; - } - - function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - require('./locale/' + name); - // because defineLocale currently also sets the global locale, we - // want to undo that for lazy loaded locales - getSetGlobalLocale(oldLocale); - } catch (e) { - } - } - return locales[name]; - } - -// This function will load locale and then set the global locale. If -// no arguments are passed in, it will simply return the current global -// locale key. - function getSetGlobalLocale(key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } - } - - return globalLocale._abbr; - } - - function defineLocale(name, config) { - if (config !== null) { - var parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); - - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - - function updateLocale(name, config) { - if (config != null) { - var locale, parentConfig = baseConfig; - // MERGE - if (locales[name] != null) { - parentConfig = locales[name]._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } - -// returns locale data - function getLocale(key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - } - - function listLocales() { - return keys$1(locales); - } - - function checkOverflow(m) { - var overflow; - var a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; - } - -// iso 8601 regex -// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - - var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - - var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] - ]; - -// iso time formats and regexes - var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] - ]; - - var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; - -// date from iso format - function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - -// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - var basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/; - -// date and time from ref 2822 format - function configFromRFC2822(config) { - var string, match, dayFormat, - dateFormat, timeFormat, tzFormat; - var timezones = { - ' GMT': ' +0000', - ' EDT': ' -0400', - ' EST': ' -0500', - ' CDT': ' -0500', - ' CST': ' -0600', - ' MDT': ' -0600', - ' MST': ' -0700', - ' PDT': ' -0700', - ' PST': ' -0800' - }; - var military = 'YXWVUTSRQPONZABCDEFGHIKLM'; - var timezone, timezoneIndex; - - string = config._i - .replace(/\([^\)]*\)|[\n\t]/g, ' ') // Remove comments and folding whitespace - .replace(/(\s\s+)/g, ' ') // Replace multiple-spaces with a single space - .replace(/^\s|\s$/g, ''); // Remove leading and trailing spaces - match = basicRfcRegex.exec(string); - - if (match) { - dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : ''; - dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY '); - timeFormat = 'HH:mm' + (match[4] ? ':ss' : ''); - - // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. - if (match[1]) { // day of week given - var momentDate = new Date(match[2]); - var momentDay = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][momentDate.getDay()]; - - if (match[1].substr(0, 3) !== momentDay) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return; - } - } - - switch (match[5].length) { - case 2: // military - if (timezoneIndex === 0) { - timezone = ' +0000'; - } else { - timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12; - timezone = ((timezoneIndex < 0) ? ' -' : ' +') + - (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00'; - } - break; - case 4: // Zone - timezone = timezones[match[5]]; - break; - default: // UT or +/-9999 - timezone = timezones[' GMT']; - } - match[5] = timezone; - config._i = match.splice(1).join(''); - tzFormat = ' ZZ'; - config._f = dayFormat + dateFormat + timeFormat + tzFormat; - configFromStringAndFormat(config); - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } - } - -// date from iso format or fallback - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); - } - - hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - -// Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; - } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; - } - -// convert an array to a date. -// the array should mirror the parameters below -// note: all values past the year are optional and will default to the lowest possible value. -// [year, month, day , hour, minute, second, millisecond] - function configFromArray(config) { - var i, date, input = [], currentDate, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - var curWeek = weekOfYear(createLocal(), dow, doy); - - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); - - // Default to current week. - week = defaults(w.w, curWeek.week); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to begining of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } - -// constant that refers to the ISO standard - hooks.ISO_8601 = function () { - }; - -// constant that refers to the RFC 2822 form - hooks.RFC_2822 = function () { - }; - -// date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { - configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - - configFromArray(config); - checkOverflow(config); - } - - - function meridiemFixWrap(locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } - } - -// date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); - } - - function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - - configFromArray(config); - } - - function createFromConfig(config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - function prepareConfig(config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } - - if (!isValid(config)) { - config._d = null; - } - - return config; - } - - function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); - } - } - - function createLocalOrUTC(input, format, locale, strict, isUTC) { - var c = {}; - - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } - - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - - return createFromConfig(c); - } - - function createLocal(input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } - - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } - ); - - var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; - } else { - return createInvalid(); - } - } - ); - -// Pick a moment m from moments so that m[fn](other) is true for all -// other. This relies on the function fn to be transitive. -// -// moments should either be an array of moment objects or an array, whose -// first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - -// TODO: Use [].sort instead? - function min() { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - } - - function max() { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - } - - var now = function () { - return Date.now ? Date.now() : +(new Date()); - }; - - var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; - - function isDurationValid(m) { - for (var key in m) { - if (!(ordering.indexOf(key) !== -1 && (m[key] == null || !isNaN(m[key])))) { - return false; - } - } - - var unitHasDecimal = false; - for (var i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; - } - } - } - - return true; - } - - function isValid$1() { - return this._isValid; - } - - function createInvalid$1() { - return createDuration(NaN); - } - - function Duration(duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - this._isValid = isDurationValid(normalizedInput); - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = getLocale(); - - this._bubble(); - } - - function isDuration(obj) { - return obj instanceof Duration; - } - - function absRound(number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } - } - -// FORMATTING - - function offset(token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); - } - - offset('Z', ':'); - offset('ZZ', ''); - -// PARSING - - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); - -// HELPERS - -// timezone chunker -// '+10:00' > ['10', '00'] -// '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; - - function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - - if (matches === null) { - return null; - } - - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); - - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; - } - -// Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } - } - - function getDateOffset(m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; - } - -// HOOKS - -// This function will be called whenever a moment is mutated. -// It is intended to keep the offset in sync with the timezone. - hooks.updateOffset = function () { - }; - -// MOMENTS - -// keepLocalTime = true means only change the timezone, without -// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> -// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset -// +0200, so we adjust the time as needed, to be valid. -// -// Keeping the time actually adds/subtracts (one hour) -// from the actual represented time. That is why we call updateOffset -// a second time. In case it wants us to change the offset again -// _changeInProgress == true case, then we have to adjust, because -// there is no such time in the given timezone. - function getSetOffset(input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } - } - - function getSetZone(input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - - function setOffsetToUTC(keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } - - function setOffsetToLocal(keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } - - function setOffsetToParsedOffset() { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; - } - - function hasAlignedHourOffset(input) { - if (!this.isValid()) { - return false; - } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } - - function isDaylightSavingTime() { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } - - function isDaylightSavingTimeShifted() { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } - - var c = {}; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } - - return this._isDSTShifted; - } - - function isLocal() { - return this.isValid() ? !this._isUTC : false; - } - - function isUtcOffset() { - return this.isValid() ? this._isUTC : false; - } - - function isUtc() { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } - -// ASP.NET json date format regex - var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; - -// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html -// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere -// and further modified to allow for strings containing both week and day - var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/; - - function createDuration(input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; - - if (isDuration(input)) { - duration = { - ms: input._milliseconds, - d: input._days, - M: input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y: 0, - d: toInt(match[DATE]) * sign, - h: toInt(match[HOUR]) * sign, - m: toInt(match[MINUTE]) * sign, - s: toInt(match[SECOND]) * sign, - ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y: parseIso(match[2], sign), - M: parseIso(match[3], sign), - w: parseIso(match[4], sign), - d: parseIso(match[5], sign), - h: parseIso(match[6], sign), - m: parseIso(match[7], sign), - s: parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; - } - - createDuration.fn = Duration.prototype; - createDuration.invalid = createInvalid$1; - - function parseIso(inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - -// TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; - val = period; - period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; - } - - function addSubtract(mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; - } - - updateOffset = updateOffset == null ? true : updateOffset; - - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); - } - } - - var add = createAdder(1, 'add'); - var subtract = createAdder(-1, 'subtract'); - - function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - } - - function calendar$1(time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); - } - - function clone() { - return new Moment(this); - } - - function isAfter(input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - - function isBefore(input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } - - function isBetween(from, to, units, inclusivity) { - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && - (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); - } - - function isSame(input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); - } - } - - function isSameOrAfter(input, units) { - return this.isSame(input, units) || this.isAfter(input, units); - } - - function isSameOrBefore(input, units) { - return this.isSame(input, units) || this.isBefore(input, units); - } - - function diff(input, units, asFloat) { - var that, - zoneDelta, - delta, output; - - if (!this.isValid()) { - return NaN; - } - - that = cloneWithOffset(input, this); - - if (!that.isValid()) { - return NaN; - } - - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - if (units === 'year' || units === 'month' || units === 'quarter') { - output = monthDiff(this, that); - if (units === 'quarter') { - output = output / 3; - } else if (units === 'year') { - output = output / 12; - } - } else { - delta = this - that; - output = units === 'second' ? delta / 1e3 : // 1000 - units === 'minute' ? delta / 6e4 : // 1000 * 60 - units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60 - units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst - units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst - delta; - } - return asFloat ? output : absFloor(output); - } - - function monthDiff(a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } - - hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - - function toString() { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - - function toISOString() { - if (!this.isValid()) { - return null; - } - var m = this.clone().utc(); - if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - return this.toDate().toISOString(); - } - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); - } - - /** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ - function inspect() { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; - - return this.format(prefix + year + datetime + suffix); - } - - function format(inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - - function from(time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function fromNow(withoutSuffix) { - return this.from(createLocal(), withoutSuffix); - } - - function to(time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function toNow(withoutSuffix) { - return this.to(createLocal(), withoutSuffix); - } - -// If passed a locale key, it will set the locale for this -// instance. Otherwise, it will return the locale configuration -// variables for this instance. - function locale(key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - } - - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ); - - function localeData() { - return this._locale; - } - - function startOf(units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - case 'date': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } - if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; - } - - function endOf(units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - - // 'date' is an alias for 'day', so it should be considered as such. - if (units === 'date') { - units = 'day'; - } - - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - } - - function valueOf() { - return this._d.valueOf() - ((this._offset || 0) * 60000); - } - - function unix() { - return Math.floor(this.valueOf() / 1000); - } - - function toDate() { - return new Date(this.valueOf()); - } - - function toArray() { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; - } - - function toObject() { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; - } - - function toJSON() { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - - function isValid$2() { - return isValid(this); - } - - function parsingFlags() { - return extend({}, getParsingFlags(this)); - } - - function invalidAt() { - return getParsingFlags(this).overflow; - } - - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; - } - -// FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; - }); - - function addWeekYearFormatToken(token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - -// ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - -// PRIORITY - - addUnitPriority('weekYear', 1); - addUnitPriority('isoWeekYear', 1); - - -// PARSING - - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); - - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); - }); - - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); - }); - -// MOMENTS - - function getSetWeekYear(input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); - } - - function getSetISOWeekYear(input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); - } - - function getISOWeeksInYear() { - return weeksInYear(this.year(), 1, 4); - } - - function getWeeksInYear() { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } - - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; - } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - -// FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - -// ALIASES - - addUnitAlias('quarter', 'Q'); - -// PRIORITY - - addUnitPriority('quarter', 7); - -// PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; - }); - -// MOMENTS - - function getSetQuarter(input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - } - -// FORMATTING - - addFormatToken('D', ['DD', 2], 'Do', 'date'); - -// ALIASES - - addUnitAlias('date', 'D'); - -// PRIOROITY - addUnitPriority('date', 9); - -// PARSING - - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict ? - (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : - locale._dayOfMonthOrdinalParseLenient; - }); - - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0], 10); - }); - -// MOMENTS - - var getSetDayOfMonth = makeGetSet('Date', true); - -// FORMATTING - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - -// ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - -// PRIORITY - addUnitPriority('dayOfYear', 4); - -// PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - -// HELPERS - -// MOMENTS - - function getSetDayOfYear(input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - } - -// FORMATTING - - addFormatToken('m', ['mm', 2], 0, 'minute'); - -// ALIASES - - addUnitAlias('minute', 'm'); - -// PRIORITY - - addUnitPriority('minute', 14); - -// PARSING - - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); - -// MOMENTS - - var getSetMinute = makeGetSet('Minutes', false); - -// FORMATTING - - addFormatToken('s', ['ss', 2], 0, 'second'); - -// ALIASES - - addUnitAlias('second', 's'); - -// PRIORITY - - addUnitPriority('second', 15); - -// PARSING - - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); - -// MOMENTS - - var getSetSecond = makeGetSet('Seconds', false); - -// FORMATTING - - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); - - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); - }); - - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); - - -// ALIASES - - addUnitAlias('millisecond', 'ms'); - -// PRIORITY - - addUnitPriority('millisecond', 16); - -// PARSING - - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); - - var token; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } - - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } - - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } -// MOMENTS - - var getSetMillisecond = makeGetSet('Milliseconds', false); - -// FORMATTING - - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); - -// MOMENTS - - function getZoneAbbr() { - return this._isUTC ? 'UTC' : ''; - } - - function getZoneName() { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } - - var proto = Moment.prototype; - - proto.add = add; - proto.calendar = calendar$1; - proto.clone = clone; - proto.diff = diff; - proto.endOf = endOf; - proto.format = format; - proto.from = from; - proto.fromNow = fromNow; - proto.to = to; - proto.toNow = toNow; - proto.get = stringGet; - proto.invalidAt = invalidAt; - proto.isAfter = isAfter; - proto.isBefore = isBefore; - proto.isBetween = isBetween; - proto.isSame = isSame; - proto.isSameOrAfter = isSameOrAfter; - proto.isSameOrBefore = isSameOrBefore; - proto.isValid = isValid$2; - proto.lang = lang; - proto.locale = locale; - proto.localeData = localeData; - proto.max = prototypeMax; - proto.min = prototypeMin; - proto.parsingFlags = parsingFlags; - proto.set = stringSet; - proto.startOf = startOf; - proto.subtract = subtract; - proto.toArray = toArray; - proto.toObject = toObject; - proto.toDate = toDate; - proto.toISOString = toISOString; - proto.inspect = inspect; - proto.toJSON = toJSON; - proto.toString = toString; - proto.unix = unix; - proto.valueOf = valueOf; - proto.creationData = creationData; - -// Year - proto.year = getSetYear; - proto.isLeapYear = getIsLeapYear; - -// Week Year - proto.weekYear = getSetWeekYear; - proto.isoWeekYear = getSetISOWeekYear; - -// Quarter - proto.quarter = proto.quarters = getSetQuarter; - -// Month - proto.month = getSetMonth; - proto.daysInMonth = getDaysInMonth; - -// Week - proto.week = proto.weeks = getSetWeek; - proto.isoWeek = proto.isoWeeks = getSetISOWeek; - proto.weeksInYear = getWeeksInYear; - proto.isoWeeksInYear = getISOWeeksInYear; - -// Day - proto.date = getSetDayOfMonth; - proto.day = proto.days = getSetDayOfWeek; - proto.weekday = getSetLocaleDayOfWeek; - proto.isoWeekday = getSetISODayOfWeek; - proto.dayOfYear = getSetDayOfYear; - -// Hour - proto.hour = proto.hours = getSetHour; - -// Minute - proto.minute = proto.minutes = getSetMinute; - -// Second - proto.second = proto.seconds = getSetSecond; - -// Millisecond - proto.millisecond = proto.milliseconds = getSetMillisecond; - -// Offset - proto.utcOffset = getSetOffset; - proto.utc = setOffsetToUTC; - proto.local = setOffsetToLocal; - proto.parseZone = setOffsetToParsedOffset; - proto.hasAlignedHourOffset = hasAlignedHourOffset; - proto.isDST = isDaylightSavingTime; - proto.isLocal = isLocal; - proto.isUtcOffset = isUtcOffset; - proto.isUtc = isUtc; - proto.isUTC = isUtc; - -// Timezone - proto.zoneAbbr = getZoneAbbr; - proto.zoneName = getZoneName; - -// Deprecations - proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); - proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); - proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); - proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); - proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); - - function createUnix(input) { - return createLocal(input * 1000); - } - - function createInZone() { - return createLocal.apply(null, arguments).parseZone(); - } - - function preParsePostFormat(string) { - return string; - } - - var proto$1 = Locale.prototype; - - proto$1.calendar = calendar; - proto$1.longDateFormat = longDateFormat; - proto$1.invalidDate = invalidDate; - proto$1.ordinal = ordinal; - proto$1.preparse = preParsePostFormat; - proto$1.postformat = preParsePostFormat; - proto$1.relativeTime = relativeTime; - proto$1.pastFuture = pastFuture; - proto$1.set = set; - -// Month - proto$1.months = localeMonths; - proto$1.monthsShort = localeMonthsShort; - proto$1.monthsParse = localeMonthsParse; - proto$1.monthsRegex = monthsRegex; - proto$1.monthsShortRegex = monthsShortRegex; - -// Week - proto$1.week = localeWeek; - proto$1.firstDayOfYear = localeFirstDayOfYear; - proto$1.firstDayOfWeek = localeFirstDayOfWeek; - -// Day of Week - proto$1.weekdays = localeWeekdays; - proto$1.weekdaysMin = localeWeekdaysMin; - proto$1.weekdaysShort = localeWeekdaysShort; - proto$1.weekdaysParse = localeWeekdaysParse; - - proto$1.weekdaysRegex = weekdaysRegex; - proto$1.weekdaysShortRegex = weekdaysShortRegex; - proto$1.weekdaysMinRegex = weekdaysMinRegex; - -// Hours - proto$1.isPM = localeIsPM; - proto$1.meridiem = localeMeridiem; - - function get$1(format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); - } - - function listMonthsImpl(format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - - if (index != null) { - return get$1(format, index, field, 'month'); - } - - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; - } - -// () -// (5) -// (fmt, 5) -// (fmt) -// (true) -// (true, 5) -// (true, fmt, 5) -// (true, fmt) - function listWeekdaysImpl(localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; - - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } - - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; - - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); - } - - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; - } - - function listMonths(format, index) { - return listMonthsImpl(format, index, 'months'); - } - - function listMonthsShort(format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - - function listWeekdays(localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } - - function listWeekdaysShort(localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } - - function listWeekdaysMin(localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } - - getSetGlobalLocale('en', { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal: function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - -// Side effect imports - hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); - hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - - var mathAbs = Math.abs; - - function abs() { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } - - function addSubtract$1(duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); - } - -// supports only 2.0-style add(1, 's') or add(duration) - function add$1(input, value) { - return addSubtract$1(this, input, value, 1); - } - -// supports only 2.0-style subtract(1, 's') or subtract(duration) - function subtract$1(input, value) { - return addSubtract$1(this, input, value, -1); - } - - function absCeil(number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - - function bubble() { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; - } - - function daysToMonths(days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; - } - - function monthsToDays(months) { - // the reverse of daysToMonths - return months * 146097 / 4800; - } - - function as(units) { - if (!this.isValid()) { - return NaN; - } - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : - return days / 7 + milliseconds / 6048e5; - case 'day' : - return days + milliseconds / 864e5; - case 'hour' : - return days * 24 + milliseconds / 36e5; - case 'minute' : - return days * 1440 + milliseconds / 6e4; - case 'second' : - return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': - return Math.floor(days * 864e5) + milliseconds; - default: - throw new Error('Unknown unit ' + units); - } - } - } - -// TODO: Use this.as('ms')? - function valueOf$1() { - if (!this.isValid()) { - return NaN; - } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs(alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'); - var asSeconds = makeAs('s'); - var asMinutes = makeAs('m'); - var asHours = makeAs('h'); - var asDays = makeAs('d'); - var asWeeks = makeAs('w'); - var asMonths = makeAs('M'); - var asYears = makeAs('y'); - - function get$2(units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; - } - - function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; - } - - var milliseconds = makeGetter('milliseconds'); - var seconds = makeGetter('seconds'); - var minutes = makeGetter('minutes'); - var hours = makeGetter('hours'); - var days = makeGetter('days'); - var months = makeGetter('months'); - var years = makeGetter('years'); - - function weeks() { - return absFloor(this.days() / 7); - } - - var round = Math.round; - var thresholds = { - ss: 44, // a few seconds to seconds - s: 45, // seconds to minute - m: 45, // minutes to hour - h: 22, // hours to day - d: 26, // days to month - M: 11 // months to year - }; - -// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function relativeTime$1(posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); - - var a = seconds <= thresholds.ss && ['s', seconds] || - seconds < thresholds.s && ['ss', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - -// This function allows you to set the rounding function for relative time strings - function getSetRelativeTimeRounding(roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; - return true; - } - return false; - } - -// This function allows you to set a threshold for relative time strings - function getSetRelativeTimeThreshold(threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; - } - - function humanize(withSuffix) { - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } - - return locale.postformat(output); - } - - var abs$1 = Math.abs; - - function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; - - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds; - var total = this.asSeconds(); - - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - return (total < 0 ? '-' : '') + - 'P' + - (Y ? Y + 'Y' : '') + - (M ? M + 'M' : '') + - (D ? D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? h + 'H' : '') + - (m ? m + 'M' : '') + - (s ? s + 'S' : ''); - } - - var proto$2 = Duration.prototype; - - proto$2.isValid = isValid$1; - proto$2.abs = abs; - proto$2.add = add$1; - proto$2.subtract = subtract$1; - proto$2.as = as; - proto$2.asMilliseconds = asMilliseconds; - proto$2.asSeconds = asSeconds; - proto$2.asMinutes = asMinutes; - proto$2.asHours = asHours; - proto$2.asDays = asDays; - proto$2.asWeeks = asWeeks; - proto$2.asMonths = asMonths; - proto$2.asYears = asYears; - proto$2.valueOf = valueOf$1; - proto$2._bubble = bubble; - proto$2.get = get$2; - proto$2.milliseconds = milliseconds; - proto$2.seconds = seconds; - proto$2.minutes = minutes; - proto$2.hours = hours; - proto$2.days = days; - proto$2.weeks = weeks; - proto$2.months = months; - proto$2.years = years; - proto$2.humanize = humanize; - proto$2.toISOString = toISOString$1; - proto$2.toString = toISOString$1; - proto$2.toJSON = toISOString$1; - proto$2.locale = locale; - proto$2.localeData = localeData; - -// Deprecations - proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); - proto$2.lang = lang; - -// Side effect imports - -// FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - -// PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - -// Side effect imports - - - hooks.version = '2.18.1'; - - setHookCallback(createLocal); - - hooks.fn = proto; - hooks.min = min; - hooks.max = max; - hooks.now = now; - hooks.utc = createUTC; - hooks.unix = createUnix; - hooks.months = listMonths; - hooks.isDate = isDate; - hooks.locale = getSetGlobalLocale; - hooks.invalid = createInvalid; - hooks.duration = createDuration; - hooks.isMoment = isMoment; - hooks.weekdays = listWeekdays; - hooks.parseZone = createInZone; - hooks.localeData = getLocale; - hooks.isDuration = isDuration; - hooks.monthsShort = listMonthsShort; - hooks.weekdaysMin = listWeekdaysMin; - hooks.defineLocale = defineLocale; - hooks.updateLocale = updateLocale; - hooks.locales = listLocales; - hooks.weekdaysShort = listWeekdaysShort; - hooks.normalizeUnits = normalizeUnits; - hooks.relativeTimeRounding = getSetRelativeTimeRounding; - hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; - hooks.calendarFormat = getCalendarFormat; - hooks.prototype = proto; - - return hooks; - - }))); - - }, {}], 7: [function (require, module, exports) { - /** - * @namespace Chart - */ - var Chart = require(29)(); - - Chart.helpers = require(45); - -// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! - require(27)(Chart); - - Chart.defaults = require(25); - Chart.Element = require(26); - Chart.elements = require(40); - Chart.Interaction = require(28); - Chart.platform = require(48); - - require(31)(Chart); - require(22)(Chart); - require(23)(Chart); - require(24)(Chart); - require(30)(Chart); - require(33)(Chart); - require(32)(Chart); - require(35)(Chart); - - require(54)(Chart); - require(52)(Chart); - require(53)(Chart); - require(55)(Chart); - require(56)(Chart); - require(57)(Chart); - -// Controllers must be loaded after elements -// See Chart.core.datasetController.dataElementType - require(15)(Chart); - require(16)(Chart); - require(17)(Chart); - require(18)(Chart); - require(19)(Chart); - require(20)(Chart); - require(21)(Chart); - - require(8)(Chart); - require(9)(Chart); - require(10)(Chart); - require(11)(Chart); - require(12)(Chart); - require(13)(Chart); - require(14)(Chart); - -// Loading built-it plugins - var plugins = []; - - plugins.push( - require(49)(Chart), - require(50)(Chart), - require(51)(Chart) - ); - - Chart.plugins.register(plugins); - - Chart.platform.initialize(); - - module.exports = Chart; - if (typeof window !== 'undefined') { - window.Chart = Chart; - } - -// DEPRECATIONS - - /** - * Provided for backward compatibility, use Chart.helpers.canvas instead. - * @namespace Chart.canvasHelpers - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - Chart.canvasHelpers = Chart.helpers.canvas; - - }, { - "10": 10, - "11": 11, - "12": 12, - "13": 13, - "14": 14, - "15": 15, - "16": 16, - "17": 17, - "18": 18, - "19": 19, - "20": 20, - "21": 21, - "22": 22, - "23": 23, - "24": 24, - "25": 25, - "26": 26, - "27": 27, - "28": 28, - "29": 29, - "30": 30, - "31": 31, - "32": 32, - "33": 33, - "35": 35, - "40": 40, - "45": 45, - "48": 48, - "49": 49, - "50": 50, - "51": 51, - "52": 52, - "53": 53, - "54": 54, - "55": 55, - "56": 56, - "57": 57, - "8": 8, - "9": 9 - }], 8: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - Chart.Bar = function (context, config) { - config.type = 'bar'; - - return new Chart(context, config); - }; - - }; - - }, {}], 9: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - Chart.Bubble = function (context, config) { - config.type = 'bubble'; - return new Chart(context, config); - }; - - }; - - }, {}], 10: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - Chart.Doughnut = function (context, config) { - config.type = 'doughnut'; - - return new Chart(context, config); - }; - - }; - - }, {}], 11: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - Chart.Line = function (context, config) { - config.type = 'line'; - - return new Chart(context, config); - }; - - }; - - }, {}], 12: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - Chart.PolarArea = function (context, config) { - config.type = 'polarArea'; - - return new Chart(context, config); - }; - - }; - - }, {}], 13: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - Chart.Radar = function (context, config) { - config.type = 'radar'; - - return new Chart(context, config); - }; - - }; - - }, {}], 14: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - Chart.Scatter = function (context, config) { - config.type = 'scatter'; - return new Chart(context, config); - }; - }; - - }, {}], 15: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('bar', { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - - // Specific to Bar Controller - categoryPercentage: 0.8, - barPercentage: 0.9, - - // offset settings - offset: true, - - // grid line settings - gridLines: { - offsetGridLines: true - } - }], - - yAxes: [{ - type: 'linear' - }] - } - }); - - defaults._set('horizontalBar', { - hover: { - mode: 'index', - axis: 'y' - }, - - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }], - - yAxes: [{ - position: 'left', - type: 'category', - - // Specific to Horizontal Bar Controller - categoryPercentage: 0.8, - barPercentage: 0.9, - - // offset settings - offset: true, - - // grid line settings - gridLines: { - offsetGridLines: true - } - }] - }, - - elements: { - rectangle: { - borderSkipped: 'left' - } - }, - - tooltips: { - callbacks: { - title: function (item, data) { - // Pick first xLabel for now - var title = ''; - - if (item.length > 0) { - if (item[0].yLabel) { - title = item[0].yLabel; - } else if (data.labels.length > 0 && item[0].index < data.labels.length) { - title = data.labels[item[0].index]; - } - } - - return title; - }, - - label: function (item, data) { - var datasetLabel = data.datasets[item.datasetIndex].label || ''; - return datasetLabel + ': ' + item.xLabel; - } - }, - mode: 'index', - axis: 'y' - } - }); - - module.exports = function (Chart) { - - Chart.controllers.bar = Chart.DatasetController.extend({ - - dataElementType: elements.Rectangle, - - initialize: function () { - var me = this; - var meta; - - Chart.DatasetController.prototype.initialize.apply(me, arguments); - - meta = me.getMeta(); - meta.stack = me.getDataset().stack; - meta.bar = true; - }, - - update: function (reset) { - var me = this; - var rects = me.getMeta().data; - var i, ilen; - - me._ruler = me.getRuler(); - - for (i = 0, ilen = rects.length; i < ilen; ++i) { - me.updateElement(rects[i], i, reset); - } - }, - - updateElement: function (rectangle, index, reset) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var dataset = me.getDataset(); - var custom = rectangle.custom || {}; - var rectangleOptions = chart.options.elements.rectangle; - - rectangle._xScale = me.getScaleForId(meta.xAxisID); - rectangle._yScale = me.getScaleForId(meta.yAxisID); - rectangle._datasetIndex = me.index; - rectangle._index = index; - - rectangle._model = { - datasetLabel: dataset.label, - label: chart.data.labels[index], - borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped, - backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor), - borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor), - borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth) - }; - - me.updateElementGeometry(rectangle, index, reset); - - rectangle.pivot(); - }, - - /** - * @private - */ - updateElementGeometry: function (rectangle, index, reset) { - var me = this; - var model = rectangle._model; - var vscale = me.getValueScale(); - var base = vscale.getBasePixel(); - var horizontal = vscale.isHorizontal(); - var ruler = me._ruler || me.getRuler(); - var vpixels = me.calculateBarValuePixels(me.index, index); - var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); - - model.horizontal = horizontal; - model.base = reset ? base : vpixels.base; - model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; - model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; - model.height = horizontal ? ipixels.size : undefined; - model.width = horizontal ? undefined : ipixels.size; - }, - - /** - * @private - */ - getValueScaleId: function () { - return this.getMeta().yAxisID; - }, - - /** - * @private - */ - getIndexScaleId: function () { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - getValueScale: function () { - return this.getScaleForId(this.getValueScaleId()); - }, - - /** - * @private - */ - getIndexScale: function () { - return this.getScaleForId(this.getIndexScaleId()); - }, - - /** - * Returns the effective number of stacks based on groups and bar visibility. - * @private - */ - getStackCount: function (last) { - var me = this; - var chart = me.chart; - var scale = me.getIndexScale(); - var stacked = scale.options.stacked; - var ilen = last === undefined ? chart.data.datasets.length : last + 1; - var stacks = []; - var i, meta; - - for (i = 0; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - if (meta.bar && chart.isDatasetVisible(i) && - (stacked === false || - (stacked === true && stacks.indexOf(meta.stack) === -1) || - (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { - stacks.push(meta.stack); - } - } - - return stacks.length; - }, - - /** - * Returns the stack index for the given dataset based on groups and bar visibility. - * @private - */ - getStackIndex: function (datasetIndex) { - return this.getStackCount(datasetIndex) - 1; - }, - - /** - * @private - */ - getRuler: function () { - var me = this; - var scale = me.getIndexScale(); - var stackCount = me.getStackCount(); - var datasetIndex = me.index; - var pixels = []; - var isHorizontal = scale.isHorizontal(); - var start = isHorizontal ? scale.left : scale.top; - var end = start + (isHorizontal ? scale.width : scale.height); - var i, ilen; - - for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { - pixels.push(scale.getPixelForValue(null, i, datasetIndex)); - } - - return { - pixels: pixels, - start: start, - end: end, - stackCount: stackCount, - scale: scale - }; - }, - - /** - * Note: pixel values are not clamped to the scale area. - * @private - */ - calculateBarValuePixels: function (datasetIndex, index) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var scale = me.getValueScale(); - var datasets = chart.data.datasets; - var value = scale.getRightValue(datasets[datasetIndex].data[index]); - var stacked = scale.options.stacked; - var stack = meta.stack; - var start = 0; - var i, imeta, ivalue, base, head, size; - - if (stacked || (stacked === undefined && stack !== undefined)) { - for (i = 0; i < datasetIndex; ++i) { - imeta = chart.getDatasetMeta(i); - - if (imeta.bar && - imeta.stack === stack && - imeta.controller.getValueScaleId() === scale.id && - chart.isDatasetVisible(i)) { - - ivalue = scale.getRightValue(datasets[i].data[index]); - if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { - start += ivalue; - } - } - } - } - - base = scale.getPixelForValue(start); - head = scale.getPixelForValue(start + value); - size = (head - base) / 2; - - return { - size: size, - base: base, - head: head, - center: head + size / 2 - }; - }, - - /** - * @private - */ - calculateBarIndexPixels: function (datasetIndex, index, ruler) { - var me = this; - var options = ruler.scale.options; - var stackIndex = me.getStackIndex(datasetIndex); - var pixels = ruler.pixels; - var base = pixels[index]; - var length = pixels.length; - var start = ruler.start; - var end = ruler.end; - var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size; - - if (length === 1) { - leftSampleSize = base > start ? base - start : end - base; - rightSampleSize = base < end ? end - base : base - start; - } else { - if (index > 0) { - leftSampleSize = (base - pixels[index - 1]) / 2; - if (index === length - 1) { - rightSampleSize = leftSampleSize; - } - } - if (index < length - 1) { - rightSampleSize = (pixels[index + 1] - base) / 2; - if (index === 0) { - leftSampleSize = rightSampleSize; - } - } - } - - leftCategorySize = leftSampleSize * options.categoryPercentage; - rightCategorySize = rightSampleSize * options.categoryPercentage; - fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount; - size = fullBarSize * options.barPercentage; - - size = Math.min( - helpers.valueOrDefault(options.barThickness, size), - helpers.valueOrDefault(options.maxBarThickness, Infinity)); - - base -= leftCategorySize; - base += fullBarSize * stackIndex; - base += (fullBarSize - size) / 2; - - return { - size: size, - base: base, - head: base + size, - center: base + size / 2 - }; - }, - - draw: function () { - var me = this; - var chart = me.chart; - var scale = me.getValueScale(); - var rects = me.getMeta().data; - var dataset = me.getDataset(); - var ilen = rects.length; - var i = 0; - - helpers.canvas.clipArea(chart.ctx, chart.chartArea); - - for (; i < ilen; ++i) { - if (!isNaN(scale.getRightValue(dataset.data[i]))) { - rects[i].draw(); - } - } - - helpers.canvas.unclipArea(chart.ctx); - }, - - setHoverStyle: function (rectangle) { - var dataset = this.chart.data.datasets[rectangle._datasetIndex]; - var index = rectangle._index; - var custom = rectangle.custom || {}; - var model = rectangle._model; - - model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); - model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); - model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); - }, - - removeHoverStyle: function (rectangle) { - var dataset = this.chart.data.datasets[rectangle._datasetIndex]; - var index = rectangle._index; - var custom = rectangle.custom || {}; - var model = rectangle._model; - var rectangleElementOptions = this.chart.options.elements.rectangle; - - model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); - model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); - model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); - } - }); - - Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ - /** - * @private - */ - getValueScaleId: function () { - return this.getMeta().xAxisID; - }, - - /** - * @private - */ - getIndexScaleId: function () { - return this.getMeta().yAxisID; - } - }); - }; - - }, {"25": 25, "40": 40, "45": 45}], 16: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('bubble', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // bubble should probably use a linear scale by default - position: 'bottom', - id: 'x-axis-0' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-0' - }] - }, - - tooltips: { - callbacks: { - title: function () { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function (item, data) { - var datasetLabel = data.datasets[item.datasetIndex].label || ''; - var dataPoint = data.datasets[item.datasetIndex].data[item.index]; - return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; - } - } - } - }); - - - module.exports = function (Chart) { - - Chart.controllers.bubble = Chart.DatasetController.extend({ - /** - * @protected - */ - dataElementType: elements.Point, - - /** - * @protected - */ - update: function (reset) { - var me = this; - var meta = me.getMeta(); - var points = meta.data; - - // Update Points - helpers.each(points, function (point, index) { - me.updateElement(point, index, reset); - }); - }, - - /** - * @protected - */ - updateElement: function (point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var options = me._resolveElementOptions(point, index); - var data = me.getDataset().data[index]; - var dsIndex = me.index; - - var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); - var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); - - point._xScale = xScale; - point._yScale = yScale; - point._options = options; - point._datasetIndex = dsIndex; - point._index = index; - point._model = { - backgroundColor: options.backgroundColor, - borderColor: options.borderColor, - borderWidth: options.borderWidth, - hitRadius: options.hitRadius, - pointStyle: options.pointStyle, - radius: reset ? 0 : options.radius, - skip: custom.skip || isNaN(x) || isNaN(y), - x: x, - y: y, - }; - - point.pivot(); - }, - - /** - * @protected - */ - setHoverStyle: function (point) { - var model = point._model; - var options = point._options; - - model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor)); - model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor)); - model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth); - model.radius = options.radius + options.hoverRadius; - }, - - /** - * @protected - */ - removeHoverStyle: function (point) { - var model = point._model; - var options = point._options; - - model.backgroundColor = options.backgroundColor; - model.borderColor = options.borderColor; - model.borderWidth = options.borderWidth; - model.radius = options.radius; - }, - - /** - * @private - */ - _resolveElementOptions: function (point, index) { - var me = this; - var chart = me.chart; - var datasets = chart.data.datasets; - var dataset = datasets[me.index]; - var custom = point.custom || {}; - var options = chart.options.elements.point; - var resolve = helpers.options.resolve; - var data = dataset.data[index]; - var values = {}; - var i, ilen, key; - - // Scriptable options - var context = { - chart: chart, - dataIndex: index, - dataset: dataset, - datasetIndex: me.index - }; - - var keys = [ - 'backgroundColor', - 'borderColor', - 'borderWidth', - 'hoverBackgroundColor', - 'hoverBorderColor', - 'hoverBorderWidth', - 'hoverRadius', - 'hitRadius', - 'pointStyle' - ]; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - values[key] = resolve([ - custom[key], - dataset[key], - options[key] - ], context, index); - } - - // Custom radius resolution - values.radius = resolve([ - custom.radius, - data ? data.r : undefined, - dataset.radius, - options.radius - ], context, index); - - return values; - } - }); - }; - - }, {"25": 25, "40": 40, "45": 45}], 17: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('doughnut', { - animation: { - // Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - // Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - hover: { - mode: 'single' - }, - legendCallback: function (chart) { - var text = []; - text.push('

    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function (chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function (label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc && arc.custom || {}; - var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - var arcOpts = chart.options.elements.arc; - var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); - var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); - var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function (e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - // toggle visibility of index if exists - if (meta.data[index]) { - meta.data[index].hidden = !meta.data[index].hidden; - } - } - - chart.update(); - } - }, - - // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - // The rotation of the chart, where the first data arc begins. - rotation: Math.PI * -0.5, - - // The total circumference of the chart. - circumference: Math.PI * 2.0, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function () { - return ''; - }, - label: function (tooltipItem, data) { - var dataLabel = data.labels[tooltipItem.index]; - var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - - if (helpers.isArray(dataLabel)) { - // show value on first line of multiline label - // need to clone because we are changing the value - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } - } - }); - - defaults._set('pie', helpers.clone(defaults.doughnut)); - defaults._set('pie', { - cutoutPercentage: 0 - }); - - module.exports = function (Chart) { - - Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers.noop, - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function (datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function (reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var arcOpts = opts.elements.arc; - var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth; - var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth; - var minSize = Math.min(availableWidth, availableHeight); - var offset = {x: 0, y: 0}; - var meta = me.getMeta(); - var cutoutPercentage = opts.cutoutPercentage; - var circumference = opts.circumference; - - // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc - if (circumference < Math.PI * 2.0) { - var startAngle = opts.rotation % (Math.PI * 2.0); - startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); - var endAngle = startAngle + circumference; - var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; - var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; - var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); - var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); - var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); - var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); - var cutout = cutoutPercentage / 100.0; - var min = { - x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), - y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout)) - }; - var max = { - x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), - y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout)) - }; - var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; - minSize = Math.min(availableWidth / size.width, availableHeight / size.height); - offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; - } - - chart.borderWidth = me.getMaxBorderWidth(meta.data); - chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); - chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - chart.offsetX = offset.x * chart.outerRadius; - chart.offsetY = offset.y * chart.outerRadius; - - meta.total = me.calculateTotal(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index)); - me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0); - - helpers.each(meta.data, function (arc, index) { - me.updateElement(arc, index, reset); - }); - }, - - updateElement: function (arc, index, reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var opts = chart.options; - var animationOpts = opts.animation; - var centerX = (chartArea.left + chartArea.right) / 2; - var centerY = (chartArea.top + chartArea.bottom) / 2; - var startAngle = opts.rotation; // non reset case handled later - var endAngle = opts.rotation; // non reset case handled later - var dataset = me.getDataset(); - var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); - var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; - var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; - var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - - helpers.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - - // Desired view properties - _model: { - x: centerX + chart.offsetX, - y: centerY + chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) - } - }); - - var model = arc._model; - // Resets the visual styles - this.removeHoverStyle(arc); - - // Set correct angles if not resetting - if (!reset || !animationOpts.animateRotate) { - if (index === 0) { - model.startAngle = opts.rotation; - } else { - model.startAngle = me.getMeta().data[index - 1]._model.endAngle; - } - - model.endAngle = model.startAngle + model.circumference; - } - - arc.pivot(); - }, - - removeHoverStyle: function (arc) { - Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); - }, - - calculateTotal: function () { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers.each(meta.data, function (element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - /* if (total === 0) { - total = NaN; - }*/ - - return total; - }, - - calculateCircumference: function (value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return (Math.PI * 2.0) * (value / total); - } - return 0; - }, - - // gets the max border or hover width to properly scale pie charts - getMaxBorderWidth: function (arcs) { - var max = 0; - var index = this.index; - var length = arcs.length; - var borderWidth; - var hoverWidth; - - for (var i = 0; i < length; i++) { - borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0; - hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0; - - max = borderWidth > max ? borderWidth : max; - max = hoverWidth > max ? hoverWidth : max; - } - return max; - } - }); - }; - - }, {"25": 25, "40": 40, "45": 45}], 18: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('line', { - showLines: true, - spanGaps: false, - - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - id: 'x-axis-0' - }], - yAxes: [{ - type: 'linear', - id: 'y-axis-0' - }] - } - }); - - module.exports = function (Chart) { - - function lineEnabled(dataset, options) { - return helpers.valueOrDefault(dataset.showLine, options.showLines); - } - - Chart.controllers.line = Chart.DatasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - update: function (reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var options = me.chart.options; - var lineElementOptions = options.elements.line; - var scale = me.getScaleForId(meta.yAxisID); - var i, ilen, custom; - var dataset = me.getDataset(); - var showLine = lineEnabled(dataset, options); - - // Update Line - if (showLine) { - custom = line.custom || {}; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - // Model - line._model = { - // Appearance - // The default behavior of lines is to break at null values, according - // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 - // This option gives lines the ability to span gaps - spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps, - tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), - borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), - borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), - borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), - borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), - borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), - borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), - fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), - steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped), - cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode), - }; - - line.pivot(); - } - - // Update Points - for (i = 0, ilen = points.length; i < ilen; ++i) { - me.updateElement(points[i], i, reset); - } - - if (showLine && line._model.tension !== 0) { - me.updateBezierControlPoints(); - } - - // Now pivot the point for animation - for (i = 0, ilen = points.length; i < ilen; ++i) { - points[i].pivot(); - } - }, - - getPointBackgroundColor: function (point, index) { - var backgroundColor = this.chart.options.elements.point.backgroundColor; - var dataset = this.getDataset(); - var custom = point.custom || {}; - - if (custom.backgroundColor) { - backgroundColor = custom.backgroundColor; - } else if (dataset.pointBackgroundColor) { - backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor); - } else if (dataset.backgroundColor) { - backgroundColor = dataset.backgroundColor; - } - - return backgroundColor; - }, - - getPointBorderColor: function (point, index) { - var borderColor = this.chart.options.elements.point.borderColor; - var dataset = this.getDataset(); - var custom = point.custom || {}; - - if (custom.borderColor) { - borderColor = custom.borderColor; - } else if (dataset.pointBorderColor) { - borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor); - } else if (dataset.borderColor) { - borderColor = dataset.borderColor; - } - - return borderColor; - }, - - getPointBorderWidth: function (point, index) { - var borderWidth = this.chart.options.elements.point.borderWidth; - var dataset = this.getDataset(); - var custom = point.custom || {}; - - if (!isNaN(custom.borderWidth)) { - borderWidth = custom.borderWidth; - } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) { - borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth); - } else if (!isNaN(dataset.borderWidth)) { - borderWidth = dataset.borderWidth; - } - - return borderWidth; - }, - - updateElement: function (point, index, reset) { - var me = this; - var meta = me.getMeta(); - var custom = point.custom || {}; - var dataset = me.getDataset(); - var datasetIndex = me.index; - var value = dataset.data[index]; - var yScale = me.getScaleForId(meta.yAxisID); - var xScale = me.getScaleForId(meta.xAxisID); - var pointOptions = me.chart.options.elements.point; - var x, y; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { - dataset.pointRadius = dataset.radius; - } - if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { - dataset.pointHitRadius = dataset.hitRadius; - } - - x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); - y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); - - // Utility - point._xScale = xScale; - point._yScale = yScale; - point._datasetIndex = datasetIndex; - point._index = index; - - // Desired view properties - point._model = { - x: x, - y: y, - skip: custom.skip || isNaN(x) || isNaN(y), - // Appearance - radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius), - pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle), - backgroundColor: me.getPointBackgroundColor(point, index), - borderColor: me.getPointBorderColor(point, index), - borderWidth: me.getPointBorderWidth(point, index), - tension: meta.dataset._model ? meta.dataset._model.tension : 0, - steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false, - // Tooltip - hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius) - }; - }, - - calculatePointY: function (value, index, datasetIndex) { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var sumPos = 0; - var sumNeg = 0; - var i, ds, dsMeta; - - if (yScale.options.stacked) { - for (i = 0; i < datasetIndex; i++) { - ds = chart.data.datasets[i]; - dsMeta = chart.getDatasetMeta(i); - if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { - var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); - if (stackedRightValue < 0) { - sumNeg += stackedRightValue || 0; - } else { - sumPos += stackedRightValue || 0; - } - } - } - - var rightValue = Number(yScale.getRightValue(value)); - if (rightValue < 0) { - return yScale.getPixelForValue(sumNeg + rightValue); - } - return yScale.getPixelForValue(sumPos + rightValue); - } - - return yScale.getPixelForValue(value); - }, - - updateBezierControlPoints: function () { - var me = this; - var meta = me.getMeta(); - var area = me.chart.chartArea; - var points = (meta.data || []); - var i, ilen, point, model, controlPoints; - - // Only consider points that are drawn in case the spanGaps option is used - if (meta.dataset._model.spanGaps) { - points = points.filter(function (pt) { - return !pt._model.skip; - }); - } - - function capControlPoint(pt, min, max) { - return Math.max(Math.min(pt, max), min); - } - - if (meta.dataset._model.cubicInterpolationMode === 'monotone') { - helpers.splineCurveMonotone(points); - } else { - for (i = 0, ilen = points.length; i < ilen; ++i) { - point = points[i]; - model = point._model; - controlPoints = helpers.splineCurve( - helpers.previousItem(points, i)._model, - model, - helpers.nextItem(points, i)._model, - meta.dataset._model.tension - ); - model.controlPointPreviousX = controlPoints.previous.x; - model.controlPointPreviousY = controlPoints.previous.y; - model.controlPointNextX = controlPoints.next.x; - model.controlPointNextY = controlPoints.next.y; - } - } - - if (me.chart.options.elements.line.capBezierPoints) { - for (i = 0, ilen = points.length; i < ilen; ++i) { - model = points[i]._model; - model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); - model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); - model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); - model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); - } - } - }, - - draw: function () { - var me = this; - var chart = me.chart; - var meta = me.getMeta(); - var points = meta.data || []; - var area = chart.chartArea; - var ilen = points.length; - var i = 0; - - helpers.canvas.clipArea(chart.ctx, area); - - if (lineEnabled(me.getDataset(), chart.options)) { - meta.dataset.draw(); - } - - helpers.canvas.unclipArea(chart.ctx); - - // Draw the points - for (; i < ilen; ++i) { - points[i].draw(area); - } - }, - - setHoverStyle: function (point) { - // Point - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - var custom = point.custom || {}; - var model = point._model; - - model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); - model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); - model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); - model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); - }, - - removeHoverStyle: function (point) { - var me = this; - var dataset = me.chart.data.datasets[point._datasetIndex]; - var index = point._index; - var custom = point.custom || {}; - var model = point._model; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { - dataset.pointRadius = dataset.radius; - } - - model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius); - model.backgroundColor = me.getPointBackgroundColor(point, index); - model.borderColor = me.getPointBorderColor(point, index); - model.borderWidth = me.getPointBorderWidth(point, index); - } - }); - }; - - }, {"25": 25, "40": 40, "45": 45}], 19: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('polarArea', { - scale: { - type: 'radialLinear', - angleLines: { - display: false - }, - gridLines: { - circular: true - }, - pointLabels: { - display: false - }, - ticks: { - beginAtZero: true - } - }, - - // Boolean - Whether to animate the rotation of the chart - animation: { - animateRotate: true, - animateScale: true - }, - - startAngle: -0.5 * Math.PI, - legendCallback: function (chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function (chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function (label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc.custom || {}; - var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - var arcOpts = chart.options.elements.arc; - var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); - var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); - var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function (e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function () { - return ''; - }, - label: function (item, data) { - return data.labels[item.index] + ': ' + item.yLabel; - } - } - } - }); - - module.exports = function (Chart) { - - Chart.controllers.polarArea = Chart.DatasetController.extend({ - - dataElementType: elements.Arc, - - linkScales: helpers.noop, - - update: function (reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var meta = me.getMeta(); - var opts = chart.options; - var arcOpts = opts.elements.arc; - var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); - chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); - chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); - me.innerRadius = me.outerRadius - chart.radiusLength; - - meta.count = me.countVisibleElements(); - - helpers.each(meta.data, function (arc, index) { - me.updateElement(arc, index, reset); - }); - }, - - updateElement: function (arc, index, reset) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var opts = chart.options; - var animationOpts = opts.animation; - var scale = chart.scale; - var labels = chart.data.labels; - - var circumference = me.calculateCircumference(dataset.data[index]); - var centerX = scale.xCenter; - var centerY = scale.yCenter; - - // If there is NaN data before us, we need to calculate the starting angle correctly. - // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data - var visibleCount = 0; - var meta = me.getMeta(); - for (var i = 0; i < index; ++i) { - if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { - ++visibleCount; - } - } - - // var negHalfPI = -0.5 * Math.PI; - var datasetStartAngle = opts.startAngle; - var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var startAngle = datasetStartAngle + (circumference * visibleCount); - var endAngle = startAngle + (arc.hidden ? 0 : circumference); - - var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - - helpers.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: reset ? resetRadius : distance, - startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, - endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, - label: helpers.valueAtIndexOrDefault(labels, index, labels[index]) - } - }); - - // Apply border and fill style - me.removeHoverStyle(arc); - - arc.pivot(); - }, - - removeHoverStyle: function (arc) { - Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); - }, - - countVisibleElements: function () { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers.each(meta.data, function (element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - calculateCircumference: function (value) { - var count = this.getMeta().count; - if (count > 0 && !isNaN(value)) { - return (2 * Math.PI) / count; - } - return 0; - } - }); - }; - - }, {"25": 25, "40": 40, "45": 45}], 20: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('radar', { - scale: { - type: 'radialLinear' - }, - elements: { - line: { - tension: 0 // no bezier in radar - } - } - }); - - module.exports = function (Chart) { - - Chart.controllers.radar = Chart.DatasetController.extend({ - - datasetElementType: elements.Line, - - dataElementType: elements.Point, - - linkScales: helpers.noop, - - update: function (reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data; - var custom = line.custom || {}; - var dataset = me.getDataset(); - var lineElementOptions = me.chart.options.elements.line; - var scale = me.chart.scale; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - helpers.extend(meta.dataset, { - // Utility - _datasetIndex: me.index, - _scale: scale, - // Data - _children: points, - _loop: true, - // Model - _model: { - // Appearance - tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), - borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), - borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), - fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), - borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), - borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), - borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), - borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), - } - }); - - meta.dataset.pivot(); - - // Update Points - helpers.each(points, function (point, index) { - me.updateElement(point, index, reset); - }, me); - - // Update bezier control points - me.updateBezierControlPoints(); - }, - updateElement: function (point, index, reset) { - var me = this; - var custom = point.custom || {}; - var dataset = me.getDataset(); - var scale = me.chart.scale; - var pointElementOptions = me.chart.options.elements.point; - var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { - dataset.pointRadius = dataset.radius; - } - if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { - dataset.pointHitRadius = dataset.hitRadius; - } - - helpers.extend(point, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales - y: reset ? scale.yCenter : pointPosition.y, - - // Appearance - tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension), - radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), - borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), - borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), - pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), - - // Tooltip - hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius) - } - }); - - point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); - }, - updateBezierControlPoints: function () { - var chartArea = this.chart.chartArea; - var meta = this.getMeta(); - - helpers.each(meta.data, function (point, index) { - var model = point._model; - var controlPoints = helpers.splineCurve( - helpers.previousItem(meta.data, index, true)._model, - model, - helpers.nextItem(meta.data, index, true)._model, - model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); - model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); - - model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); - model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); - - // Now pivot the point for animation - point.pivot(); - }); - }, - - setHoverStyle: function (point) { - // Point - var dataset = this.chart.data.datasets[point._datasetIndex]; - var custom = point.custom || {}; - var index = point._index; - var model = point._model; - - model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); - model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); - model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); - model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); - }, - - removeHoverStyle: function (point) { - var dataset = this.chart.data.datasets[point._datasetIndex]; - var custom = point.custom || {}; - var index = point._index; - var model = point._model; - var pointElementOptions = this.chart.options.elements.point; - - model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius); - model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); - model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); - model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); - } - }); - }; - - }, {"25": 25, "40": 40, "45": 45}], 21: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - - defaults._set('scatter', { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - id: 'x-axis-1', // need an ID so datasets can reference the scale - type: 'linear', // scatter should not use a category axis - position: 'bottom' - }], - yAxes: [{ - id: 'y-axis-1', - type: 'linear', - position: 'left' - }] - }, - - showLines: false, - - tooltips: { - callbacks: { - title: function () { - return ''; // doesn't make sense for scatter since data are formatted as a point - }, - label: function (item) { - return '(' + item.xLabel + ', ' + item.yLabel + ')'; - } - } - } - }); - - module.exports = function (Chart) { - - // Scatter charts use line controllers - Chart.controllers.scatter = Chart.controllers.line; - - }; - - }, {"25": 25}], 22: [function (require, module, exports) { - /* global window: false */ - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - defaults._set('global', { - animation: { - duration: 1000, - easing: 'easeOutQuart', - onProgress: helpers.noop, - onComplete: helpers.noop - } - }); - - module.exports = function (Chart) { - - Chart.Animation = Element.extend({ - chart: null, // the animation associated chart instance - currentStep: 0, // the current animation step - numSteps: 60, // default number of steps - easing: '', // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null, // user specified callback to fire when the animation finishes - }); - - Chart.animationService = { - frameDuration: 17, - animations: [], - dropFrames: 0, - request: null, - - /** - * @param {Chart} chart - The chart to animate. - * @param {Chart.Animation} animation - The animation that we will animate. - * @param {Number} duration - The animation duration in ms. - * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions - */ - addAnimation: function (chart, animation, duration, lazy) { - var animations = this.animations; - var i, ilen; - - animation.chart = chart; - - if (!lazy) { - chart.animating = true; - } - - for (i = 0, ilen = animations.length; i < ilen; ++i) { - if (animations[i].chart === chart) { - animations[i] = animation; - return; - } - } - - animations.push(animation); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (animations.length === 1) { - this.requestAnimationFrame(); - } - }, - - cancelAnimation: function (chart) { - var index = helpers.findIndex(this.animations, function (animation) { - return animation.chart === chart; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chart.animating = false; - } - }, - - requestAnimationFrame: function () { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers.requestAnimFrame.call(window, function () { - me.request = null; - me.startDigest(); - }); - } - }, - - /** - * @private - */ - startDigest: function () { - var me = this; - var startTime = Date.now(); - var framesToDrop = 0; - - if (me.dropFrames > 1) { - framesToDrop = Math.floor(me.dropFrames); - me.dropFrames = me.dropFrames % 1; - } - - me.advance(1 + framesToDrop); - - var endTime = Date.now(); - - me.dropFrames += (endTime - startTime) / me.frameDuration; - - // Do we have more stuff to animate? - if (me.animations.length > 0) { - me.requestAnimationFrame(); - } - }, - - /** - * @private - */ - advance: function (count) { - var animations = this.animations; - var animation, chart; - var i = 0; - - while (i < animations.length) { - animation = animations[i]; - chart = animation.chart; - - animation.currentStep = (animation.currentStep || 0) + count; - animation.currentStep = Math.min(animation.currentStep, animation.numSteps); - - helpers.callback(animation.render, [chart, animation], chart); - helpers.callback(animation.onAnimationProgress, [animation], chart); - - if (animation.currentStep >= animation.numSteps) { - helpers.callback(animation.onAnimationComplete, [animation], chart); - chart.animating = false; - animations.splice(i, 1); - } else { - ++i; - } - } - } - }; - - /** - * Provided for backward compatibility, use Chart.Animation instead - * @prop Chart.Animation#animationObject - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ - Object.defineProperty(Chart.Animation.prototype, 'animationObject', { - get: function () { - return this; - } - }); - - /** - * Provided for backward compatibility, use Chart.Animation#chart instead - * @prop Chart.Animation#chartInstance - * @deprecated since version 2.6.0 - * @todo remove at version 3 - */ - Object.defineProperty(Chart.Animation.prototype, 'chartInstance', { - get: function () { - return this.chart; - }, - set: function (value) { - this.chart = value; - } - }); - - }; - - }, {"25": 25, "26": 26, "45": 45}], 23: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var helpers = require(45); - var Interaction = require(28); - var platform = require(48); - - module.exports = function (Chart) { - var plugins = Chart.plugins; - - // Create a dictionary of chart types, to allow for extension of existing types - Chart.types = {}; - - // Store a reference to each instance - allowing us to globally resize chart instances on window resize. - // Destroy method on the chart will remove the instance of the chart from this reference. - Chart.instances = {}; - - // Controllers available for dataset visualization eg. bar, line, slice, etc. - Chart.controllers = {}; - - /** - * Initializes the given config with global and chart default values. - */ - function initConfig(config) { - config = config || {}; - - // Do NOT use configMerge() for the data object because this method merges arrays - // and so would change references to labels and datasets, preventing data updates. - var data = config.data = config.data || {}; - data.datasets = data.datasets || []; - data.labels = data.labels || []; - - config.options = helpers.configMerge( - defaults.global, - defaults[config.type], - config.options || {}); - - return config; - } - - /** - * Updates the config of the chart - * @param chart {Chart} chart to update the options for - */ - function updateConfig(chart) { - var newOptions = chart.options; - - // Update Scale(s) with options - if (newOptions.scale) { - chart.scale.options = newOptions.scale; - } else if (newOptions.scales) { - newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function (scaleOptions) { - chart.scales[scaleOptions.id].options = scaleOptions; - }); - } - - // Tooltip - chart.tooltip._options = newOptions.tooltips; - } - - function positionIsHorizontal(position) { - return position === 'top' || position === 'bottom'; - } - - helpers.extend(Chart.prototype, /** @lends Chart */ { - /** - * @private - */ - construct: function (item, config) { - var me = this; - - config = initConfig(config); - - var context = platform.acquireContext(item, config); - var canvas = context && context.canvas; - var height = canvas && canvas.height; - var width = canvas && canvas.width; - - me.id = helpers.uid(); - me.ctx = context; - me.canvas = canvas; - me.config = config; - me.width = width; - me.height = height; - me.aspectRatio = height ? width / height : null; - me.options = config.options; - me._bufferedRender = false; - - /** - * Provided for backward compatibility, Chart and Chart.Controller have been merged, - * the "instance" still need to be defined since it might be called from plugins. - * @prop Chart#chart - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - me.chart = me; - me.controller = me; // chart.chart.controller #inception - - // Add the chart instance to the global namespace - Chart.instances[me.id] = me; - - // Define alias to the config data: `chart.data === chart.config.data` - Object.defineProperty(me, 'data', { - get: function () { - return me.config.data; - }, - set: function (value) { - me.config.data = value; - } - }); - - if (!context || !canvas) { - // The given item is not a compatible context2d element, let's return before finalizing - // the chart initialization but after setting basic chart / controller properties that - // can help to figure out that the chart is not valid (e.g chart.canvas !== null); - // https://github.com/chartjs/Chart.js/issues/2807 - console.error("Failed to create chart: can't acquire context from the given item"); - return; - } - - me.initialize(); - me.update(); - }, - - /** - * @private - */ - initialize: function () { - var me = this; - - // Before init plugin notification - plugins.notify(me, 'beforeInit'); - - helpers.retinaScale(me, me.options.devicePixelRatio); - - me.bindEvents(); - - if (me.options.responsive) { - // Initial resize before chart draws (must be silent to preserve initial animations). - me.resize(true); - } - - // Make sure scales have IDs and are built before we build any controllers. - me.ensureScalesHaveIDs(); - me.buildScales(); - me.initToolTip(); - - // After init plugin notification - plugins.notify(me, 'afterInit'); - - return me; - }, - - clear: function () { - helpers.canvas.clear(this); - return this; - }, - - stop: function () { - // Stops any current animation loop occurring - Chart.animationService.cancelAnimation(this); - return this; - }, - - resize: function (silent) { - var me = this; - var options = me.options; - var canvas = me.canvas; - var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; - - // the canvas render width and height will be casted to integers so make sure that - // the canvas display style uses the same integer values to avoid blurring effect. - - // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased - var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas))); - var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas))); - - if (me.width === newWidth && me.height === newHeight) { - return; - } - - canvas.width = me.width = newWidth; - canvas.height = me.height = newHeight; - canvas.style.width = newWidth + 'px'; - canvas.style.height = newHeight + 'px'; - - helpers.retinaScale(me, options.devicePixelRatio); - - if (!silent) { - // Notify any plugins about the resize - var newSize = {width: newWidth, height: newHeight}; - plugins.notify(me, 'resize', [newSize]); - - // Notify of resize - if (me.options.onResize) { - me.options.onResize(me, newSize); - } - - me.stop(); - me.update(me.options.responsiveAnimationDuration); - } - }, - - ensureScalesHaveIDs: function () { - var options = this.options; - var scalesOptions = options.scales || {}; - var scaleOptions = options.scale; - - helpers.each(scalesOptions.xAxes, function (xAxisOptions, index) { - xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); - }); - - helpers.each(scalesOptions.yAxes, function (yAxisOptions, index) { - yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); - }); - - if (scaleOptions) { - scaleOptions.id = scaleOptions.id || 'scale'; - } - }, - - /** - * Builds a map of scale ID to scale object for future lookup. - */ - buildScales: function () { - var me = this; - var options = me.options; - var scales = me.scales = {}; - var items = []; - - if (options.scales) { - items = items.concat( - (options.scales.xAxes || []).map(function (xAxisOptions) { - return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; - }), - (options.scales.yAxes || []).map(function (yAxisOptions) { - return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; - }) - ); - } - - if (options.scale) { - items.push({ - options: options.scale, - dtype: 'radialLinear', - isDefault: true, - dposition: 'chartArea' - }); - } - - helpers.each(items, function (item) { - var scaleOptions = item.options; - var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype); - var scaleClass = Chart.scaleService.getScaleConstructor(scaleType); - if (!scaleClass) { - return; - } - - if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { - scaleOptions.position = item.dposition; - } - - var scale = new scaleClass({ - id: scaleOptions.id, - options: scaleOptions, - ctx: me.ctx, - chart: me - }); - - scales[scale.id] = scale; - scale.mergeTicksOptions(); - - // TODO(SB): I think we should be able to remove this custom case (options.scale) - // and consider it as a regular scale part of the "scales"" map only! This would - // make the logic easier and remove some useless? custom code. - if (item.isDefault) { - me.scale = scale; - } - }); - - Chart.scaleService.addScalesToLayout(this); - }, - - buildOrUpdateControllers: function () { - var me = this; - var types = []; - var newControllers = []; - - helpers.each(me.data.datasets, function (dataset, datasetIndex) { - var meta = me.getDatasetMeta(datasetIndex); - var type = dataset.type || me.config.type; - - if (meta.type && meta.type !== type) { - me.destroyDatasetMeta(datasetIndex); - meta = me.getDatasetMeta(datasetIndex); - } - meta.type = type; - - types.push(meta.type); - - if (meta.controller) { - meta.controller.updateIndex(datasetIndex); - } else { - var ControllerClass = Chart.controllers[meta.type]; - if (ControllerClass === undefined) { - throw new Error('"' + meta.type + '" is not a chart type.'); - } - - meta.controller = new ControllerClass(me, datasetIndex); - newControllers.push(meta.controller); - } - }, me); - - return newControllers; - }, - - /** - * Reset the elements of all datasets - * @private - */ - resetElements: function () { - var me = this; - helpers.each(me.data.datasets, function (dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.reset(); - }, me); - }, - - /** - * Resets the chart back to it's state before the initial animation - */ - reset: function () { - this.resetElements(); - this.tooltip.initialize(); - }, - - update: function (config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - updateConfig(me); - - if (plugins.notify(me, 'beforeUpdate') === false) { - return; - } - - // In case the entire data object changed - me.tooltip._data = me.data; - - // Make sure dataset controllers are updated and new controllers are reset - var newControllers = me.buildOrUpdateControllers(); - - // Make sure all dataset controllers have correct meta data counts - helpers.each(me.data.datasets, function (dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); - }, me); - - me.updateLayout(); - - // Can only reset the new controllers after the scales have been updated - helpers.each(newControllers, function (controller) { - controller.reset(); - }); - - me.updateDatasets(); - - // Need to reset tooltip in case it is displayed with elements that are removed - // after update. - me.tooltip.initialize(); - - // Last active contains items that were previously in the tooltip. - // When we reset the tooltip, we need to clear it - me.lastActive = []; - - // Do this before render so that any plugins that need final scale updates can use it - plugins.notify(me, 'afterUpdate'); - - if (me._bufferedRender) { - me._bufferedRequest = { - duration: config.duration, - easing: config.easing, - lazy: config.lazy - }; - } else { - me.render(config); - } - }, - - /** - * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` - * hook, in which case, plugins will not be called on `afterLayout`. - * @private - */ - updateLayout: function () { - var me = this; - - if (plugins.notify(me, 'beforeLayout') === false) { - return; - } - - Chart.layoutService.update(this, this.width, this.height); - - /** - * Provided for backward compatibility, use `afterLayout` instead. - * @method IPlugin#afterScaleUpdate - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ - plugins.notify(me, 'afterScaleUpdate'); - plugins.notify(me, 'afterLayout'); - }, - - /** - * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` - * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. - * @private - */ - updateDatasets: function () { - var me = this; - - if (plugins.notify(me, 'beforeDatasetsUpdate') === false) { - return; - } - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.updateDataset(i); - } - - plugins.notify(me, 'afterDatasetsUpdate'); - }, - - /** - * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` - * hook, in which case, plugins will not be called on `afterDatasetUpdate`. - * @private - */ - updateDataset: function (index) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index - }; - - if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { - return; - } - - meta.controller.update(); - - plugins.notify(me, 'afterDatasetUpdate', [args]); - }, - - render: function (config) { - var me = this; - - if (!config || typeof config !== 'object') { - // backwards compatibility - config = { - duration: config, - lazy: arguments[1] - }; - } - - var duration = config.duration; - var lazy = config.lazy; - - if (plugins.notify(me, 'beforeRender') === false) { - return; - } - - var animationOptions = me.options.animation; - var onComplete = function (animation) { - plugins.notify(me, 'afterRender'); - helpers.callback(animationOptions && animationOptions.onComplete, [animation], me); - }; - - if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) { - var animation = new Chart.Animation({ - numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps - easing: config.easing || animationOptions.easing, - - render: function (chart, animationObject) { - var easingFunction = helpers.easing.effects[animationObject.easing]; - var currentStep = animationObject.currentStep; - var stepDecimal = currentStep / animationObject.numSteps; - - chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); - }, - - onAnimationProgress: animationOptions.onProgress, - onAnimationComplete: onComplete - }); - - Chart.animationService.addAnimation(me, animation, duration, lazy); - } else { - me.draw(); - - // See https://github.com/chartjs/Chart.js/issues/3781 - onComplete(new Chart.Animation({numSteps: 0, chart: me})); - } - - return me; - }, - - draw: function (easingValue) { - var me = this; - - me.clear(); - - if (helpers.isNullOrUndef(easingValue)) { - easingValue = 1; - } - - me.transition(easingValue); - - if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) { - return; - } - - // Draw all the scales - helpers.each(me.boxes, function (box) { - box.draw(me.chartArea); - }, me); - - if (me.scale) { - me.scale.draw(); - } - - me.drawDatasets(easingValue); - me._drawTooltip(easingValue); - - plugins.notify(me, 'afterDraw', [easingValue]); - }, - - /** - * @private - */ - transition: function (easingValue) { - var me = this; - - for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { - if (me.isDatasetVisible(i)) { - me.getDatasetMeta(i).controller.transition(easingValue); - } - } - - me.tooltip.transition(easingValue); - }, - - /** - * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` - * hook, in which case, plugins will not be called on `afterDatasetsDraw`. - * @private - */ - drawDatasets: function (easingValue) { - var me = this; - - if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { - return; - } - - // Draw datasets reversed to support proper line stacking - for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { - if (me.isDatasetVisible(i)) { - me.drawDataset(i, easingValue); - } - } - - plugins.notify(me, 'afterDatasetsDraw', [easingValue]); - }, - - /** - * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` - * hook, in which case, plugins will not be called on `afterDatasetDraw`. - * @private - */ - drawDataset: function (index, easingValue) { - var me = this; - var meta = me.getDatasetMeta(index); - var args = { - meta: meta, - index: index, - easingValue: easingValue - }; - - if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { - return; - } - - meta.controller.draw(easingValue); - - plugins.notify(me, 'afterDatasetDraw', [args]); - }, - - /** - * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` - * hook, in which case, plugins will not be called on `afterTooltipDraw`. - * @private - */ - _drawTooltip: function (easingValue) { - var me = this; - var tooltip = me.tooltip; - var args = { - tooltip: tooltip, - easingValue: easingValue - }; - - if (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { - return; - } - - tooltip.draw(); - - plugins.notify(me, 'afterTooltipDraw', [args]); - }, - - // Get the single element that was clicked on - // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw - getElementAtEvent: function (e) { - return Interaction.modes.single(this, e); - }, - - getElementsAtEvent: function (e) { - return Interaction.modes.label(this, e, {intersect: true}); - }, - - getElementsAtXAxis: function (e) { - return Interaction.modes['x-axis'](this, e, {intersect: true}); - }, - - getElementsAtEventForMode: function (e, mode, options) { - var method = Interaction.modes[mode]; - if (typeof method === 'function') { - return method(this, e, options); - } - - return []; - }, - - getDatasetAtEvent: function (e) { - return Interaction.modes.dataset(this, e, {intersect: true}); - }, - - getDatasetMeta: function (datasetIndex) { - var me = this; - var dataset = me.data.datasets[datasetIndex]; - if (!dataset._meta) { - dataset._meta = {}; - } - - var meta = dataset._meta[me.id]; - if (!meta) { - meta = dataset._meta[me.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, // See isDatasetVisible() comment - xAxisID: null, - yAxisID: null - }; - } - - return meta; - }, - - getVisibleDatasetCount: function () { - var count = 0; - for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { - if (this.isDatasetVisible(i)) { - count++; - } - } - return count; - }, - - isDatasetVisible: function (datasetIndex) { - var meta = this.getDatasetMeta(datasetIndex); - - // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, - // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. - return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; - }, - - generateLegend: function () { - return this.options.legendCallback(this); - }, - - /** - * @private - */ - destroyDatasetMeta: function (datasetIndex) { - var id = this.id; - var dataset = this.data.datasets[datasetIndex]; - var meta = dataset._meta && dataset._meta[id]; - - if (meta) { - meta.controller.destroy(); - delete dataset._meta[id]; - } - }, - - destroy: function () { - var me = this; - var canvas = me.canvas; - var i, ilen; - - me.stop(); - - // dataset controllers need to cleanup associated data - for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.destroyDatasetMeta(i); - } - - if (canvas) { - me.unbindEvents(); - helpers.canvas.clear(me); - platform.releaseContext(me.ctx); - me.canvas = null; - me.ctx = null; - } - - plugins.notify(me, 'destroy'); - - delete Chart.instances[me.id]; - }, - - toBase64Image: function () { - return this.canvas.toDataURL.apply(this.canvas, arguments); - }, - - initToolTip: function () { - var me = this; - me.tooltip = new Chart.Tooltip({ - _chart: me, - _chartInstance: me, // deprecated, backward compatibility - _data: me.data, - _options: me.options.tooltips - }, me); - }, - - /** - * @private - */ - bindEvents: function () { - var me = this; - var listeners = me._listeners = {}; - var listener = function () { - me.eventHandler.apply(me, arguments); - }; - - helpers.each(me.options.events, function (type) { - platform.addEventListener(me, type, listener); - listeners[type] = listener; - }); - - // Elements used to detect size change should not be injected for non responsive charts. - // See https://github.com/chartjs/Chart.js/issues/2210 - if (me.options.responsive) { - listener = function () { - me.resize(); - }; - - platform.addEventListener(me, 'resize', listener); - listeners.resize = listener; - } - }, - - /** - * @private - */ - unbindEvents: function () { - var me = this; - var listeners = me._listeners; - if (!listeners) { - return; - } - - delete me._listeners; - helpers.each(listeners, function (listener, type) { - platform.removeEventListener(me, type, listener); - }); - }, - - updateHoverStyle: function (elements, mode, enabled) { - var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; - var element, i, ilen; - - for (i = 0, ilen = elements.length; i < ilen; ++i) { - element = elements[i]; - if (element) { - this.getDatasetMeta(element._datasetIndex).controller[method](element); - } - } - }, - - /** - * @private - */ - eventHandler: function (e) { - var me = this; - var tooltip = me.tooltip; - - if (plugins.notify(me, 'beforeEvent', [e]) === false) { - return; - } - - // Buffer any update calls so that renders do not occur - me._bufferedRender = true; - me._bufferedRequest = null; - - var changed = me.handleEvent(e); - changed |= tooltip && tooltip.handleEvent(e); - - plugins.notify(me, 'afterEvent', [e]); - - var bufferedRequest = me._bufferedRequest; - if (bufferedRequest) { - // If we have an update that was triggered, we need to do a normal render - me.render(bufferedRequest); - } else if (changed && !me.animating) { - // If entering, leaving, or changing elements, animate the change via pivot - me.stop(); - - // We only need to render at this point. Updating will cause scales to be - // recomputed generating flicker & using more memory than necessary. - me.render(me.options.hover.animationDuration, true); - } - - me._bufferedRender = false; - me._bufferedRequest = null; - - return me; - }, - - /** - * Handle an event - * @private - * @param {IEvent} event the event to handle - * @return {Boolean} true if the chart needs to re-render - */ - handleEvent: function (e) { - var me = this; - var options = me.options || {}; - var hoverOptions = options.hover; - var changed = false; - - me.lastActive = me.lastActive || []; - - // Find Active Elements for hover and tooltips - if (e.type === 'mouseout') { - me.active = []; - } else { - me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); - } - - // Invoke onHover hook - // Need to call with native event here to not break backwards compatibility - helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); - - if (e.type === 'mouseup' || e.type === 'click') { - if (options.onClick) { - // Use e.native here for backwards compatibility - options.onClick.call(me, e.native, me.active); - } - } - - // Remove styling for last active (even if it may still be active) - if (me.lastActive.length) { - me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); - } - - // Built in hover styling - if (me.active.length && hoverOptions.mode) { - me.updateHoverStyle(me.active, hoverOptions.mode, true); - } - - changed = !helpers.arrayEquals(me.active, me.lastActive); - - // Remember Last Actives - me.lastActive = me.active; - - return changed; - } - }); - - /** - * Provided for backward compatibility, use Chart instead. - * @class Chart.Controller - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - Chart.Controller = Chart; - }; - - }, {"25": 25, "28": 28, "45": 45, "48": 48}], 24: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - - module.exports = function (Chart) { - - var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; - - /** - * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', - * 'unshift') and notify the listener AFTER the array has been altered. Listeners are - * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. - */ - function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - return; - } - - Object.defineProperty(array, '_chartjs', { - configurable: true, - enumerable: false, - value: { - listeners: [listener] - } - }); - - arrayEvents.forEach(function (key) { - var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); - var base = array[key]; - - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value: function () { - var args = Array.prototype.slice.call(arguments); - var res = base.apply(this, args); - - helpers.each(array._chartjs.listeners, function (object) { - if (typeof object[method] === 'function') { - object[method].apply(object, args); - } - }); - - return res; - } - }); - }); - } - - /** - * Removes the given array event listener and cleanup extra attached properties (such as - * the _chartjs stub and overridden methods) if array doesn't have any more listeners. - */ - function unlistenArrayEvents(array, listener) { - var stub = array._chartjs; - if (!stub) { - return; - } - - var listeners = stub.listeners; - var index = listeners.indexOf(listener); - if (index !== -1) { - listeners.splice(index, 1); - } - - if (listeners.length > 0) { - return; - } - - arrayEvents.forEach(function (key) { - delete array[key]; - }); - - delete array._chartjs; - } - - // Base class for all dataset controllers (line, bar, etc) - Chart.DatasetController = function (chart, datasetIndex) { - this.initialize(chart, datasetIndex); - }; - - helpers.extend(Chart.DatasetController.prototype, { - - /** - * Element type used to generate a meta dataset (e.g. Chart.element.Line). - * @type {Chart.core.element} - */ - datasetElementType: null, - - /** - * Element type used to generate a meta data (e.g. Chart.element.Point). - * @type {Chart.core.element} - */ - dataElementType: null, - - initialize: function (chart, datasetIndex) { - var me = this; - me.chart = chart; - me.index = datasetIndex; - me.linkScales(); - me.addElements(); - }, - - updateIndex: function (datasetIndex) { - this.index = datasetIndex; - }, - - linkScales: function () { - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - - if (meta.xAxisID === null) { - meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; - } - if (meta.yAxisID === null) { - meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; - } - }, - - getDataset: function () { - return this.chart.data.datasets[this.index]; - }, - - getMeta: function () { - return this.chart.getDatasetMeta(this.index); - }, - - getScaleForId: function (scaleID) { - return this.chart.scales[scaleID]; - }, - - reset: function () { - this.update(true); - }, - - /** - * @private - */ - destroy: function () { - if (this._data) { - unlistenArrayEvents(this._data, this); - } - }, - - createMetaDataset: function () { - var me = this; - var type = me.datasetElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index - }); - }, - - createMetaData: function (index) { - var me = this; - var type = me.dataElementType; - return type && new type({ - _chart: me.chart, - _datasetIndex: me.index, - _index: index - }); - }, - - addElements: function () { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data || []; - var metaData = meta.data; - var i, ilen; - - for (i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = metaData[i] || me.createMetaData(i); - } - - meta.dataset = meta.dataset || me.createMetaDataset(); - }, - - addElementAndReset: function (index) { - var element = this.createMetaData(index); - this.getMeta().data.splice(index, 0, element); - this.updateElement(element, index, true); - }, - - buildOrUpdateElements: function () { - var me = this; - var dataset = me.getDataset(); - var data = dataset.data || (dataset.data = []); - - // In order to correctly handle data addition/deletion animation (an thus simulate - // real-time charts), we need to monitor these data modifications and synchronize - // the internal meta data accordingly. - if (me._data !== data) { - if (me._data) { - // This case happens when the user replaced the data array instance. - unlistenArrayEvents(me._data, me); - } - - listenArrayEvents(data, me); - me._data = data; - } - - // Re-sync meta data in case the user replaced the data array or if we missed - // any updates and so make sure that we handle number of datapoints changing. - me.resyncElements(); - }, - - update: helpers.noop, - - transition: function (easingValue) { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - for (; i < ilen; ++i) { - elements[i].transition(easingValue); - } - - if (meta.dataset) { - meta.dataset.transition(easingValue); - } - }, - - draw: function () { - var meta = this.getMeta(); - var elements = meta.data || []; - var ilen = elements.length; - var i = 0; - - if (meta.dataset) { - meta.dataset.draw(); - } - - for (; i < ilen; ++i) { - elements[i].draw(); - } - }, - - removeHoverStyle: function (element, elementOpts) { - var dataset = this.chart.data.datasets[element._datasetIndex]; - var index = element._index; - var custom = element.custom || {}; - var valueOrDefault = helpers.valueAtIndexOrDefault; - var model = element._model; - - model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor); - model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor); - model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth); - }, - - setHoverStyle: function (element) { - var dataset = this.chart.data.datasets[element._datasetIndex]; - var index = element._index; - var custom = element.custom || {}; - var valueOrDefault = helpers.valueAtIndexOrDefault; - var getHoverColor = helpers.getHoverColor; - var model = element._model; - - model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor)); - model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor)); - model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); - }, - - /** - * @private - */ - resyncElements: function () { - var me = this; - var meta = me.getMeta(); - var data = me.getDataset().data; - var numMeta = meta.data.length; - var numData = data.length; - - if (numData < numMeta) { - meta.data.splice(numData, numMeta - numData); - } else if (numData > numMeta) { - me.insertElements(numMeta, numData - numMeta); - } - }, - - /** - * @private - */ - insertElements: function (start, count) { - for (var i = 0; i < count; ++i) { - this.addElementAndReset(start + i); - } - }, - - /** - * @private - */ - onDataPush: function () { - this.insertElements(this.getDataset().data.length - 1, arguments.length); - }, - - /** - * @private - */ - onDataPop: function () { - this.getMeta().data.pop(); - }, - - /** - * @private - */ - onDataShift: function () { - this.getMeta().data.shift(); - }, - - /** - * @private - */ - onDataSplice: function (start, count) { - this.getMeta().data.splice(start, count); - this.insertElements(start, arguments.length - 2); - }, - - /** - * @private - */ - onDataUnshift: function () { - this.insertElements(0, arguments.length); - } - }); - - Chart.DatasetController.extend = helpers.inherits; - }; - - }, {"45": 45}], 25: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - - module.exports = { - /** - * @private - */ - _set: function (scope, values) { - return helpers.merge(this[scope] || (this[scope] = {}), values); - } - }; - - }, {"45": 45}], 26: [function (require, module, exports) { - 'use strict'; - - var color = require(2); - var helpers = require(45); - - function interpolate(start, view, model, ease) { - var keys = Object.keys(model); - var i, ilen, key, actual, origin, target, type, c0, c1; - - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - - target = model[key]; - - // if a value is added to the model after pivot() has been called, the view - // doesn't contain it, so let's initialize the view to the target value. - if (!view.hasOwnProperty(key)) { - view[key] = target; - } - - actual = view[key]; - - if (actual === target || key[0] === '_') { - continue; - } - - if (!start.hasOwnProperty(key)) { - start[key] = actual; - } - - origin = start[key]; - - type = typeof target; - - if (type === typeof origin) { - if (type === 'string') { - c0 = color(origin); - if (c0.valid) { - c1 = color(target); - if (c1.valid) { - view[key] = c1.mix(c0, ease).rgbString(); - continue; - } - } - } else if (type === 'number' && isFinite(origin) && isFinite(target)) { - view[key] = origin + (target - origin) * ease; - continue; - } - } - - view[key] = target; - } - } - - var Element = function (configuration) { - helpers.extend(this, configuration); - this.initialize.apply(this, arguments); - }; - - helpers.extend(Element.prototype, { - - initialize: function () { - this.hidden = false; - }, - - pivot: function () { - var me = this; - if (!me._view) { - me._view = helpers.clone(me._model); - } - me._start = {}; - return me; - }, - - transition: function (ease) { - var me = this; - var model = me._model; - var start = me._start; - var view = me._view; - - // No animation -> No Transition - if (!model || ease === 1) { - me._view = model; - me._start = null; - return me; - } - - if (!view) { - view = me._view = {}; - } - - if (!start) { - start = me._start = {}; - } - - interpolate(start, view, model, ease); - - return me; - }, - - tooltipPosition: function () { - return { - x: this._model.x, - y: this._model.y - }; - }, - - hasValue: function () { - return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y); - } - }); - - Element.extend = helpers.inherits; - - module.exports = Element; - - }, {"2": 2, "45": 45}], 27: [function (require, module, exports) { - /* global window: false */ - /* global document: false */ - 'use strict'; - - var color = require(2); - var defaults = require(25); - var helpers = require(45); - - module.exports = function (Chart) { - - // -- Basic js utility methods - - helpers.configMerge = function (/* objects ... */) { - return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { - merger: function (key, target, source, options) { - var tval = target[key] || {}; - var sval = source[key]; - - if (key === 'scales') { - // scale config merging is complex. Add our own function here for that - target[key] = helpers.scaleMerge(tval, sval); - } else if (key === 'scale') { - // used in polar area & radar charts since there is only one scale - target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]); - } else { - helpers._merger(key, target, source, options); - } - } - }); - }; - - helpers.scaleMerge = function (/* objects ... */) { - return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { - merger: function (key, target, source, options) { - if (key === 'xAxes' || key === 'yAxes') { - var slen = source[key].length; - var i, type, scale; - - if (!target[key]) { - target[key] = []; - } - - for (i = 0; i < slen; ++i) { - scale = source[key][i]; - type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear'); - - if (i >= target[key].length) { - target[key].push({}); - } - - if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { - // new/untyped scale or type changed: let's apply the new defaults - // then merge source scale to correctly overwrite the defaults. - helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]); - } else { - // scales type are the same - helpers.merge(target[key][i], scale); - } - } - } else { - helpers._merger(key, target, source, options); - } - } - }); - }; - - helpers.where = function (collection, filterCallback) { - if (helpers.isArray(collection) && Array.prototype.filter) { - return collection.filter(filterCallback); - } - var filtered = []; - - helpers.each(collection, function (item) { - if (filterCallback(item)) { - filtered.push(item); - } - }); - - return filtered; - }; - helpers.findIndex = Array.prototype.findIndex ? - function (array, callback, scope) { - return array.findIndex(callback, scope); - } : - function (array, callback, scope) { - scope = scope === undefined ? array : scope; - for (var i = 0, ilen = array.length; i < ilen; ++i) { - if (callback.call(scope, array[i], i, array)) { - return i; - } - } - return -1; - }; - helpers.findNextWhere = function (arrayToSearch, filterCallback, startIndex) { - // Default to start of the array - if (helpers.isNullOrUndef(startIndex)) { - startIndex = -1; - } - for (var i = startIndex + 1; i < arrayToSearch.length; i++) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - helpers.findPreviousWhere = function (arrayToSearch, filterCallback, startIndex) { - // Default to end of the array - if (helpers.isNullOrUndef(startIndex)) { - startIndex = arrayToSearch.length; - } - for (var i = startIndex - 1; i >= 0; i--) { - var currentItem = arrayToSearch[i]; - if (filterCallback(currentItem)) { - return currentItem; - } - } - }; - - // -- Math methods - helpers.isNumber = function (n) { - return !isNaN(parseFloat(n)) && isFinite(n); - }; - helpers.almostEquals = function (x, y, epsilon) { - return Math.abs(x - y) < epsilon; - }; - helpers.almostWhole = function (x, epsilon) { - var rounded = Math.round(x); - return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); - }; - helpers.max = function (array) { - return array.reduce(function (max, value) { - if (!isNaN(value)) { - return Math.max(max, value); - } - return max; - }, Number.NEGATIVE_INFINITY); - }; - helpers.min = function (array) { - return array.reduce(function (min, value) { - if (!isNaN(value)) { - return Math.min(min, value); - } - return min; - }, Number.POSITIVE_INFINITY); - }; - helpers.sign = Math.sign ? - function (x) { - return Math.sign(x); - } : - function (x) { - x = +x; // convert to a number - if (x === 0 || isNaN(x)) { - return x; - } - return x > 0 ? 1 : -1; - }; - helpers.log10 = Math.log10 ? - function (x) { - return Math.log10(x); - } : - function (x) { - return Math.log(x) / Math.LN10; - }; - helpers.toRadians = function (degrees) { - return degrees * (Math.PI / 180); - }; - helpers.toDegrees = function (radians) { - return radians * (180 / Math.PI); - }; - // Gets the angle from vertical upright to the point about a centre. - helpers.getAngleFromPoint = function (centrePoint, anglePoint) { - var distanceFromXCenter = anglePoint.x - centrePoint.x; - var distanceFromYCenter = anglePoint.y - centrePoint.y; - var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); - - var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - - if (angle < (-0.5 * Math.PI)) { - angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] - } - - return { - angle: angle, - distance: radialDistanceFromCenter - }; - }; - helpers.distanceBetweenPoints = function (pt1, pt2) { - return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); - }; - helpers.aliasPixel = function (pixelWidth) { - return (pixelWidth % 2 === 0) ? 0 : 0.5; - }; - helpers.splineCurve = function (firstPoint, middlePoint, afterPoint, t) { - // Props to Rob Spencer at scaled innovation for his post on splining between points - // http://scaledinnovation.com/analytics/splines/aboutSplines.html - - // This function must also respect "skipped" points - - var previous = firstPoint.skip ? middlePoint : firstPoint; - var current = middlePoint; - var next = afterPoint.skip ? middlePoint : afterPoint; - - var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); - var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); - - var s01 = d01 / (d01 + d12); - var s12 = d12 / (d01 + d12); - - // If all points are the same, s01 & s02 will be inf - s01 = isNaN(s01) ? 0 : s01; - s12 = isNaN(s12) ? 0 : s12; - - var fa = t * s01; // scaling factor for triangle Ta - var fb = t * s12; - - return { - previous: { - x: current.x - fa * (next.x - previous.x), - y: current.y - fa * (next.y - previous.y) - }, - next: { - x: current.x + fb * (next.x - previous.x), - y: current.y + fb * (next.y - previous.y) - } - }; - }; - helpers.EPSILON = Number.EPSILON || 1e-14; - helpers.splineCurveMonotone = function (points) { - // This function calculates Bézier control points in a similar way than |splineCurve|, - // but preserves monotonicity of the provided data and ensures no local extremums are added - // between the dataset discrete points due to the interpolation. - // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation - - var pointsWithTangents = (points || []).map(function (point) { - return { - model: point._model, - deltaK: 0, - mK: 0 - }; - }); - - // Calculate slopes (deltaK) and initialize tangents (mK) - var pointsLen = pointsWithTangents.length; - var i, pointBefore, pointCurrent, pointAfter; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointAfter && !pointAfter.model.skip) { - var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); - - // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 - pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; - } - - if (!pointBefore || pointBefore.model.skip) { - pointCurrent.mK = pointCurrent.deltaK; - } else if (!pointAfter || pointAfter.model.skip) { - pointCurrent.mK = pointBefore.deltaK; - } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { - pointCurrent.mK = 0; - } else { - pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; - } - } - - // Adjust tangents to ensure monotonic properties - var alphaK, betaK, tauK, squaredMagnitude; - for (i = 0; i < pointsLen - 1; ++i) { - pointCurrent = pointsWithTangents[i]; - pointAfter = pointsWithTangents[i + 1]; - if (pointCurrent.model.skip || pointAfter.model.skip) { - continue; - } - - if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { - pointCurrent.mK = pointAfter.mK = 0; - continue; - } - - alphaK = pointCurrent.mK / pointCurrent.deltaK; - betaK = pointAfter.mK / pointCurrent.deltaK; - squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); - if (squaredMagnitude <= 9) { - continue; - } - - tauK = 3 / Math.sqrt(squaredMagnitude); - pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; - pointAfter.mK = betaK * tauK * pointCurrent.deltaK; - } - - // Compute control points - var deltaX; - for (i = 0; i < pointsLen; ++i) { - pointCurrent = pointsWithTangents[i]; - if (pointCurrent.model.skip) { - continue; - } - - pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; - pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; - if (pointBefore && !pointBefore.model.skip) { - deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; - pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; - pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; - } - if (pointAfter && !pointAfter.model.skip) { - deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; - pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; - pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; - } - } - }; - helpers.nextItem = function (collection, index, loop) { - if (loop) { - return index >= collection.length - 1 ? collection[0] : collection[index + 1]; - } - return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; - }; - helpers.previousItem = function (collection, index, loop) { - if (loop) { - return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; - } - return index <= 0 ? collection[0] : collection[index - 1]; - }; - // Implementation of the nice number algorithm used in determining where axis labels will go - helpers.niceNum = function (range, round) { - var exponent = Math.floor(helpers.log10(range)); - var fraction = range / Math.pow(10, exponent); - var niceFraction; - - if (round) { - if (fraction < 1.5) { - niceFraction = 1; - } else if (fraction < 3) { - niceFraction = 2; - } else if (fraction < 7) { - niceFraction = 5; - } else { - niceFraction = 10; - } - } else if (fraction <= 1.0) { - niceFraction = 1; - } else if (fraction <= 2) { - niceFraction = 2; - } else if (fraction <= 5) { - niceFraction = 5; - } else { - niceFraction = 10; - } - - return niceFraction * Math.pow(10, exponent); - }; - // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ - helpers.requestAnimFrame = (function () { - if (typeof window === 'undefined') { - return function (callback) { - callback(); - }; - } - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function (callback) { - return window.setTimeout(callback, 1000 / 60); - }; - }()); - // -- DOM methods - helpers.getRelativePosition = function (evt, chart) { - var mouseX, mouseY; - var e = evt.originalEvent || evt; - var canvas = evt.currentTarget || evt.srcElement; - var boundingRect = canvas.getBoundingClientRect(); - - var touches = e.touches; - if (touches && touches.length > 0) { - mouseX = touches[0].clientX; - mouseY = touches[0].clientY; - - } else { - mouseX = e.clientX; - mouseY = e.clientY; - } - - // Scale mouse coordinates into canvas coordinates - // by following the pattern laid out by 'jerryj' in the comments of - // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ - var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left')); - var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top')); - var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right')); - var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom')); - var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; - var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; - - // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However - // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here - mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); - mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); - - return { - x: mouseX, - y: mouseY - }; - - }; - - // Private helper function to convert max-width/max-height values that may be percentages into a number - function parseMaxStyle(styleValue, node, parentProperty) { - var valueInPixels; - if (typeof styleValue === 'string') { - valueInPixels = parseInt(styleValue, 10); - - if (styleValue.indexOf('%') !== -1) { - // percentage * size in dimension - valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; - } - } else { - valueInPixels = styleValue; - } - - return valueInPixels; - } - - /** - * Returns if the given value contains an effective constraint. - * @private - */ - function isConstrainedValue(value) { - return value !== undefined && value !== null && value !== 'none'; - } - - // Private helper to get a constraint dimension - // @param domNode : the node to check the constraint on - // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight) - // @param percentageProperty : property of parent to use when calculating width as a percentage - // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser - function getConstraintDimension(domNode, maxStyle, percentageProperty) { - var view = document.defaultView; - var parentNode = domNode.parentNode; - var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; - var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; - var hasCNode = isConstrainedValue(constrainedNode); - var hasCContainer = isConstrainedValue(constrainedContainer); - var infinity = Number.POSITIVE_INFINITY; - - if (hasCNode || hasCContainer) { - return Math.min( - hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, - hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); - } - - return 'none'; - } - - // returns Number or undefined if no constraint - helpers.getConstraintWidth = function (domNode) { - return getConstraintDimension(domNode, 'max-width', 'clientWidth'); - }; - // returns Number or undefined if no constraint - helpers.getConstraintHeight = function (domNode) { - return getConstraintDimension(domNode, 'max-height', 'clientHeight'); - }; - helpers.getMaximumWidth = function (domNode) { - var container = domNode.parentNode; - if (!container) { - return domNode.clientWidth; - } - - var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10); - var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10); - var w = container.clientWidth - paddingLeft - paddingRight; - var cw = helpers.getConstraintWidth(domNode); - return isNaN(cw) ? w : Math.min(w, cw); - }; - helpers.getMaximumHeight = function (domNode) { - var container = domNode.parentNode; - if (!container) { - return domNode.clientHeight; - } - - var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10); - var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10); - var h = container.clientHeight - paddingTop - paddingBottom; - var ch = helpers.getConstraintHeight(domNode); - return isNaN(ch) ? h : Math.min(h, ch); - }; - helpers.getStyle = function (el, property) { - return el.currentStyle ? - el.currentStyle[property] : - document.defaultView.getComputedStyle(el, null).getPropertyValue(property); - }; - helpers.retinaScale = function (chart, forceRatio) { - var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1; - if (pixelRatio === 1) { - return; - } - - var canvas = chart.canvas; - var height = chart.height; - var width = chart.width; - - canvas.height = height * pixelRatio; - canvas.width = width * pixelRatio; - chart.ctx.scale(pixelRatio, pixelRatio); - - // If no style has been set on the canvas, the render size is used as display size, - // making the chart visually bigger, so let's enforce it to the "correct" values. - // See https://github.com/chartjs/Chart.js/issues/3575 - canvas.style.height = height + 'px'; - canvas.style.width = width + 'px'; - }; - // -- Canvas methods - helpers.fontString = function (pixelSize, fontStyle, fontFamily) { - return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; - }; - helpers.longestText = function (ctx, font, arrayOfThings, cache) { - cache = cache || {}; - var data = cache.data = cache.data || {}; - var gc = cache.garbageCollect = cache.garbageCollect || []; - - if (cache.font !== font) { - data = cache.data = {}; - gc = cache.garbageCollect = []; - cache.font = font; - } - - ctx.font = font; - var longest = 0; - helpers.each(arrayOfThings, function (thing) { - // Undefined strings and arrays should not be measured - if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) { - longest = helpers.measureText(ctx, data, gc, longest, thing); - } else if (helpers.isArray(thing)) { - // if it is an array lets measure each element - // to do maybe simplify this function a bit so we can do this more recursively? - helpers.each(thing, function (nestedThing) { - // Undefined strings and arrays should not be measured - if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) { - longest = helpers.measureText(ctx, data, gc, longest, nestedThing); - } - }); - } - }); - - var gcLen = gc.length / 2; - if (gcLen > arrayOfThings.length) { - for (var i = 0; i < gcLen; i++) { - delete data[gc[i]]; - } - gc.splice(0, gcLen); - } - return longest; - }; - helpers.measureText = function (ctx, data, gc, longest, string) { - var textWidth = data[string]; - if (!textWidth) { - textWidth = data[string] = ctx.measureText(string).width; - gc.push(string); - } - if (textWidth > longest) { - longest = textWidth; - } - return longest; - }; - helpers.numberOfLabelLines = function (arrayOfThings) { - var numberOfLines = 1; - helpers.each(arrayOfThings, function (thing) { - if (helpers.isArray(thing)) { - if (thing.length > numberOfLines) { - numberOfLines = thing.length; - } - } - }); - return numberOfLines; - }; - - helpers.color = !color ? - function (value) { - console.error('Color.js not found!'); - return value; - } : - function (value) { - /* global CanvasGradient */ - if (value instanceof CanvasGradient) { - value = defaults.global.defaultColor; - } - - return color(value); - }; - - helpers.getHoverColor = function (colorValue) { - /* global CanvasPattern */ - return (colorValue instanceof CanvasPattern) ? - colorValue : - helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString(); - }; - }; - - }, {"2": 2, "25": 25, "45": 45}], 28: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - - /** - * Helper function to get relative position for an event - * @param {Event|IEvent} event - The event to get the position for - * @param {Chart} chart - The chart - * @returns {Point} the event position - */ - function getRelativePosition(e, chart) { - if (e.native) { - return { - x: e.x, - y: e.y - }; - } - - return helpers.getRelativePosition(e, chart); - } - - /** - * Helper function to traverse all of the visible elements in the chart - * @param chart {chart} the chart - * @param handler {Function} the callback to execute for each visible item - */ - function parseVisibleItems(chart, handler) { - var datasets = chart.data.datasets; - var meta, i, j, ilen, jlen; - - for (i = 0, ilen = datasets.length; i < ilen; ++i) { - if (!chart.isDatasetVisible(i)) { - continue; - } - - meta = chart.getDatasetMeta(i); - for (j = 0, jlen = meta.data.length; j < jlen; ++j) { - var element = meta.data[j]; - if (!element._view.skip) { - handler(element); - } - } - } - } - - /** - * Helper function to get the items that intersect the event position - * @param items {ChartElement[]} elements to filter - * @param position {Point} the point to be nearest to - * @return {ChartElement[]} the nearest items - */ - function getIntersectItems(chart, position) { - var elements = []; - - parseVisibleItems(chart, function (element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - } - }); - - return elements; - } - - /** - * Helper function to get the items nearest to the event position considering all visible items in teh chart - * @param chart {Chart} the chart to look at elements from - * @param position {Point} the point to be nearest to - * @param intersect {Boolean} if true, only consider items that intersect the position - * @param distanceMetric {Function} function to provide the distance between points - * @return {ChartElement[]} the nearest items - */ - function getNearestItems(chart, position, intersect, distanceMetric) { - var minDistance = Number.POSITIVE_INFINITY; - var nearestItems = []; - - parseVisibleItems(chart, function (element) { - if (intersect && !element.inRange(position.x, position.y)) { - return; - } - - var center = element.getCenterPoint(); - var distance = distanceMetric(position, center); - - if (distance < minDistance) { - nearestItems = [element]; - minDistance = distance; - } else if (distance === minDistance) { - // Can have multiple items at the same distance in which case we sort by size - nearestItems.push(element); - } - }); - - return nearestItems; - } - - /** - * Get a distance metric function for two points based on the - * axis mode setting - * @param {String} axis the axis mode. x|y|xy - */ - function getDistanceMetricForAxis(axis) { - var useX = axis.indexOf('x') !== -1; - var useY = axis.indexOf('y') !== -1; - - return function (pt1, pt2) { - var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; - var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; - return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); - }; - } - - function indexMode(chart, e, options) { - var position = getRelativePosition(e, chart); - // Default axis for index mode is 'x' to match old behaviour - options.axis = options.axis || 'x'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - var elements = []; - - if (!items.length) { - return []; - } - - chart.data.datasets.forEach(function (dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - var element = meta.data[items[0]._index]; - - // don't count items that are skipped (null data) - if (element && !element._view.skip) { - elements.push(element); - } - } - }); - - return elements; - } - - /** - * @interface IInteractionOptions - */ - /** - * If true, only consider items that intersect the point - * @name IInterfaceOptions#boolean - * @type Boolean - */ - - /** - * Contains interaction related functions - * @namespace Chart.Interaction - */ - module.exports = { - // Helper function for different modes - modes: { - single: function (chart, e) { - var position = getRelativePosition(e, chart); - var elements = []; - - parseVisibleItems(chart, function (element) { - if (element.inRange(position.x, position.y)) { - elements.push(element); - return elements; - } - }); - - return elements.slice(0, 1); - }, - - /** - * @function Chart.Interaction.modes.label - * @deprecated since version 2.4.0 - * @todo remove at version 3 - * @private - */ - label: indexMode, - - /** - * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item - * @function Chart.Interaction.modes.index - * @since v2.4.0 - * @param chart {chart} the chart we are returning items from - * @param e {Event} the event we are find things at - * @param options {IInteractionOptions} options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - index: indexMode, - - /** - * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something - * If the options.intersect is false, we find the nearest item and return the items in that dataset - * @function Chart.Interaction.modes.dataset - * @param chart {chart} the chart we are returning items from - * @param e {Event} the event we are find things at - * @param options {IInteractionOptions} options to use during interaction - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - dataset: function (chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); - - if (items.length > 0) { - items = chart.getDatasetMeta(items[0]._datasetIndex).data; - } - - return items; - }, - - /** - * @function Chart.Interaction.modes.x-axis - * @deprecated since version 2.4.0. Use index mode and intersect == true - * @todo remove at version 3 - * @private - */ - 'x-axis': function (chart, e) { - return indexMode(chart, e, {intersect: false}); - }, - - /** - * Point mode returns all elements that hit test based on the event position - * of the event - * @function Chart.Interaction.modes.intersect - * @param chart {chart} the chart we are returning items from - * @param e {Event} the event we are find things at - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - point: function (chart, e) { - var position = getRelativePosition(e, chart); - return getIntersectItems(chart, position); - }, - - /** - * nearest mode returns the element closest to the point - * @function Chart.Interaction.modes.intersect - * @param chart {chart} the chart we are returning items from - * @param e {Event} the event we are find things at - * @param options {IInteractionOptions} options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - nearest: function (chart, e, options) { - var position = getRelativePosition(e, chart); - options.axis = options.axis || 'xy'; - var distanceMetric = getDistanceMetricForAxis(options.axis); - var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric); - - // We have multiple items at the same distance from the event. Now sort by smallest - if (nearestItems.length > 1) { - nearestItems.sort(function (a, b) { - var sizeA = a.getArea(); - var sizeB = b.getArea(); - var ret = sizeA - sizeB; - - if (ret === 0) { - // if equal sort by dataset index - ret = a._datasetIndex - b._datasetIndex; - } - - return ret; - }); - } - - // Return only 1 item - return nearestItems.slice(0, 1); - }, - - /** - * x mode returns the elements that hit-test at the current x coordinate - * @function Chart.Interaction.modes.x - * @param chart {chart} the chart we are returning items from - * @param e {Event} the event we are find things at - * @param options {IInteractionOptions} options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - x: function (chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function (element) { - if (element.inXRange(position.x)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - }, - - /** - * y mode returns the elements that hit-test at the current y coordinate - * @function Chart.Interaction.modes.y - * @param chart {chart} the chart we are returning items from - * @param e {Event} the event we are find things at - * @param options {IInteractionOptions} options to use - * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned - */ - y: function (chart, e, options) { - var position = getRelativePosition(e, chart); - var items = []; - var intersectsItem = false; - - parseVisibleItems(chart, function (element) { - if (element.inYRange(position.y)) { - items.push(element); - } - - if (element.inRange(position.x, position.y)) { - intersectsItem = true; - } - }); - - // If we want to trigger on an intersect and we don't have any items - // that intersect the position, return nothing - if (options.intersect && !intersectsItem) { - items = []; - } - return items; - } - } - }; - - }, {"45": 45}], 29: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - - defaults._set('global', { - responsive: true, - responsiveAnimationDuration: 0, - maintainAspectRatio: true, - events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'], - hover: { - onHover: null, - mode: 'nearest', - intersect: true, - animationDuration: 400 - }, - onClick: null, - defaultColor: 'rgba(0,0,0,0.1)', - defaultFontColor: '#666', - defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - defaultFontSize: 12, - defaultFontStyle: 'normal', - showLines: true, - - // Element defaults defined in element extensions - elements: {}, - - // Layout options such as padding - layout: { - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - } - }); - - module.exports = function () { - - // Occupy the global variable of Chart, and create a simple base class - var Chart = function (item, config) { - this.construct(item, config); - return this; - }; - - Chart.Chart = Chart; - - return Chart; - }; - - }, {"25": 25}], 30: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - - module.exports = function (Chart) { - - function filterByPosition(array, position) { - return helpers.where(array, function (v) { - return v.position === position; - }); - } - - function sortByWeight(array, reverse) { - array.forEach(function (v, i) { - v._tmpIndex_ = i; - return v; - }); - array.sort(function (a, b) { - var v0 = reverse ? b : a; - var v1 = reverse ? a : b; - return v0.weight === v1.weight ? - v0._tmpIndex_ - v1._tmpIndex_ : - v0.weight - v1.weight; - }); - array.forEach(function (v) { - delete v._tmpIndex_; - }); - } - - /** - * @interface ILayoutItem - * @prop {String} position - The position of the item in the chart layout. Possible values are - * 'left', 'top', 'right', 'bottom', and 'chartArea' - * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area - * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down - * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) - * @prop {Function} update - Takes two parameters: width and height. Returns size of item - * @prop {Function} getPadding - Returns an object with padding on the edges - * @prop {Number} width - Width of item. Must be valid after update() - * @prop {Number} height - Height of item. Must be valid after update() - * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update - * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update - * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update - * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update - */ - - // The layout service is very self explanatory. It's responsible for the layout within a chart. - // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need - // It is this service's responsibility of carrying out that layout. - Chart.layoutService = { - defaults: {}, - - /** - * Register a box to a chart. - * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. - * @param {Chart} chart - the chart to use - * @param {ILayoutItem} item - the item to add to be layed out - */ - addBox: function (chart, item) { - if (!chart.boxes) { - chart.boxes = []; - } - - // initialize item with default values - item.fullWidth = item.fullWidth || false; - item.position = item.position || 'top'; - item.weight = item.weight || 0; - - chart.boxes.push(item); - }, - - /** - * Remove a layoutItem from a chart - * @param {Chart} chart - the chart to remove the box from - * @param {Object} layoutItem - the item to remove from the layout - */ - removeBox: function (chart, layoutItem) { - var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { - chart.boxes.splice(index, 1); - } - }, - - /** - * Sets (or updates) options on the given `item`. - * @param {Chart} chart - the chart in which the item lives (or will be added to) - * @param {Object} item - the item to configure with the given options - * @param {Object} options - the new item options. - */ - configure: function (chart, item, options) { - var props = ['fullWidth', 'position', 'weight']; - var ilen = props.length; - var i = 0; - var prop; - - for (; i < ilen; ++i) { - prop = props[i]; - if (options.hasOwnProperty(prop)) { - item[prop] = options[prop]; - } - } - }, - - /** - * Fits boxes of the given chart into the given size by having each box measure itself - * then running a fitting algorithm - * @param {Chart} chart - the chart - * @param {Number} width - the width to fit into - * @param {Number} height - the height to fit into - */ - update: function (chart, width, height) { - if (!chart) { - return; - } - - var layoutOptions = chart.options.layout || {}; - var padding = helpers.options.toPadding(layoutOptions.padding); - var leftPadding = padding.left; - var rightPadding = padding.right; - var topPadding = padding.top; - var bottomPadding = padding.bottom; - - var leftBoxes = filterByPosition(chart.boxes, 'left'); - var rightBoxes = filterByPosition(chart.boxes, 'right'); - var topBoxes = filterByPosition(chart.boxes, 'top'); - var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); - var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); - - // Sort boxes by weight. A higher weight is further away from the chart area - sortByWeight(leftBoxes, true); - sortByWeight(rightBoxes, false); - sortByWeight(topBoxes, true); - sortByWeight(bottomBoxes, false); - - // Essentially we now have any number of boxes on each of the 4 sides. - // Our canvas looks like the following. - // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and - // B1 is the bottom axis - // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays - // These locations are single-box locations only, when trying to register a chartArea location that is already taken, - // an error will be thrown. - // - // |----------------------------------------------------| - // | T1 (Full Width) | - // |----------------------------------------------------| - // | | | T2 | | - // | |----|-------------------------------------|----| - // | | | C1 | | C2 | | - // | | |----| |----| | - // | | | | | - // | L1 | L2 | ChartArea (C0) | R1 | - // | | | | | - // | | |----| |----| | - // | | | C3 | | C4 | | - // | |----|-------------------------------------|----| - // | | | B1 | | - // |----------------------------------------------------| - // | B2 (Full Width) | - // |----------------------------------------------------| - // - // What we do to find the best sizing, we do the following - // 1. Determine the minimum size of the chart area. - // 2. Split the remaining width equally between each vertical axis - // 3. Split the remaining height equally between each horizontal axis - // 4. Give each layout the maximum size it can be. The layout will return it's minimum size - // 5. Adjust the sizes of each axis based on it's minimum reported size. - // 6. Refit each axis - // 7. Position each axis in the final location - // 8. Tell the chart the final location of the chart area - // 9. Tell any axes that overlay the chart area the positions of the chart area - - // Step 1 - var chartWidth = width - leftPadding - rightPadding; - var chartHeight = height - topPadding - bottomPadding; - var chartAreaWidth = chartWidth / 2; // min 50% - var chartAreaHeight = chartHeight / 2; // min 50% - - // Step 2 - var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length); - - // Step 3 - var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length); - - // Step 4 - var maxChartAreaWidth = chartWidth; - var maxChartAreaHeight = chartHeight; - var minBoxSizes = []; - - function getMinimumBoxSize(box) { - var minSize; - var isHorizontal = box.isHorizontal(); - - if (isHorizontal) { - minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight); - maxChartAreaHeight -= minSize.height; - } else { - minSize = box.update(verticalBoxWidth, chartAreaHeight); - maxChartAreaWidth -= minSize.width; - } - - minBoxSizes.push({ - horizontal: isHorizontal, - minSize: minSize, - box: box, - }); - } - - helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize); - - // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) - var maxHorizontalLeftPadding = 0; - var maxHorizontalRightPadding = 0; - var maxVerticalTopPadding = 0; - var maxVerticalBottomPadding = 0; - - helpers.each(topBoxes.concat(bottomBoxes), function (horizontalBox) { - if (horizontalBox.getPadding) { - var boxPadding = horizontalBox.getPadding(); - maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left); - maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right); - } - }); - - helpers.each(leftBoxes.concat(rightBoxes), function (verticalBox) { - if (verticalBox.getPadding) { - var boxPadding = verticalBox.getPadding(); - maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top); - maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom); - } - }); - - // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could - // be if the axes are drawn at their minimum sizes. - // Steps 5 & 6 - var totalLeftBoxesWidth = leftPadding; - var totalRightBoxesWidth = rightPadding; - var totalTopBoxesHeight = topPadding; - var totalBottomBoxesHeight = bottomPadding; - - // Function to fit a box - function fitBox(box) { - var minBoxSize = helpers.findNextWhere(minBoxSizes, function (minBox) { - return minBox.box === box; - }); - - if (minBoxSize) { - if (box.isHorizontal()) { - var scaleMargin = { - left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding), - right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding), - top: 0, - bottom: 0 - }; - - // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends - // on the margin. Sometimes they need to increase in size slightly - box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); - } else { - box.update(minBoxSize.minSize.width, maxChartAreaHeight); - } - } - } - - // Update, and calculate the left and right margins for the horizontal boxes - helpers.each(leftBoxes.concat(rightBoxes), fitBox); - - helpers.each(leftBoxes, function (box) { - totalLeftBoxesWidth += box.width; - }); - - helpers.each(rightBoxes, function (box) { - totalRightBoxesWidth += box.width; - }); - - // Set the Left and Right margins for the horizontal boxes - helpers.each(topBoxes.concat(bottomBoxes), fitBox); - - // Figure out how much margin is on the top and bottom of the vertical boxes - helpers.each(topBoxes, function (box) { - totalTopBoxesHeight += box.height; - }); - - helpers.each(bottomBoxes, function (box) { - totalBottomBoxesHeight += box.height; - }); - - function finalFitVerticalBox(box) { - var minBoxSize = helpers.findNextWhere(minBoxSizes, function (minSize) { - return minSize.box === box; - }); - - var scaleMargin = { - left: 0, - right: 0, - top: totalTopBoxesHeight, - bottom: totalBottomBoxesHeight - }; - - if (minBoxSize) { - box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin); - } - } - - // Let the left layout know the final margin - helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox); - - // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) - totalLeftBoxesWidth = leftPadding; - totalRightBoxesWidth = rightPadding; - totalTopBoxesHeight = topPadding; - totalBottomBoxesHeight = bottomPadding; - - helpers.each(leftBoxes, function (box) { - totalLeftBoxesWidth += box.width; - }); - - helpers.each(rightBoxes, function (box) { - totalRightBoxesWidth += box.width; - }); - - helpers.each(topBoxes, function (box) { - totalTopBoxesHeight += box.height; - }); - helpers.each(bottomBoxes, function (box) { - totalBottomBoxesHeight += box.height; - }); - - // We may be adding some padding to account for rotated x axis labels - var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0); - totalLeftBoxesWidth += leftPaddingAddition; - totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0); - - var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0); - totalTopBoxesHeight += topPaddingAddition; - totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0); - - // Figure out if our chart area changed. This would occur if the dataset layout label rotation - // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do - // without calling `fit` again - var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight; - var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth; - - if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { - helpers.each(leftBoxes, function (box) { - box.height = newMaxChartAreaHeight; - }); - - helpers.each(rightBoxes, function (box) { - box.height = newMaxChartAreaHeight; - }); - - helpers.each(topBoxes, function (box) { - if (!box.fullWidth) { - box.width = newMaxChartAreaWidth; - } - }); - - helpers.each(bottomBoxes, function (box) { - if (!box.fullWidth) { - box.width = newMaxChartAreaWidth; - } - }); - - maxChartAreaHeight = newMaxChartAreaHeight; - maxChartAreaWidth = newMaxChartAreaWidth; - } - - // Step 7 - Position the boxes - var left = leftPadding + leftPaddingAddition; - var top = topPadding + topPaddingAddition; - - function placeBox(box) { - if (box.isHorizontal()) { - box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth; - box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth; - box.top = top; - box.bottom = top + box.height; - - // Move to next point - top = box.bottom; - - } else { - - box.left = left; - box.right = left + box.width; - box.top = totalTopBoxesHeight; - box.bottom = totalTopBoxesHeight + maxChartAreaHeight; - - // Move to next point - left = box.right; - } - } - - helpers.each(leftBoxes.concat(topBoxes), placeBox); - - // Account for chart width and height - left += maxChartAreaWidth; - top += maxChartAreaHeight; - - helpers.each(rightBoxes, placeBox); - helpers.each(bottomBoxes, placeBox); - - // Step 8 - chart.chartArea = { - left: totalLeftBoxesWidth, - top: totalTopBoxesHeight, - right: totalLeftBoxesWidth + maxChartAreaWidth, - bottom: totalTopBoxesHeight + maxChartAreaHeight - }; - - // Step 9 - helpers.each(chartAreaBoxes, function (box) { - box.left = chart.chartArea.left; - box.top = chart.chartArea.top; - box.right = chart.chartArea.right; - box.bottom = chart.chartArea.bottom; - - box.update(maxChartAreaWidth, maxChartAreaHeight); - }); - } - }; - }; - - }, {"45": 45}], 31: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - defaults._set('global', { - plugins: {} - }); - - module.exports = function (Chart) { - - /** - * The plugin service singleton - * @namespace Chart.plugins - * @since 2.1.0 - */ - Chart.plugins = { - /** - * Globally registered plugins. - * @private - */ - _plugins: [], - - /** - * This identifier is used to invalidate the descriptors cache attached to each chart - * when a global plugin is registered or unregistered. In this case, the cache ID is - * incremented and descriptors are regenerated during following API calls. - * @private - */ - _cacheId: 0, - - /** - * Registers the given plugin(s) if not already registered. - * @param {Array|Object} plugins plugin instance(s). - */ - register: function (plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function (plugin) { - if (p.indexOf(plugin) === -1) { - p.push(plugin); - } - }); - - this._cacheId++; - }, - - /** - * Unregisters the given plugin(s) only if registered. - * @param {Array|Object} plugins plugin instance(s). - */ - unregister: function (plugins) { - var p = this._plugins; - ([]).concat(plugins).forEach(function (plugin) { - var idx = p.indexOf(plugin); - if (idx !== -1) { - p.splice(idx, 1); - } - }); - - this._cacheId++; - }, - - /** - * Remove all registered plugins. - * @since 2.1.5 - */ - clear: function () { - this._plugins = []; - this._cacheId++; - }, - - /** - * Returns the number of registered plugins? - * @returns {Number} - * @since 2.1.5 - */ - count: function () { - return this._plugins.length; - }, - - /** - * Returns all registered plugin instances. - * @returns {Array} array of plugin objects. - * @since 2.1.5 - */ - getAll: function () { - return this._plugins; - }, - - /** - * Calls enabled plugins for `chart` on the specified hook and with the given args. - * This method immediately returns as soon as a plugin explicitly returns false. The - * returned value can be used, for instance, to interrupt the current action. - * @param {Object} chart - The chart instance for which plugins should be called. - * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). - * @param {Array} [args] - Extra arguments to apply to the hook call. - * @returns {Boolean} false if any of the plugins return false, else returns true. - */ - notify: function (chart, hook, args) { - var descriptors = this.descriptors(chart); - var ilen = descriptors.length; - var i, descriptor, plugin, params, method; - - for (i = 0; i < ilen; ++i) { - descriptor = descriptors[i]; - plugin = descriptor.plugin; - method = plugin[hook]; - if (typeof method === 'function') { - params = [chart].concat(args || []); - params.push(descriptor.options); - if (method.apply(plugin, params) === false) { - return false; - } - } - } - - return true; - }, - - /** - * Returns descriptors of enabled plugins for the given chart. - * @returns {Array} [{ plugin, options }] - * @private - */ - descriptors: function (chart) { - var cache = chart._plugins || (chart._plugins = {}); - if (cache.id === this._cacheId) { - return cache.descriptors; - } - - var plugins = []; - var descriptors = []; - var config = (chart && chart.config) || {}; - var options = (config.options && config.options.plugins) || {}; - - this._plugins.concat(config.plugins || []).forEach(function (plugin) { - var idx = plugins.indexOf(plugin); - if (idx !== -1) { - return; - } - - var id = plugin.id; - var opts = options[id]; - if (opts === false) { - return; - } - - if (opts === true) { - opts = helpers.clone(defaults.global.plugins[id]); - } - - plugins.push(plugin); - descriptors.push({ - plugin: plugin, - options: opts || {} - }); - }); - - cache.descriptors = descriptors; - cache.id = this._cacheId; - return descriptors; - } - }; - - /** - * Plugin extension hooks. - * @interface IPlugin - * @since 2.1.0 - */ - /** - * @method IPlugin#beforeInit - * @desc Called before initializing `chart`. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#afterInit - * @desc Called after `chart` has been initialized and before the first update. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeUpdate - * @desc Called before updating `chart`. If any plugin returns `false`, the update - * is cancelled (and thus subsequent render(s)) until another `update` is triggered. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart update. - */ - /** - * @method IPlugin#afterUpdate - * @desc Called after `chart` has been updated and before rendering. Note that this - * hook will not be called if the chart update has been previously cancelled. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeDatasetsUpdate - * @desc Called before updating the `chart` datasets. If any plugin returns `false`, - * the datasets update is cancelled until another `update` is triggered. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - * @returns {Boolean} false to cancel the datasets update. - * @since version 2.1.5 - */ - /** - * @method IPlugin#afterDatasetsUpdate - * @desc Called after the `chart` datasets have been updated. Note that this hook - * will not be called if the datasets update has been previously cancelled. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - * @since version 2.1.5 - */ - /** - * @method IPlugin#beforeDatasetUpdate - * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin - * returns `false`, the datasets update is cancelled until another `update` is triggered. - * @param {Chart} chart - The chart instance. - * @param {Object} args - The call arguments. - * @param {Number} args.index - The dataset index. - * @param {Object} args.meta - The dataset metadata. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart datasets drawing. - */ - /** - * @method IPlugin#afterDatasetUpdate - * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note - * that this hook will not be called if the datasets update has been previously cancelled. - * @param {Chart} chart - The chart instance. - * @param {Object} args - The call arguments. - * @param {Number} args.index - The dataset index. - * @param {Object} args.meta - The dataset metadata. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeLayout - * @desc Called before laying out `chart`. If any plugin returns `false`, - * the layout update is cancelled until another `update` is triggered. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart layout. - */ - /** - * @method IPlugin#afterLayout - * @desc Called after the `chart` has been layed out. Note that this hook will not - * be called if the layout update has been previously cancelled. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeRender - * @desc Called before rendering `chart`. If any plugin returns `false`, - * the rendering is cancelled until another `render` is triggered. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart rendering. - */ - /** - * @method IPlugin#afterRender - * @desc Called after the `chart` has been fully rendered (and animation completed). Note - * that this hook will not be called if the rendering has been previously cancelled. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeDraw - * @desc Called before drawing `chart` at every animation frame specified by the given - * easing value. If any plugin returns `false`, the frame drawing is cancelled until - * another `render` is triggered. - * @param {Chart.Controller} chart - The chart instance. - * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart drawing. - */ - /** - * @method IPlugin#afterDraw - * @desc Called after the `chart` has been drawn for the specific easing value. Note - * that this hook will not be called if the drawing has been previously cancelled. - * @param {Chart.Controller} chart - The chart instance. - * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeDatasetsDraw - * @desc Called before drawing the `chart` datasets. If any plugin returns `false`, - * the datasets drawing is cancelled until another `render` is triggered. - * @param {Chart.Controller} chart - The chart instance. - * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart datasets drawing. - */ - /** - * @method IPlugin#afterDatasetsDraw - * @desc Called after the `chart` datasets have been drawn. Note that this hook - * will not be called if the datasets drawing has been previously cancelled. - * @param {Chart.Controller} chart - The chart instance. - * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeDatasetDraw - * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets - * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing - * is cancelled until another `render` is triggered. - * @param {Chart} chart - The chart instance. - * @param {Object} args - The call arguments. - * @param {Number} args.index - The dataset index. - * @param {Object} args.meta - The dataset metadata. - * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart datasets drawing. - */ - /** - * @method IPlugin#afterDatasetDraw - * @desc Called after the `chart` datasets at the given `args.index` have been drawn - * (datasets are drawn in the reverse order). Note that this hook will not be called - * if the datasets drawing has been previously cancelled. - * @param {Chart} chart - The chart instance. - * @param {Object} args - The call arguments. - * @param {Number} args.index - The dataset index. - * @param {Object} args.meta - The dataset metadata. - * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeTooltipDraw - * @desc Called before drawing the `tooltip`. If any plugin returns `false`, - * the tooltip drawing is cancelled until another `render` is triggered. - * @param {Chart} chart - The chart instance. - * @param {Object} args - The call arguments. - * @param {Object} args.tooltip - The tooltip. - * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - * @returns {Boolean} `false` to cancel the chart tooltip drawing. - */ - /** - * @method IPlugin#afterTooltipDraw - * @desc Called after drawing the `tooltip`. Note that this hook will not - * be called if the tooltip drawing has been previously cancelled. - * @param {Chart} chart - The chart instance. - * @param {Object} args - The call arguments. - * @param {Object} args.tooltip - The tooltip. - * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#beforeEvent - * @desc Called before processing the specified `event`. If any plugin returns `false`, - * the event will be discarded. - * @param {Chart.Controller} chart - The chart instance. - * @param {IEvent} event - The event object. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#afterEvent - * @desc Called after the `event` has been consumed. Note that this hook - * will not be called if the `event` has been previously discarded. - * @param {Chart.Controller} chart - The chart instance. - * @param {IEvent} event - The event object. - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#resize - * @desc Called after the chart as been resized. - * @param {Chart.Controller} chart - The chart instance. - * @param {Number} size - The new canvas display size (eq. canvas.style width & height). - * @param {Object} options - The plugin options. - */ - /** - * @method IPlugin#destroy - * @desc Called after the chart as been destroyed. - * @param {Chart.Controller} chart - The chart instance. - * @param {Object} options - The plugin options. - */ - - /** - * Provided for backward compatibility, use Chart.plugins instead - * @namespace Chart.pluginService - * @deprecated since version 2.1.5 - * @todo remove at version 3 - * @private - */ - Chart.pluginService = Chart.plugins; - - /** - * Provided for backward compatibility, inheriting from Chart.PlugingBase has no - * effect, instead simply create/register plugins via plain JavaScript objects. - * @interface Chart.PluginBase - * @deprecated since version 2.5.0 - * @todo remove at version 3 - * @private - */ - Chart.PluginBase = Element.extend({}); - }; - - }, {"25": 25, "26": 26, "45": 45}], 32: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - var Ticks = require(34); - - defaults._set('scale', { - display: true, - position: 'left', - offset: false, - - // grid line settings - gridLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1, - drawBorder: true, - drawOnChartArea: true, - drawTicks: true, - tickMarkLength: 10, - zeroLineWidth: 1, - zeroLineColor: 'rgba(0,0,0,0.25)', - zeroLineBorderDash: [], - zeroLineBorderDashOffset: 0.0, - offsetGridLines: false, - borderDash: [], - borderDashOffset: 0.0 - }, - - // scale label - scaleLabel: { - // display property - display: false, - - // actual label - labelString: '', - - // line height - lineHeight: 1.2, - - // top/bottom padding - padding: { - top: 4, - bottom: 4 - } - }, - - // label settings - ticks: { - beginAtZero: false, - minRotation: 0, - maxRotation: 50, - mirror: false, - padding: 0, - reverse: false, - display: true, - autoSkip: true, - autoSkipPadding: 0, - labelOffset: 0, - // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. - callback: Ticks.formatters.values, - minor: {}, - major: {} - } - }); - - function labelsFromTicks(ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(ticks[i].label); - } - - return labels; - } - - function getLineValue(scale, index, offsetGridLines) { - var lineValue = scale.getPixelForTick(index); - - if (offsetGridLines) { - if (index === 0) { - lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; - } else { - lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; - } - } - return lineValue; - } - - module.exports = function (Chart) { - - function computeTextSize(context, tick, font) { - return helpers.isArray(tick) ? - helpers.longestText(context, font, tick) : - context.measureText(tick).width; - } - - function parseFontOptions(options) { - var valueOrDefault = helpers.valueOrDefault; - var globalDefaults = defaults.global; - var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); - var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle); - var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily); - - return { - size: size, - style: style, - family: family, - font: helpers.fontString(size, style, family) - }; - } - - function parseLineHeight(options) { - return helpers.options.toLineHeight( - helpers.valueOrDefault(options.lineHeight, 1.2), - helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize)); - } - - Chart.Scale = Element.extend({ - /** - * Get the padding needed for the scale - * @method getPadding - * @private - * @returns {Padding} the necessary padding - */ - getPadding: function () { - var me = this; - return { - left: me.paddingLeft || 0, - top: me.paddingTop || 0, - right: me.paddingRight || 0, - bottom: me.paddingBottom || 0 - }; - }, - - /** - * Returns the scale tick objects ({label, major}) - * @since 2.7 - */ - getTicks: function () { - return this._ticks; - }, - - // These methods are ordered by lifecyle. Utilities then follow. - // Any function defined here is inherited by all scale types. - // Any function can be extended by the scale type - - mergeTicksOptions: function () { - var ticks = this.options.ticks; - if (ticks.minor === false) { - ticks.minor = { - display: false - }; - } - if (ticks.major === false) { - ticks.major = { - display: false - }; - } - for (var key in ticks) { - if (key !== 'major' && key !== 'minor') { - if (typeof ticks.minor[key] === 'undefined') { - ticks.minor[key] = ticks[key]; - } - if (typeof ticks.major[key] === 'undefined') { - ticks.major[key] = ticks[key]; - } - } - } - }, - beforeUpdate: function () { - helpers.callback(this.options.beforeUpdate, [this]); - }, - update: function (maxWidth, maxHeight, margins) { - var me = this; - var i, ilen, labels, label, ticks, tick; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = helpers.extend({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, margins); - me.longestTextCache = me.longestTextCache || {}; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - - // Data min/max - me.beforeDataLimits(); - me.determineDataLimits(); - me.afterDataLimits(); - - // Ticks - `this.ticks` is now DEPRECATED! - // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member - // and must not be accessed directly from outside this class. `this.ticks` being - // around for long time and not marked as private, we can't change its structure - // without unexpected breaking changes. If you need to access the scale ticks, - // use scale.getTicks() instead. - - me.beforeBuildTicks(); - - // New implementations should return an array of objects but for BACKWARD COMPAT, - // we still support no return (`this.ticks` internally set by calling this method). - ticks = me.buildTicks() || []; - - me.afterBuildTicks(); - - me.beforeTickToLabelConversion(); - - // New implementations should return the formatted tick labels but for BACKWARD - // COMPAT, we still support no return (`this.ticks` internally changed by calling - // this method and supposed to contain only string values). - labels = me.convertTicksToLabels(ticks) || me.ticks; - - me.afterTickToLabelConversion(); - - me.ticks = labels; // BACKWARD COMPATIBILITY - - // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! - - // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) - for (i = 0, ilen = labels.length; i < ilen; ++i) { - label = labels[i]; - tick = ticks[i]; - if (!tick) { - ticks.push(tick = { - label: label, - major: false - }); - } else { - tick.label = label; - } - } - - me._ticks = ticks; - - // Tick Rotation - me.beforeCalculateTickRotation(); - me.calculateTickRotation(); - me.afterCalculateTickRotation(); - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: function () { - helpers.callback(this.options.afterUpdate, [this]); - }, - - // - - beforeSetDimensions: function () { - helpers.callback(this.options.beforeSetDimensions, [this]); - }, - setDimensions: function () { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - }, - afterSetDimensions: function () { - helpers.callback(this.options.afterSetDimensions, [this]); - }, - - // Data limits - beforeDataLimits: function () { - helpers.callback(this.options.beforeDataLimits, [this]); - }, - determineDataLimits: helpers.noop, - afterDataLimits: function () { - helpers.callback(this.options.afterDataLimits, [this]); - }, - - // - beforeBuildTicks: function () { - helpers.callback(this.options.beforeBuildTicks, [this]); - }, - buildTicks: helpers.noop, - afterBuildTicks: function () { - helpers.callback(this.options.afterBuildTicks, [this]); - }, - - beforeTickToLabelConversion: function () { - helpers.callback(this.options.beforeTickToLabelConversion, [this]); - }, - convertTicksToLabels: function () { - var me = this; - // Convert ticks to strings - var tickOpts = me.options.ticks; - me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); - }, - afterTickToLabelConversion: function () { - helpers.callback(this.options.afterTickToLabelConversion, [this]); - }, - - // - - beforeCalculateTickRotation: function () { - helpers.callback(this.options.beforeCalculateTickRotation, [this]); - }, - calculateTickRotation: function () { - var me = this; - var context = me.ctx; - var tickOpts = me.options.ticks; - var labels = labelsFromTicks(me._ticks); - - // Get the width of each grid by calculating the difference - // between x offsets between 0 and 1. - var tickFont = parseFontOptions(tickOpts); - context.font = tickFont.font; - - var labelRotation = tickOpts.minRotation || 0; - - if (labels.length && me.options.display && me.isHorizontal()) { - var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache); - var labelWidth = originalLabelWidth; - var cosRotation, sinRotation; - - // Allow 3 pixels x2 padding either side for label readability - var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; - - // Max label rotation can be set or default to 90 - also act as a loop counter - while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { - var angleRadians = helpers.toRadians(labelRotation); - cosRotation = Math.cos(angleRadians); - sinRotation = Math.sin(angleRadians); - - if (sinRotation * originalLabelWidth > me.maxHeight) { - // go back one step - labelRotation--; - break; - } - - labelRotation++; - labelWidth = cosRotation * originalLabelWidth; - } - } - - me.labelRotation = labelRotation; - }, - afterCalculateTickRotation: function () { - helpers.callback(this.options.afterCalculateTickRotation, [this]); - }, - - // - - beforeFit: function () { - helpers.callback(this.options.beforeFit, [this]); - }, - fit: function () { - var me = this; - // Reset - var minSize = me.minSize = { - width: 0, - height: 0 - }; - - var labels = labelsFromTicks(me._ticks); - - var opts = me.options; - var tickOpts = opts.ticks; - var scaleLabelOpts = opts.scaleLabel; - var gridLineOpts = opts.gridLines; - var display = opts.display; - var isHorizontal = me.isHorizontal(); - - var tickFont = parseFontOptions(tickOpts); - var tickMarkLength = opts.gridLines.tickMarkLength; - - // Width - if (isHorizontal) { - // subtract the margins to line up with the chartArea if we are a full width scale - minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; - } else { - minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } - - // height - if (isHorizontal) { - minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; - } else { - minSize.height = me.maxHeight; // fill all the height - } - - // Are we showing a title for the scale? - if (scaleLabelOpts.display && display) { - var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts); - var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding); - var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height; - - if (isHorizontal) { - minSize.height += deltaHeight; - } else { - minSize.width += deltaHeight; - } - } - - // Don't bother fitting the ticks if we are not showing them - if (tickOpts.display && display) { - var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache); - var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels); - var lineSpace = tickFont.size * 0.5; - var tickPadding = me.options.ticks.padding; - - if (isHorizontal) { - // A horizontal axis is more constrained by the height. - me.longestLabelWidth = largestTextWidth; - - var angleRadians = helpers.toRadians(me.labelRotation); - var cosRotation = Math.cos(angleRadians); - var sinRotation = Math.sin(angleRadians); - - // TODO - improve this calculation - var labelHeight = (sinRotation * largestTextWidth) - + (tickFont.size * tallestLabelHeightInLines) - + (lineSpace * (tallestLabelHeightInLines - 1)) - + lineSpace; // padding - - minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); - - me.ctx.font = tickFont.font; - var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font); - var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font); - - // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned - // which means that the right padding is dominated by the font height - if (me.labelRotation !== 0) { - me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges - me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3; - } else { - me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges - me.paddingRight = lastLabelWidth / 2 + 3; - } - } else { - // A vertical axis is more constrained by the width. Labels are the - // dominant factor here, so get that length first and account for padding - if (tickOpts.mirror) { - largestTextWidth = 0; - } else { - // use lineSpace for consistency with horizontal axis - // tickPadding is not implemented for horizontal - largestTextWidth += tickPadding + lineSpace; - } - - minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); - - me.paddingTop = tickFont.size / 2; - me.paddingBottom = tickFont.size / 2; - } - } - - me.handleMargins(); - - me.width = minSize.width; - me.height = minSize.height; - }, - - /** - * Handle margins and padding interactions - * @private - */ - handleMargins: function () { - var me = this; - if (me.margins) { - me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); - me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); - me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); - me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); - } - }, - - afterFit: function () { - helpers.callback(this.options.afterFit, [this]); - }, - - // Shared Methods - isHorizontal: function () { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - isFullWidth: function () { - return (this.options.fullWidth); - }, - - // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not - getRightValue: function (rawValue) { - // Null and undefined values first - if (helpers.isNullOrUndef(rawValue)) { - return NaN; - } - // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values - if (typeof rawValue === 'number' && !isFinite(rawValue)) { - return NaN; - } - // If it is in fact an object, dive in one more level - if (rawValue) { - if (this.isHorizontal()) { - if (rawValue.x !== undefined) { - return this.getRightValue(rawValue.x); - } - } else if (rawValue.y !== undefined) { - return this.getRightValue(rawValue.y); - } - } - - // Value is good, return it - return rawValue; - }, - - /** - * Used to get the value to display in the tooltip for the data at the given index - * @param index - * @param datasetIndex - */ - getLabelForIndex: helpers.noop, - - /** - * Returns the location of the given data point. Value can either be an index or a numerical value - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param value - * @param index - * @param datasetIndex - */ - getPixelForValue: helpers.noop, - - /** - * Used to get the data value from a given pixel. This is the inverse of getPixelForValue - * The coordinate (0, 0) is at the upper-left corner of the canvas - * @param pixel - */ - getValueForPixel: helpers.noop, - - /** - * Returns the location of the tick at the given index - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForTick: function (index) { - var me = this; - var offset = me.options.offset; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var pixel = (tickWidth * index) + me.paddingLeft; - - if (offset) { - pixel += tickWidth / 2; - } - - var finalVal = me.left + Math.round(pixel); - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - var innerHeight = me.height - (me.paddingTop + me.paddingBottom); - return me.top + (index * (innerHeight / (me._ticks.length - 1))); - }, - - /** - * Utility for getting the pixel location of a percentage of scale - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getPixelForDecimal: function (decimal) { - var me = this; - if (me.isHorizontal()) { - var innerWidth = me.width - (me.paddingLeft + me.paddingRight); - var valueOffset = (innerWidth * decimal) + me.paddingLeft; - - var finalVal = me.left + Math.round(valueOffset); - finalVal += me.isFullWidth() ? me.margins.left : 0; - return finalVal; - } - return me.top + (decimal * me.height); - }, - - /** - * Returns the pixel for the minimum chart value - * The coordinate (0, 0) is at the upper-left corner of the canvas - */ - getBasePixel: function () { - return this.getPixelForValue(this.getBaseValue()); - }, - - getBaseValue: function () { - var me = this; - var min = me.min; - var max = me.max; - - return me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0; - }, - - /** - * Returns a subset of ticks to be plotted to avoid overlapping labels. - * @private - */ - _autoSkip: function (ticks) { - var skipRatio; - var me = this; - var isHorizontal = me.isHorizontal(); - var optionTicks = me.options.ticks.minor; - var tickCount = ticks.length; - var labelRotationRadians = helpers.toRadians(me.labelRotation); - var cosRotation = Math.cos(labelRotationRadians); - var longestRotatedLabel = me.longestLabelWidth * cosRotation; - var result = []; - var i, tick, shouldSkip; - - // figure out the maximum number of gridlines to show - var maxTicks; - if (optionTicks.maxTicksLimit) { - maxTicks = optionTicks.maxTicksLimit; - } - - if (isHorizontal) { - skipRatio = false; - - if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) { - skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight))); - } - - // if they defined a max number of optionTicks, - // increase skipRatio until that number is met - if (maxTicks && tickCount > maxTicks) { - skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks)); - } - } - - for (i = 0; i < tickCount; i++) { - tick = ticks[i]; - - // Since we always show the last tick,we need may need to hide the last shown one before - shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount); - if (shouldSkip && i !== tickCount - 1) { - // leave tick in place but make sure it's not displayed (#4635) - delete tick.label; - } - result.push(tick); - } - return result; - }, - - // Actually draw the scale on the canvas - // @param {rectangle} chartArea : the area of the chart to draw full grid lines on - draw: function (chartArea) { - var me = this; - var options = me.options; - if (!options.display) { - return; - } - - var context = me.ctx; - var globalDefaults = defaults.global; - var optionTicks = options.ticks.minor; - var optionMajorTicks = options.ticks.major || optionTicks; - var gridLines = options.gridLines; - var scaleLabel = options.scaleLabel; - - var isRotated = me.labelRotation !== 0; - var isHorizontal = me.isHorizontal(); - - var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); - var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor); - var tickFont = parseFontOptions(optionTicks); - var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor); - var majorTickFont = parseFontOptions(optionMajorTicks); - - var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; - - var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor); - var scaleLabelFont = parseFontOptions(scaleLabel); - var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); - var labelRotationRadians = helpers.toRadians(me.labelRotation); - - var itemsToDraw = []; - - var xTickStart = options.position === 'right' ? me.left : me.right - tl; - var xTickEnd = options.position === 'right' ? me.left + tl : me.right; - var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl; - var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom; - - helpers.each(ticks, function (tick, index) { - // autoskipper skipped this tick (#4635) - if (helpers.isNullOrUndef(tick.label)) { - return; - } - - var label = tick.label; - var lineWidth, lineColor, borderDash, borderDashOffset; - if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { - // Draw the first index specially - lineWidth = gridLines.zeroLineWidth; - lineColor = gridLines.zeroLineColor; - borderDash = gridLines.zeroLineBorderDash; - borderDashOffset = gridLines.zeroLineBorderDashOffset; - } else { - lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index); - lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index); - borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash); - borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset); - } - - // Common properties - var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY; - var textAlign = 'middle'; - var textBaseline = 'middle'; - var tickPadding = optionTicks.padding; - - if (isHorizontal) { - var labelYOffset = tl + tickPadding; - - if (options.position === 'bottom') { - // bottom - textBaseline = !isRotated ? 'top' : 'middle'; - textAlign = !isRotated ? 'center' : 'right'; - labelY = me.top + labelYOffset; - } else { - // top - textBaseline = !isRotated ? 'bottom' : 'middle'; - textAlign = !isRotated ? 'center' : 'left'; - labelY = me.bottom - labelYOffset; - } - - var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); - if (xLineValue < me.left) { - lineColor = 'rgba(0,0,0,0)'; - } - xLineValue += helpers.aliasPixel(lineWidth); - - labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option) - - tx1 = tx2 = x1 = x2 = xLineValue; - ty1 = yTickStart; - ty2 = yTickEnd; - y1 = chartArea.top; - y2 = chartArea.bottom; - } else { - var isLeft = options.position === 'left'; - var labelXOffset; - - if (optionTicks.mirror) { - textAlign = isLeft ? 'left' : 'right'; - labelXOffset = tickPadding; - } else { - textAlign = isLeft ? 'right' : 'left'; - labelXOffset = tl + tickPadding; - } - - labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset; - - var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); - if (yLineValue < me.top) { - lineColor = 'rgba(0,0,0,0)'; - } - yLineValue += helpers.aliasPixel(lineWidth); - - labelY = me.getPixelForTick(index) + optionTicks.labelOffset; - - tx1 = xTickStart; - tx2 = xTickEnd; - x1 = chartArea.left; - x2 = chartArea.right; - ty1 = ty2 = y1 = y2 = yLineValue; - } - - itemsToDraw.push({ - tx1: tx1, - ty1: ty1, - tx2: tx2, - ty2: ty2, - x1: x1, - y1: y1, - x2: x2, - y2: y2, - labelX: labelX, - labelY: labelY, - glWidth: lineWidth, - glColor: lineColor, - glBorderDash: borderDash, - glBorderDashOffset: borderDashOffset, - rotation: -1 * labelRotationRadians, - label: label, - major: tick.major, - textBaseline: textBaseline, - textAlign: textAlign - }); - }); - - // Draw all of the tick labels, tick marks, and grid lines at the correct places - helpers.each(itemsToDraw, function (itemToDraw) { - if (gridLines.display) { - context.save(); - context.lineWidth = itemToDraw.glWidth; - context.strokeStyle = itemToDraw.glColor; - if (context.setLineDash) { - context.setLineDash(itemToDraw.glBorderDash); - context.lineDashOffset = itemToDraw.glBorderDashOffset; - } - - context.beginPath(); - - if (gridLines.drawTicks) { - context.moveTo(itemToDraw.tx1, itemToDraw.ty1); - context.lineTo(itemToDraw.tx2, itemToDraw.ty2); - } - - if (gridLines.drawOnChartArea) { - context.moveTo(itemToDraw.x1, itemToDraw.y1); - context.lineTo(itemToDraw.x2, itemToDraw.y2); - } - - context.stroke(); - context.restore(); - } - - if (optionTicks.display) { - // Make sure we draw text in the correct color and font - context.save(); - context.translate(itemToDraw.labelX, itemToDraw.labelY); - context.rotate(itemToDraw.rotation); - context.font = itemToDraw.major ? majorTickFont.font : tickFont.font; - context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; - context.textBaseline = itemToDraw.textBaseline; - context.textAlign = itemToDraw.textAlign; - - var label = itemToDraw.label; - if (helpers.isArray(label)) { - for (var i = 0, y = 0; i < label.length; ++i) { - // We just make sure the multiline element is a string here.. - context.fillText('' + label[i], 0, y); - // apply same lineSpacing as calculated @ L#320 - y += (tickFont.size * 1.5); - } - } else { - context.fillText(label, 0, 0); - } - context.restore(); - } - }); - - if (scaleLabel.display) { - // Draw the scale label - var scaleLabelX; - var scaleLabelY; - var rotation = 0; - var halfLineHeight = parseLineHeight(scaleLabel) / 2; - - if (isHorizontal) { - scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width - scaleLabelY = options.position === 'bottom' - ? me.bottom - halfLineHeight - scaleLabelPadding.bottom - : me.top + halfLineHeight + scaleLabelPadding.top; - } else { - var isLeft = options.position === 'left'; - scaleLabelX = isLeft - ? me.left + halfLineHeight + scaleLabelPadding.top - : me.right - halfLineHeight - scaleLabelPadding.top; - scaleLabelY = me.top + ((me.bottom - me.top) / 2); - rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; - } - - context.save(); - context.translate(scaleLabelX, scaleLabelY); - context.rotate(rotation); - context.textAlign = 'center'; - context.textBaseline = 'middle'; - context.fillStyle = scaleLabelFontColor; // render in correct colour - context.font = scaleLabelFont.font; - context.fillText(scaleLabel.labelString, 0, 0); - context.restore(); - } - - if (gridLines.drawBorder) { - // Draw the line at the edge of the axis - context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0); - context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0); - var x1 = me.left; - var x2 = me.right; - var y1 = me.top; - var y2 = me.bottom; - - var aliasPixel = helpers.aliasPixel(context.lineWidth); - if (isHorizontal) { - y1 = y2 = options.position === 'top' ? me.bottom : me.top; - y1 += aliasPixel; - y2 += aliasPixel; - } else { - x1 = x2 = options.position === 'left' ? me.right : me.left; - x1 += aliasPixel; - x2 += aliasPixel; - } - - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.stroke(); - } - } - }); - }; - - }, {"25": 25, "26": 26, "34": 34, "45": 45}], 33: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var helpers = require(45); - - module.exports = function (Chart) { - - Chart.scaleService = { - // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then - // use the new chart options to grab the correct scale - constructors: {}, - // Use a registration function so that we can move to an ES6 map when we no longer need to support - // old browsers - - // Scale config defaults - defaults: {}, - registerScaleType: function (type, scaleConstructor, scaleDefaults) { - this.constructors[type] = scaleConstructor; - this.defaults[type] = helpers.clone(scaleDefaults); - }, - getScaleConstructor: function (type) { - return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; - }, - getScaleDefaults: function (type) { - // Return the scale defaults merged with the global settings so that we always use the latest ones - return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {}; - }, - updateScaleDefaults: function (type, additions) { - var me = this; - if (me.defaults.hasOwnProperty(type)) { - me.defaults[type] = helpers.extend(me.defaults[type], additions); - } - }, - addScalesToLayout: function (chart) { - // Adds each scale to the chart.boxes array to be sized accordingly - helpers.each(chart.scales, function (scale) { - // Set ILayoutItem parameters for backwards compatibility - scale.fullWidth = scale.options.fullWidth; - scale.position = scale.options.position; - scale.weight = scale.options.weight; - Chart.layoutService.addBox(chart, scale); - }); - } - }; - }; - - }, {"25": 25, "45": 45}], 34: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - - /** - * Namespace to hold static tick generation functions - * @namespace Chart.Ticks - */ - module.exports = { - /** - * Namespace to hold generators for different types of ticks - * @namespace Chart.Ticks.generators - */ - generators: { - /** - * Interface for the options provided to the numeric tick generator - * @interface INumericTickGenerationOptions - */ - /** - * The maximum number of ticks to display - * @name INumericTickGenerationOptions#maxTicks - * @type Number - */ - /** - * The distance between each tick. - * @name INumericTickGenerationOptions#stepSize - * @type Number - * @optional - */ - /** - * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum - * @name INumericTickGenerationOptions#min - * @type Number - * @optional - */ - /** - * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum - * @name INumericTickGenerationOptions#max - * @type Number - * @optional - */ - - /** - * Generate a set of linear ticks - * @method Chart.Ticks.generators.linear - * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks - * @param dataRange {IRange} the range of the data - * @returns {Array} array of tick values - */ - linear: function (generationOptions, dataRange) { - var ticks = []; - // To get a "nice" value for the tick spacing, we will use the appropriately named - // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks - // for details. - - var spacing; - if (generationOptions.stepSize && generationOptions.stepSize > 0) { - spacing = generationOptions.stepSize; - } else { - var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false); - spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true); - } - var niceMin = Math.floor(dataRange.min / spacing) * spacing; - var niceMax = Math.ceil(dataRange.max / spacing) * spacing; - - // If min, max and stepSize is set and they make an evenly spaced scale use it. - if (generationOptions.min && generationOptions.max && generationOptions.stepSize) { - // If very close to our whole number, use it. - if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) { - niceMin = generationOptions.min; - niceMax = generationOptions.max; - } - } - - var numSpaces = (niceMax - niceMin) / spacing; - // If very close to our rounded value, use it. - if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { - numSpaces = Math.round(numSpaces); - } else { - numSpaces = Math.ceil(numSpaces); - } - - // Put the values into the ticks array - ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin); - for (var j = 1; j < numSpaces; ++j) { - ticks.push(niceMin + (j * spacing)); - } - ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax); - - return ticks; - }, - - /** - * Generate a set of logarithmic ticks - * @method Chart.Ticks.generators.logarithmic - * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks - * @param dataRange {IRange} the range of the data - * @returns {Array} array of tick values - */ - logarithmic: function (generationOptions, dataRange) { - var ticks = []; - var valueOrDefault = helpers.valueOrDefault; - - // Figure out what the max number of ticks we can support it is based on the size of - // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 - // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on - // the graph - var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min)))); - - var endExp = Math.floor(helpers.log10(dataRange.max)); - var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); - var exp, significand; - - if (tickVal === 0) { - exp = Math.floor(helpers.log10(dataRange.minNotZero)); - significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); - - ticks.push(tickVal); - tickVal = significand * Math.pow(10, exp); - } else { - exp = Math.floor(helpers.log10(tickVal)); - significand = Math.floor(tickVal / Math.pow(10, exp)); - } - - do { - ticks.push(tickVal); - - ++significand; - if (significand === 10) { - significand = 1; - ++exp; - } - - tickVal = significand * Math.pow(10, exp); - } while (exp < endExp || (exp === endExp && significand < endSignificand)); - - var lastTick = valueOrDefault(generationOptions.max, tickVal); - ticks.push(lastTick); - - return ticks; - } - }, - - /** - * Namespace to hold formatters for different types of ticks - * @namespace Chart.Ticks.formatters - */ - formatters: { - /** - * Formatter for value labels - * @method Chart.Ticks.formatters.values - * @param value the value to display - * @return {String|Array} the label to display - */ - values: function (value) { - return helpers.isArray(value) ? value : '' + value; - }, - - /** - * Formatter for linear numeric ticks - * @method Chart.Ticks.formatters.linear - * @param tickValue {Number} the value to be formatted - * @param index {Number} the position of the tickValue parameter in the ticks array - * @param ticks {Array} the list of ticks being converted - * @return {String} string representation of the tickValue parameter - */ - linear: function (tickValue, index, ticks) { - // If we have lots of ticks, don't use the ones - var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; - - // If we have a number like 2.5 as the delta, figure out how many decimal places we need - if (Math.abs(delta) > 1) { - if (tickValue !== Math.floor(tickValue)) { - // not an integer - delta = tickValue - Math.floor(tickValue); - } - } - - var logDelta = helpers.log10(Math.abs(delta)); - var tickString = ''; - - if (tickValue !== 0) { - var numDecimal = -1 * Math.floor(logDelta); - numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places - tickString = tickValue.toFixed(numDecimal); - } else { - tickString = '0'; // never show decimal places for 0 - } - - return tickString; - }, - - logarithmic: function (tickValue, index, ticks) { - var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue)))); - - if (tickValue === 0) { - return '0'; - } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { - return tickValue.toExponential(); - } - return ''; - } - } - }; - - }, {"45": 45}], 35: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - defaults._set('global', { - tooltips: { - enabled: true, - custom: null, - mode: 'nearest', - position: 'average', - intersect: true, - backgroundColor: 'rgba(0,0,0,0.8)', - titleFontStyle: 'bold', - titleSpacing: 2, - titleMarginBottom: 6, - titleFontColor: '#fff', - titleAlign: 'left', - bodySpacing: 2, - bodyFontColor: '#fff', - bodyAlign: 'left', - footerFontStyle: 'bold', - footerSpacing: 2, - footerMarginTop: 6, - footerFontColor: '#fff', - footerAlign: 'left', - yPadding: 6, - xPadding: 6, - caretPadding: 2, - caretSize: 5, - cornerRadius: 6, - multiKeyBackground: '#fff', - displayColors: true, - borderColor: 'rgba(0,0,0,0)', - borderWidth: 0, - callbacks: { - // Args are: (tooltipItems, data) - beforeTitle: helpers.noop, - title: function (tooltipItems, data) { - // Pick first xLabel for now - var title = ''; - var labels = data.labels; - var labelCount = labels ? labels.length : 0; - - if (tooltipItems.length > 0) { - var item = tooltipItems[0]; - - if (item.xLabel) { - title = item.xLabel; - } else if (labelCount > 0 && item.index < labelCount) { - title = labels[item.index]; - } - } - - return title; - }, - afterTitle: helpers.noop, - - // Args are: (tooltipItems, data) - beforeBody: helpers.noop, - - // Args are: (tooltipItem, data) - beforeLabel: helpers.noop, - label: function (tooltipItem, data) { - var label = data.datasets[tooltipItem.datasetIndex].label || ''; - - if (label) { - label += ': '; - } - label += tooltipItem.yLabel; - return label; - }, - labelColor: function (tooltipItem, chart) { - var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); - var activeElement = meta.data[tooltipItem.index]; - var view = activeElement._view; - return { - borderColor: view.borderColor, - backgroundColor: view.backgroundColor - }; - }, - labelTextColor: function () { - return this._options.bodyFontColor; - }, - afterLabel: helpers.noop, - - // Args are: (tooltipItems, data) - afterBody: helpers.noop, - - // Args are: (tooltipItems, data) - beforeFooter: helpers.noop, - footer: helpers.noop, - afterFooter: helpers.noop - } - } - }); - - module.exports = function (Chart) { - - /** - * Helper method to merge the opacity into a color - */ - function mergeOpacity(colorString, opacity) { - var color = helpers.color(colorString); - return color.alpha(opacity * color.alpha()).rgbaString(); - } - - // Helper to push or concat based on if the 2nd parameter is an array or not - function pushOrConcat(base, toPush) { - if (toPush) { - if (helpers.isArray(toPush)) { - // base = base.concat(toPush); - Array.prototype.push.apply(base, toPush); - } else { - base.push(toPush); - } - } - - return base; - } - - // Private helper to create a tooltip item model - // @param element : the chart element (point, arc, bar) to create the tooltip item for - // @return : new tooltip item - function createTooltipItem(element) { - var xScale = element._xScale; - var yScale = element._yScale || element._scale; // handle radar || polarArea charts - var index = element._index; - var datasetIndex = element._datasetIndex; - - return { - xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', - yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', - index: index, - datasetIndex: datasetIndex, - x: element._model.x, - y: element._model.y - }; - } - - /** - * Helper to get the reset model for the tooltip - * @param tooltipOpts {Object} the tooltip options - */ - function getBaseModel(tooltipOpts) { - var globalDefaults = defaults.global; - var valueOrDefault = helpers.valueOrDefault; - - return { - // Positioning - xPadding: tooltipOpts.xPadding, - yPadding: tooltipOpts.yPadding, - xAlign: tooltipOpts.xAlign, - yAlign: tooltipOpts.yAlign, - - // Body - bodyFontColor: tooltipOpts.bodyFontColor, - _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), - _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), - _bodyAlign: tooltipOpts.bodyAlign, - bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), - bodySpacing: tooltipOpts.bodySpacing, - - // Title - titleFontColor: tooltipOpts.titleFontColor, - _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), - _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), - titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), - _titleAlign: tooltipOpts.titleAlign, - titleSpacing: tooltipOpts.titleSpacing, - titleMarginBottom: tooltipOpts.titleMarginBottom, - - // Footer - footerFontColor: tooltipOpts.footerFontColor, - _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), - _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), - footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), - _footerAlign: tooltipOpts.footerAlign, - footerSpacing: tooltipOpts.footerSpacing, - footerMarginTop: tooltipOpts.footerMarginTop, - - // Appearance - caretSize: tooltipOpts.caretSize, - cornerRadius: tooltipOpts.cornerRadius, - backgroundColor: tooltipOpts.backgroundColor, - opacity: 0, - legendColorBackground: tooltipOpts.multiKeyBackground, - displayColors: tooltipOpts.displayColors, - borderColor: tooltipOpts.borderColor, - borderWidth: tooltipOpts.borderWidth - }; - } - - /** - * Get the size of the tooltip - */ - function getTooltipSize(tooltip, model) { - var ctx = tooltip._chart.ctx; - - var height = model.yPadding * 2; // Tooltip Padding - var width = 0; - - // Count of all lines in the body - var body = model.body; - var combinedBodyLength = body.reduce(function (count, bodyItem) { - return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; - }, 0); - combinedBodyLength += model.beforeBody.length + model.afterBody.length; - - var titleLineCount = model.title.length; - var footerLineCount = model.footer.length; - var titleFontSize = model.titleFontSize; - var bodyFontSize = model.bodyFontSize; - var footerFontSize = model.footerFontSize; - - height += titleLineCount * titleFontSize; // Title Lines - height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing - height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin - height += combinedBodyLength * bodyFontSize; // Body Lines - height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing - height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin - height += footerLineCount * (footerFontSize); // Footer Lines - height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing - - // Title width - var widthPadding = 0; - var maxLineWidth = function (line) { - width = Math.max(width, ctx.measureText(line).width + widthPadding); - }; - - ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); - helpers.each(model.title, maxLineWidth); - - // Body width - ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); - helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth); - - // Body lines may include some extra width due to the color box - widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; - helpers.each(body, function (bodyItem) { - helpers.each(bodyItem.before, maxLineWidth); - helpers.each(bodyItem.lines, maxLineWidth); - helpers.each(bodyItem.after, maxLineWidth); - }); - - // Reset back to 0 - widthPadding = 0; - - // Footer width - ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); - helpers.each(model.footer, maxLineWidth); - - // Add padding - width += 2 * model.xPadding; - - return { - width: width, - height: height - }; - } - - /** - * Helper to get the alignment of a tooltip given the size - */ - function determineAlignment(tooltip, size) { - var model = tooltip._model; - var chart = tooltip._chart; - var chartArea = tooltip._chart.chartArea; - var xAlign = 'center'; - var yAlign = 'center'; - - if (model.y < size.height) { - yAlign = 'top'; - } else if (model.y > (chart.height - size.height)) { - yAlign = 'bottom'; - } - - var lf, rf; // functions to determine left, right alignment - var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart - var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges - var midX = (chartArea.left + chartArea.right) / 2; - var midY = (chartArea.top + chartArea.bottom) / 2; - - if (yAlign === 'center') { - lf = function (x) { - return x <= midX; - }; - rf = function (x) { - return x > midX; - }; - } else { - lf = function (x) { - return x <= (size.width / 2); - }; - rf = function (x) { - return x >= (chart.width - (size.width / 2)); - }; - } - - olf = function (x) { - return x + size.width > chart.width; - }; - orf = function (x) { - return x - size.width < 0; - }; - yf = function (y) { - return y <= midY ? 'top' : 'bottom'; - }; - - if (lf(model.x)) { - xAlign = 'left'; - - // Is tooltip too wide and goes over the right side of the chart.? - if (olf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } else if (rf(model.x)) { - xAlign = 'right'; - - // Is tooltip too wide and goes outside left edge of canvas? - if (orf(model.x)) { - xAlign = 'center'; - yAlign = yf(model.y); - } - } - - var opts = tooltip._options; - return { - xAlign: opts.xAlign ? opts.xAlign : xAlign, - yAlign: opts.yAlign ? opts.yAlign : yAlign - }; - } - - /** - * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment - */ - function getBackgroundPoint(vm, size, alignment) { - // Background Position - var x = vm.x; - var y = vm.y; - - var caretSize = vm.caretSize; - var caretPadding = vm.caretPadding; - var cornerRadius = vm.cornerRadius; - var xAlign = alignment.xAlign; - var yAlign = alignment.yAlign; - var paddingAndSize = caretSize + caretPadding; - var radiusAndPadding = cornerRadius + caretPadding; - - if (xAlign === 'right') { - x -= size.width; - } else if (xAlign === 'center') { - x -= (size.width / 2); - } - - if (yAlign === 'top') { - y += paddingAndSize; - } else if (yAlign === 'bottom') { - y -= size.height + paddingAndSize; - } else { - y -= (size.height / 2); - } - - if (yAlign === 'center') { - if (xAlign === 'left') { - x += paddingAndSize; - } else if (xAlign === 'right') { - x -= paddingAndSize; - } - } else if (xAlign === 'left') { - x -= radiusAndPadding; - } else if (xAlign === 'right') { - x += radiusAndPadding; - } - - return { - x: x, - y: y - }; - } - - Chart.Tooltip = Element.extend({ - initialize: function () { - this._model = getBaseModel(this._options); - this._lastActive = []; - }, - - // Get the title - // Args are: (tooltipItem, data) - getTitle: function () { - var me = this; - var opts = me._options; - var callbacks = opts.callbacks; - - var beforeTitle = callbacks.beforeTitle.apply(me, arguments); - var title = callbacks.title.apply(me, arguments); - var afterTitle = callbacks.afterTitle.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, beforeTitle); - lines = pushOrConcat(lines, title); - lines = pushOrConcat(lines, afterTitle); - - return lines; - }, - - // Args are: (tooltipItem, data) - getBeforeBody: function () { - var lines = this._options.callbacks.beforeBody.apply(this, arguments); - return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; - }, - - // Args are: (tooltipItem, data) - getBody: function (tooltipItems, data) { - var me = this; - var callbacks = me._options.callbacks; - var bodyItems = []; - - helpers.each(tooltipItems, function (tooltipItem) { - var bodyItem = { - before: [], - lines: [], - after: [] - }; - pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data)); - pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); - pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data)); - - bodyItems.push(bodyItem); - }); - - return bodyItems; - }, - - // Args are: (tooltipItem, data) - getAfterBody: function () { - var lines = this._options.callbacks.afterBody.apply(this, arguments); - return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; - }, - - // Get the footer and beforeFooter and afterFooter lines - // Args are: (tooltipItem, data) - getFooter: function () { - var me = this; - var callbacks = me._options.callbacks; - - var beforeFooter = callbacks.beforeFooter.apply(me, arguments); - var footer = callbacks.footer.apply(me, arguments); - var afterFooter = callbacks.afterFooter.apply(me, arguments); - - var lines = []; - lines = pushOrConcat(lines, beforeFooter); - lines = pushOrConcat(lines, footer); - lines = pushOrConcat(lines, afterFooter); - - return lines; - }, - - update: function (changed) { - var me = this; - var opts = me._options; - - // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition - // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time - // which breaks any animations. - var existingModel = me._model; - var model = me._model = getBaseModel(opts); - var active = me._active; - - var data = me._data; - - // In the case where active.length === 0 we need to keep these at existing values for good animations - var alignment = { - xAlign: existingModel.xAlign, - yAlign: existingModel.yAlign - }; - var backgroundPoint = { - x: existingModel.x, - y: existingModel.y - }; - var tooltipSize = { - width: existingModel.width, - height: existingModel.height - }; - var tooltipPosition = { - x: existingModel.caretX, - y: existingModel.caretY - }; - - var i, len; - - if (active.length) { - model.opacity = 1; - - var labelColors = []; - var labelTextColors = []; - tooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition); - - var tooltipItems = []; - for (i = 0, len = active.length; i < len; ++i) { - tooltipItems.push(createTooltipItem(active[i])); - } - - // If the user provided a filter function, use it to modify the tooltip items - if (opts.filter) { - tooltipItems = tooltipItems.filter(function (a) { - return opts.filter(a, data); - }); - } - - // If the user provided a sorting function, use it to modify the tooltip items - if (opts.itemSort) { - tooltipItems = tooltipItems.sort(function (a, b) { - return opts.itemSort(a, b, data); - }); - } - - // Determine colors for boxes - helpers.each(tooltipItems, function (tooltipItem) { - labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); - labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); - }); - - - // Build the Text Lines - model.title = me.getTitle(tooltipItems, data); - model.beforeBody = me.getBeforeBody(tooltipItems, data); - model.body = me.getBody(tooltipItems, data); - model.afterBody = me.getAfterBody(tooltipItems, data); - model.footer = me.getFooter(tooltipItems, data); - - // Initial positioning and colors - model.x = Math.round(tooltipPosition.x); - model.y = Math.round(tooltipPosition.y); - model.caretPadding = opts.caretPadding; - model.labelColors = labelColors; - model.labelTextColors = labelTextColors; - - // data points - model.dataPoints = tooltipItems; - - // We need to determine alignment of the tooltip - tooltipSize = getTooltipSize(this, model); - alignment = determineAlignment(this, tooltipSize); - // Final Size and Position - backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment); - } else { - model.opacity = 0; - } - - model.xAlign = alignment.xAlign; - model.yAlign = alignment.yAlign; - model.x = backgroundPoint.x; - model.y = backgroundPoint.y; - model.width = tooltipSize.width; - model.height = tooltipSize.height; - - // Point where the caret on the tooltip points to - model.caretX = tooltipPosition.x; - model.caretY = tooltipPosition.y; - - me._model = model; - - if (changed && opts.custom) { - opts.custom.call(me, model); - } - - return me; - }, - drawCaret: function (tooltipPoint, size) { - var ctx = this._chart.ctx; - var vm = this._view; - var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); - - ctx.lineTo(caretPosition.x1, caretPosition.y1); - ctx.lineTo(caretPosition.x2, caretPosition.y2); - ctx.lineTo(caretPosition.x3, caretPosition.y3); - }, - getCaretPosition: function (tooltipPoint, size, vm) { - var x1, x2, x3, y1, y2, y3; - var caretSize = vm.caretSize; - var cornerRadius = vm.cornerRadius; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var ptX = tooltipPoint.x; - var ptY = tooltipPoint.y; - var width = size.width; - var height = size.height; - - if (yAlign === 'center') { - y2 = ptY + (height / 2); - - if (xAlign === 'left') { - x1 = ptX; - x2 = x1 - caretSize; - x3 = x1; - - y1 = y2 + caretSize; - y3 = y2 - caretSize; - } else { - x1 = ptX + width; - x2 = x1 + caretSize; - x3 = x1; - - y1 = y2 - caretSize; - y3 = y2 + caretSize; - } - } else { - if (xAlign === 'left') { - x2 = ptX + cornerRadius + (caretSize); - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else if (xAlign === 'right') { - x2 = ptX + width - cornerRadius - caretSize; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else { - x2 = ptX + (width / 2); - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } - if (yAlign === 'top') { - y1 = ptY; - y2 = y1 - caretSize; - y3 = y1; - } else { - y1 = ptY + height; - y2 = y1 + caretSize; - y3 = y1; - // invert drawing order - var tmp = x3; - x3 = x1; - x1 = tmp; - } - } - return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; - }, - drawTitle: function (pt, vm, ctx, opacity) { - var title = vm.title; - - if (title.length) { - ctx.textAlign = vm._titleAlign; - ctx.textBaseline = 'top'; - - var titleFontSize = vm.titleFontSize; - var titleSpacing = vm.titleSpacing; - - ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity); - ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); - - var i, len; - for (i = 0, len = title.length; i < len; ++i) { - ctx.fillText(title[i], pt.x, pt.y); - pt.y += titleFontSize + titleSpacing; // Line Height and spacing - - if (i + 1 === title.length) { - pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing - } - } - } - }, - drawBody: function (pt, vm, ctx, opacity) { - var bodyFontSize = vm.bodyFontSize; - var bodySpacing = vm.bodySpacing; - var body = vm.body; - - ctx.textAlign = vm._bodyAlign; - ctx.textBaseline = 'top'; - ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); - - // Before Body - var xLinePadding = 0; - var fillLineOfText = function (line) { - ctx.fillText(line, pt.x + xLinePadding, pt.y); - pt.y += bodyFontSize + bodySpacing; - }; - - // Before body lines - ctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity); - helpers.each(vm.beforeBody, fillLineOfText); - - var drawColorBoxes = vm.displayColors; - xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0; - - // Draw body lines now - helpers.each(body, function (bodyItem, i) { - var textColor = mergeOpacity(vm.labelTextColors[i], opacity); - ctx.fillStyle = textColor; - helpers.each(bodyItem.before, fillLineOfText); - - helpers.each(bodyItem.lines, function (line) { - // Draw Legend-like boxes if needed - if (drawColorBoxes) { - // Fill a white rect so that colours merge nicely if the opacity is < 1 - ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity); - ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize); - - // Border - ctx.lineWidth = 1; - ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity); - ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize); - - // Inner square - ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity); - ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); - ctx.fillStyle = textColor; - } - - fillLineOfText(line); - }); - - helpers.each(bodyItem.after, fillLineOfText); - }); - - // Reset back to 0 for after body - xLinePadding = 0; - - // After body lines - helpers.each(vm.afterBody, fillLineOfText); - pt.y -= bodySpacing; // Remove last body spacing - }, - drawFooter: function (pt, vm, ctx, opacity) { - var footer = vm.footer; - - if (footer.length) { - pt.y += vm.footerMarginTop; - - ctx.textAlign = vm._footerAlign; - ctx.textBaseline = 'top'; - - ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity); - ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); - - helpers.each(footer, function (line) { - ctx.fillText(line, pt.x, pt.y); - pt.y += vm.footerFontSize + vm.footerSpacing; - }); - } - }, - drawBackground: function (pt, vm, ctx, tooltipSize, opacity) { - ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity); - ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity); - ctx.lineWidth = vm.borderWidth; - var xAlign = vm.xAlign; - var yAlign = vm.yAlign; - var x = pt.x; - var y = pt.y; - var width = tooltipSize.width; - var height = tooltipSize.height; - var radius = vm.cornerRadius; - - ctx.beginPath(); - ctx.moveTo(x + radius, y); - if (yAlign === 'top') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - if (yAlign === 'center' && xAlign === 'right') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - if (yAlign === 'bottom') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - if (yAlign === 'center' && xAlign === 'left') { - this.drawCaret(pt, tooltipSize); - } - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); - ctx.closePath(); - - ctx.fill(); - - if (vm.borderWidth > 0) { - ctx.stroke(); - } - }, - draw: function () { - var ctx = this._chart.ctx; - var vm = this._view; - - if (vm.opacity === 0) { - return; - } - - var tooltipSize = { - width: vm.width, - height: vm.height - }; - var pt = { - x: vm.x, - y: vm.y - }; - - // IE11/Edge does not like very small opacities, so snap to 0 - var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; - - // Truthy/falsey value for empty tooltip - var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; - - if (this._options.enabled && hasTooltipContent) { - // Draw Background - this.drawBackground(pt, vm, ctx, tooltipSize, opacity); - - // Draw Title, Body, and Footer - pt.x += vm.xPadding; - pt.y += vm.yPadding; - - // Titles - this.drawTitle(pt, vm, ctx, opacity); - - // Body - this.drawBody(pt, vm, ctx, opacity); - - // Footer - this.drawFooter(pt, vm, ctx, opacity); - } - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - * @returns {Boolean} true if the tooltip changed - */ - handleEvent: function (e) { - var me = this; - var options = me._options; - var changed = false; - - me._lastActive = me._lastActive || []; - - // Find Active Elements for tooltips - if (e.type === 'mouseout') { - me._active = []; - } else { - me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); - } - - // Remember Last Actives - changed = !helpers.arrayEquals(me._active, me._lastActive); - - // If tooltip didn't change, do not handle the target event - if (!changed) { - return false; - } - - me._lastActive = me._active; - - if (options.enabled || options.custom) { - me._eventPosition = { - x: e.x, - y: e.y - }; - - var model = me._model; - me.update(true); - me.pivot(); - - // See if our tooltip position changed - changed |= (model.x !== me._model.x) || (model.y !== me._model.y); - } - - return changed; - } - }); - - /** - * @namespace Chart.Tooltip.positioners - */ - Chart.Tooltip.positioners = { - /** - * Average mode places the tooltip at the average position of the elements shown - * @function Chart.Tooltip.positioners.average - * @param elements {ChartElement[]} the elements being displayed in the tooltip - * @returns {Point} tooltip position - */ - average: function (elements) { - if (!elements.length) { - return false; - } - - var i, len; - var x = 0; - var y = 0; - var count = 0; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var pos = el.tooltipPosition(); - x += pos.x; - y += pos.y; - ++count; - } - } - - return { - x: Math.round(x / count), - y: Math.round(y / count) - }; - }, - - /** - * Gets the tooltip position nearest of the item nearest to the event position - * @function Chart.Tooltip.positioners.nearest - * @param elements {Chart.Element[]} the tooltip elements - * @param eventPosition {Point} the position of the event in canvas coordinates - * @returns {Point} the tooltip position - */ - nearest: function (elements, eventPosition) { - var x = eventPosition.x; - var y = eventPosition.y; - var minDistance = Number.POSITIVE_INFINITY; - var i, len, nearestElement; - - for (i = 0, len = elements.length; i < len; ++i) { - var el = elements[i]; - if (el && el.hasValue()) { - var center = el.getCenterPoint(); - var d = helpers.distanceBetweenPoints(eventPosition, center); - - if (d < minDistance) { - minDistance = d; - nearestElement = el; - } - } - } - - if (nearestElement) { - var tp = nearestElement.tooltipPosition(); - x = tp.x; - y = tp.y; - } - - return { - x: x, - y: y - }; - } - }; - }; - - }, {"25": 25, "26": 26, "45": 45}], 36: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - defaults._set('global', { - elements: { - arc: { - backgroundColor: defaults.global.defaultColor, - borderColor: '#fff', - borderWidth: 2 - } - } - }); - - module.exports = Element.extend({ - inLabelRange: function (mouseX) { - var vm = this._view; - - if (vm) { - return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); - } - return false; - }, - - inRange: function (chartX, chartY) { - var vm = this._view; - - if (vm) { - var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY}); - var angle = pointRelativePosition.angle; - var distance = pointRelativePosition.distance; - - // Sanitise angle range - var startAngle = vm.startAngle; - var endAngle = vm.endAngle; - while (endAngle < startAngle) { - endAngle += 2.0 * Math.PI; - } - while (angle > endAngle) { - angle -= 2.0 * Math.PI; - } - while (angle < startAngle) { - angle += 2.0 * Math.PI; - } - - // Check if within the range of the open/close angle - var betweenAngles = (angle >= startAngle && angle <= endAngle); - var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); - - return (betweenAngles && withinRadius); - } - return false; - }, - - getCenterPoint: function () { - var vm = this._view; - var halfAngle = (vm.startAngle + vm.endAngle) / 2; - var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; - return { - x: vm.x + Math.cos(halfAngle) * halfRadius, - y: vm.y + Math.sin(halfAngle) * halfRadius - }; - }, - - getArea: function () { - var vm = this._view; - return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); - }, - - tooltipPosition: function () { - var vm = this._view; - var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); - var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; - - return { - x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), - y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) - }; - }, - - draw: function () { - var ctx = this._chart.ctx; - var vm = this._view; - var sA = vm.startAngle; - var eA = vm.endAngle; - - ctx.beginPath(); - - ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - - ctx.closePath(); - ctx.strokeStyle = vm.borderColor; - ctx.lineWidth = vm.borderWidth; - - ctx.fillStyle = vm.backgroundColor; - - ctx.fill(); - ctx.lineJoin = 'bevel'; - - if (vm.borderWidth) { - ctx.stroke(); - } - } - }); - - }, {"25": 25, "26": 26, "45": 45}], 37: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - var globalDefaults = defaults.global; - - defaults._set('global', { - elements: { - line: { - tension: 0.4, - backgroundColor: globalDefaults.defaultColor, - borderWidth: 3, - borderColor: globalDefaults.defaultColor, - borderCapStyle: 'butt', - borderDash: [], - borderDashOffset: 0.0, - borderJoinStyle: 'miter', - capBezierPoints: true, - fill: true, // do we fill in the area between the line and its base axis - } - } - }); - - module.exports = Element.extend({ - draw: function () { - var me = this; - var vm = me._view; - var ctx = me._chart.ctx; - var spanGaps = vm.spanGaps; - var points = me._children.slice(); // clone array - var globalOptionLineElements = globalDefaults.elements.line; - var lastDrawnIndex = -1; - var index, current, previous, currentVM; - - // If we are looping, adding the first point again - if (me._loop && points.length) { - points.push(points[0]); - } - - ctx.save(); - - // Stroke Line Options - ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; - - // IE 9 and 10 do not support line dash - if (ctx.setLineDash) { - ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); - } - - ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset; - ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; - ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth; - ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; - - // Stroke Line - ctx.beginPath(); - lastDrawnIndex = -1; - - for (index = 0; index < points.length; ++index) { - current = points[index]; - previous = helpers.previousItem(points, index); - currentVM = current._view; - - // First point moves to it's starting position no matter what - if (index === 0) { - if (!currentVM.skip) { - ctx.moveTo(currentVM.x, currentVM.y); - lastDrawnIndex = index; - } - } else { - previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; - - if (!currentVM.skip) { - if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { - // There was a gap and this is the first point after the gap - ctx.moveTo(currentVM.x, currentVM.y); - } else { - // Line to next point - helpers.canvas.lineTo(ctx, previous._view, current._view); - } - lastDrawnIndex = index; - } - } - } - - ctx.stroke(); - ctx.restore(); - } - }); - - }, {"25": 25, "26": 26, "45": 45}], 38: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - var defaultColor = defaults.global.defaultColor; - - defaults._set('global', { - elements: { - point: { - radius: 3, - pointStyle: 'circle', - backgroundColor: defaultColor, - borderColor: defaultColor, - borderWidth: 1, - // Hover - hitRadius: 1, - hoverRadius: 4, - hoverBorderWidth: 1 - } - } - }); - - function xRange(mouseX) { - var vm = this._view; - return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; - } - - function yRange(mouseY) { - var vm = this._view; - return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; - } - - module.exports = Element.extend({ - inRange: function (mouseX, mouseY) { - var vm = this._view; - return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; - }, - - inLabelRange: xRange, - inXRange: xRange, - inYRange: yRange, - - getCenterPoint: function () { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - }, - - getArea: function () { - return Math.PI * Math.pow(this._view.radius, 2); - }, - - tooltipPosition: function () { - var vm = this._view; - return { - x: vm.x, - y: vm.y, - padding: vm.radius + vm.borderWidth - }; - }, - - draw: function (chartArea) { - var vm = this._view; - var model = this._model; - var ctx = this._chart.ctx; - var pointStyle = vm.pointStyle; - var radius = vm.radius; - var x = vm.x; - var y = vm.y; - var color = helpers.color; - var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.) - var ratio = 0; - - if (vm.skip) { - return; - } - - ctx.strokeStyle = vm.borderColor || defaultColor; - ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth); - ctx.fillStyle = vm.backgroundColor || defaultColor; - - // Cliping for Points. - // going out from inner charArea? - if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) { - // Point fade out - if (model.x < chartArea.left) { - ratio = (x - model.x) / (chartArea.left - model.x); - } else if (chartArea.right * errMargin < model.x) { - ratio = (model.x - x) / (model.x - chartArea.right); - } else if (model.y < chartArea.top) { - ratio = (y - model.y) / (chartArea.top - model.y); - } else if (chartArea.bottom * errMargin < model.y) { - ratio = (model.y - y) / (model.y - chartArea.bottom); - } - ratio = Math.round(ratio * 100) / 100; - ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString(); - ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString(); - } - - helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y); - } - }); - - }, {"25": 25, "26": 26, "45": 45}], 39: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - - defaults._set('global', { - elements: { - rectangle: { - backgroundColor: defaults.global.defaultColor, - borderColor: defaults.global.defaultColor, - borderSkipped: 'bottom', - borderWidth: 0 - } - } - }); - - function isVertical(bar) { - return bar._view.width !== undefined; - } - - /** - * Helper function to get the bounds of the bar regardless of the orientation - * @param bar {Chart.Element.Rectangle} the bar - * @return {Bounds} bounds of the bar - * @private - */ - function getBarBounds(bar) { - var vm = bar._view; - var x1, x2, y1, y2; - - if (isVertical(bar)) { - // vertical - var halfWidth = vm.width / 2; - x1 = vm.x - halfWidth; - x2 = vm.x + halfWidth; - y1 = Math.min(vm.y, vm.base); - y2 = Math.max(vm.y, vm.base); - } else { - // horizontal bar - var halfHeight = vm.height / 2; - x1 = Math.min(vm.x, vm.base); - x2 = Math.max(vm.x, vm.base); - y1 = vm.y - halfHeight; - y2 = vm.y + halfHeight; - } - - return { - left: x1, - top: y1, - right: x2, - bottom: y2 - }; - } - - module.exports = Element.extend({ - draw: function () { - var ctx = this._chart.ctx; - var vm = this._view; - var left, right, top, bottom, signX, signY, borderSkipped; - var borderWidth = vm.borderWidth; - - if (!vm.horizontal) { - // bar - left = vm.x - vm.width / 2; - right = vm.x + vm.width / 2; - top = vm.y; - bottom = vm.base; - signX = 1; - signY = bottom > top ? 1 : -1; - borderSkipped = vm.borderSkipped || 'bottom'; - } else { - // horizontal bar - left = vm.base; - right = vm.x; - top = vm.y - vm.height / 2; - bottom = vm.y + vm.height / 2; - signX = right > left ? 1 : -1; - signY = 1; - borderSkipped = vm.borderSkipped || 'left'; - } - - // Canvas doesn't allow us to stroke inside the width so we can - // adjust the sizes to fit if we're setting a stroke on the line - if (borderWidth) { - // borderWidth shold be less than bar width and bar height. - var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom)); - borderWidth = borderWidth > barSize ? barSize : borderWidth; - var halfStroke = borderWidth / 2; - // Adjust borderWidth when bar top position is near vm.base(zero). - var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0); - var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0); - var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0); - var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0); - // not become a vertical line? - if (borderLeft !== borderRight) { - top = borderTop; - bottom = borderBottom; - } - // not become a horizontal line? - if (borderTop !== borderBottom) { - left = borderLeft; - right = borderRight; - } - } - - ctx.beginPath(); - ctx.fillStyle = vm.backgroundColor; - ctx.strokeStyle = vm.borderColor; - ctx.lineWidth = borderWidth; - - // Corner points, from bottom-left to bottom-right clockwise - // | 1 2 | - // | 0 3 | - var corners = [ - [left, bottom], - [left, top], - [right, top], - [right, bottom] - ]; - - // Find first (starting) corner with fallback to 'bottom' - var borders = ['bottom', 'left', 'top', 'right']; - var startCorner = borders.indexOf(borderSkipped, 0); - if (startCorner === -1) { - startCorner = 0; - } - - function cornerAt(index) { - return corners[(startCorner + index) % 4]; - } - - // Draw rectangle from 'startCorner' - var corner = cornerAt(0); - ctx.moveTo(corner[0], corner[1]); - - for (var i = 1; i < 4; i++) { - corner = cornerAt(i); - ctx.lineTo(corner[0], corner[1]); - } - - ctx.fill(); - if (borderWidth) { - ctx.stroke(); - } - }, - - height: function () { - var vm = this._view; - return vm.base - vm.y; - }, - - inRange: function (mouseX, mouseY) { - var inRange = false; - - if (this._view) { - var bounds = getBarBounds(this); - inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom; - } - - return inRange; - }, - - inLabelRange: function (mouseX, mouseY) { - var me = this; - if (!me._view) { - return false; - } - - var inRange = false; - var bounds = getBarBounds(me); - - if (isVertical(me)) { - inRange = mouseX >= bounds.left && mouseX <= bounds.right; - } else { - inRange = mouseY >= bounds.top && mouseY <= bounds.bottom; - } - - return inRange; - }, - - inXRange: function (mouseX) { - var bounds = getBarBounds(this); - return mouseX >= bounds.left && mouseX <= bounds.right; - }, - - inYRange: function (mouseY) { - var bounds = getBarBounds(this); - return mouseY >= bounds.top && mouseY <= bounds.bottom; - }, - - getCenterPoint: function () { - var vm = this._view; - var x, y; - if (isVertical(this)) { - x = vm.x; - y = (vm.y + vm.base) / 2; - } else { - x = (vm.x + vm.base) / 2; - y = vm.y; - } - - return {x: x, y: y}; - }, - - getArea: function () { - var vm = this._view; - return vm.width * Math.abs(vm.y - vm.base); - }, - - tooltipPosition: function () { - var vm = this._view; - return { - x: vm.x, - y: vm.y - }; - } - }); - - }, {"25": 25, "26": 26}], 40: [function (require, module, exports) { - 'use strict'; - - module.exports = {}; - module.exports.Arc = require(36); - module.exports.Line = require(37); - module.exports.Point = require(38); - module.exports.Rectangle = require(39); - - }, {"36": 36, "37": 37, "38": 38, "39": 39}], 41: [function (require, module, exports) { - 'use strict'; - - var helpers = require(42); - - /** - * @namespace Chart.helpers.canvas - */ - var exports = module.exports = { - /** - * Clears the entire canvas associated to the given `chart`. - * @param {Chart} chart - The chart for which to clear the canvas. - */ - clear: function (chart) { - chart.ctx.clearRect(0, 0, chart.width, chart.height); - }, - - /** - * Creates a "path" for a rectangle with rounded corners at position (x, y) with a - * given size (width, height) and the same `radius` for all corners. - * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. - * @param {Number} x - The x axis of the coordinate for the rectangle starting point. - * @param {Number} y - The y axis of the coordinate for the rectangle starting point. - * @param {Number} width - The rectangle's width. - * @param {Number} height - The rectangle's height. - * @param {Number} radius - The rounded amount (in pixels) for the four corners. - * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? - */ - roundedRect: function (ctx, x, y, width, height, radius) { - if (radius) { - var rx = Math.min(radius, width / 2); - var ry = Math.min(radius, height / 2); - - ctx.moveTo(x + rx, y); - ctx.lineTo(x + width - rx, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + ry); - ctx.lineTo(x + width, y + height - ry); - ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); - ctx.lineTo(x + rx, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - ry); - ctx.lineTo(x, y + ry); - ctx.quadraticCurveTo(x, y, x + rx, y); - } else { - ctx.rect(x, y, width, height); - } - }, - - drawPoint: function (ctx, style, radius, x, y) { - var type, edgeLength, xOffset, yOffset, height, size; - - if (style && typeof style === 'object') { - type = style.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); - return; - } - } - - if (isNaN(radius) || radius <= 0) { - return; - } - - switch (style) { - // Default includes circle - default: - ctx.beginPath(); - ctx.arc(x, y, radius, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - break; - case 'triangle': - ctx.beginPath(); - edgeLength = 3 * radius / Math.sqrt(3); - height = edgeLength * Math.sqrt(3) / 2; - ctx.moveTo(x - edgeLength / 2, y + height / 3); - ctx.lineTo(x + edgeLength / 2, y + height / 3); - ctx.lineTo(x, y - 2 * height / 3); - ctx.closePath(); - ctx.fill(); - break; - case 'rect': - size = 1 / Math.SQRT2 * radius; - ctx.beginPath(); - ctx.fillRect(x - size, y - size, 2 * size, 2 * size); - ctx.strokeRect(x - size, y - size, 2 * size, 2 * size); - break; - case 'rectRounded': - var offset = radius / Math.SQRT2; - var leftX = x - offset; - var topY = y - offset; - var sideSize = Math.SQRT2 * radius; - ctx.beginPath(); - this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2); - ctx.closePath(); - ctx.fill(); - break; - case 'rectRot': - size = 1 / Math.SQRT2 * radius; - ctx.beginPath(); - ctx.moveTo(x - size, y); - ctx.lineTo(x, y + size); - ctx.lineTo(x + size, y); - ctx.lineTo(x, y - size); - ctx.closePath(); - ctx.fill(); - break; - case 'cross': - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y - radius); - ctx.moveTo(x - radius, y); - ctx.lineTo(x + radius, y); - ctx.closePath(); - break; - case 'crossRot': - ctx.beginPath(); - xOffset = Math.cos(Math.PI / 4) * radius; - yOffset = Math.sin(Math.PI / 4) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x - xOffset, y + yOffset); - ctx.lineTo(x + xOffset, y - yOffset); - ctx.closePath(); - break; - case 'star': - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y - radius); - ctx.moveTo(x - radius, y); - ctx.lineTo(x + radius, y); - xOffset = Math.cos(Math.PI / 4) * radius; - yOffset = Math.sin(Math.PI / 4) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x - xOffset, y + yOffset); - ctx.lineTo(x + xOffset, y - yOffset); - ctx.closePath(); - break; - case 'line': - ctx.beginPath(); - ctx.moveTo(x - radius, y); - ctx.lineTo(x + radius, y); - ctx.closePath(); - break; - case 'dash': - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(x + radius, y); - ctx.closePath(); - break; - } - - ctx.stroke(); - }, - - clipArea: function (ctx, area) { - ctx.save(); - ctx.beginPath(); - ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); - ctx.clip(); - }, - - unclipArea: function (ctx) { - ctx.restore(); - }, - - lineTo: function (ctx, previous, target, flip) { - if (target.steppedLine) { - if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) { - ctx.lineTo(previous.x, target.y); - } else { - ctx.lineTo(target.x, previous.y); - } - ctx.lineTo(target.x, target.y); - return; - } - - if (!target.tension) { - ctx.lineTo(target.x, target.y); - return; - } - - ctx.bezierCurveTo( - flip ? previous.controlPointPreviousX : previous.controlPointNextX, - flip ? previous.controlPointPreviousY : previous.controlPointNextY, - flip ? target.controlPointNextX : target.controlPointPreviousX, - flip ? target.controlPointNextY : target.controlPointPreviousY, - target.x, - target.y); - } - }; - -// DEPRECATIONS - - /** - * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. - * @namespace Chart.helpers.clear - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.clear = exports.clear; - - /** - * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. - * @namespace Chart.helpers.drawRoundedRectangle - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.drawRoundedRectangle = function (ctx) { - ctx.beginPath(); - exports.roundedRect.apply(exports, arguments); - ctx.closePath(); - }; - - }, {"42": 42}], 42: [function (require, module, exports) { - 'use strict'; - - /** - * @namespace Chart.helpers - */ - var helpers = { - /** - * An empty function that can be used, for example, for optional callback. - */ - noop: function () { - }, - - /** - * Returns a unique id, sequentially generated from a global variable. - * @returns {Number} - * @function - */ - uid: (function () { - var id = 0; - return function () { - return id++; - }; - }()), - - /** - * Returns true if `value` is neither null nor undefined, else returns false. - * @param {*} value - The value to test. - * @returns {Boolean} - * @since 2.7.0 - */ - isNullOrUndef: function (value) { - return value === null || typeof value === 'undefined'; - }, - - /** - * Returns true if `value` is an array, else returns false. - * @param {*} value - The value to test. - * @returns {Boolean} - * @function - */ - isArray: Array.isArray ? Array.isArray : function (value) { - return Object.prototype.toString.call(value) === '[object Array]'; - }, - - /** - * Returns true if `value` is an object (excluding null), else returns false. - * @param {*} value - The value to test. - * @returns {Boolean} - * @since 2.7.0 - */ - isObject: function (value) { - return value !== null && Object.prototype.toString.call(value) === '[object Object]'; - }, - - /** - * Returns `value` if defined, else returns `defaultValue`. - * @param {*} value - The value to return if defined. - * @param {*} defaultValue - The value to return if `value` is undefined. - * @returns {*} - */ - valueOrDefault: function (value, defaultValue) { - return typeof value === 'undefined' ? defaultValue : value; - }, - - /** - * Returns value at the given `index` in array if defined, else returns `defaultValue`. - * @param {Array} value - The array to lookup for value at `index`. - * @param {Number} index - The index in `value` to lookup for value. - * @param {*} defaultValue - The value to return if `value[index]` is undefined. - * @returns {*} - */ - valueAtIndexOrDefault: function (value, index, defaultValue) { - return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); - }, - - /** - * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the - * value returned by `fn`. If `fn` is not a function, this method returns undefined. - * @param {Function} fn - The function to call. - * @param {Array|undefined|null} args - The arguments with which `fn` should be called. - * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. - * @returns {*} - */ - callback: function (fn, args, thisArg) { - if (fn && typeof fn.call === 'function') { - return fn.apply(thisArg, args); - } - }, - - /** - * Note(SB) for performance sake, this method should only be used when loopable type - * is unknown or in none intensive code (not called often and small loopable). Else - * it's preferable to use a regular for() loop and save extra function calls. - * @param {Object|Array} loopable - The object or array to be iterated. - * @param {Function} fn - The function to call for each item. - * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. - * @param {Boolean} [reverse] - If true, iterates backward on the loopable. - */ - each: function (loopable, fn, thisArg, reverse) { - var i, len, keys; - if (helpers.isArray(loopable)) { - len = loopable.length; - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (helpers.isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } - }, - - /** - * Returns true if the `a0` and `a1` arrays have the same content, else returns false. - * @see http://stackoverflow.com/a/14853974 - * @param {Array} a0 - The array to compare - * @param {Array} a1 - The array to compare - * @returns {Boolean} - */ - arrayEquals: function (a0, a1) { - var i, ilen, v0, v1; - - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - - if (v0 instanceof Array && v1 instanceof Array) { - if (!helpers.arrayEquals(v0, v1)) { - return false; - } - } else if (v0 !== v1) { - // NOTE: two different object instances will never be equal: {x:20} != {x:20} - return false; - } - } - - return true; - }, - - /** - * Returns a deep copy of `source` without keeping references on objects and arrays. - * @param {*} source - The value to clone. - * @returns {*} - */ - clone: function (source) { - if (helpers.isArray(source)) { - return source.map(helpers.clone); - } - - if (helpers.isObject(source)) { - var target = {}; - var keys = Object.keys(source); - var klen = keys.length; - var k = 0; - - for (; k < klen; ++k) { - target[keys[k]] = helpers.clone(source[keys[k]]); - } - - return target; - } - - return source; - }, - - /** - * The default merger when Chart.helpers.merge is called without merger option. - * Note(SB): this method is also used by configMerge and scaleMerge as fallback. - * @private - */ - _merger: function (key, target, source, options) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.merge(tval, sval, options); - } else { - target[key] = helpers.clone(sval); - } - }, - - /** - * Merges source[key] in target[key] only if target[key] is undefined. - * @private - */ - _mergerIf: function (key, target, source) { - var tval = target[key]; - var sval = source[key]; - - if (helpers.isObject(tval) && helpers.isObject(sval)) { - helpers.mergeIf(tval, sval); - } else if (!target.hasOwnProperty(key)) { - target[key] = helpers.clone(sval); - } - }, - - /** - * Recursively deep copies `source` properties into `target` with the given `options`. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {Object} target - The target object in which all sources are merged into. - * @param {Object|Array(Object)} source - Object(s) to merge into `target`. - * @param {Object} [options] - Merging options: - * @param {Function} [options.merger] - The merge method (key, target, source, options) - * @returns {Object} The `target` object. - */ - merge: function (target, source, options) { - var sources = helpers.isArray(source) ? source : [source]; - var ilen = sources.length; - var merge, i, keys, klen, k; - - if (!helpers.isObject(target)) { - return target; - } - - options = options || {}; - merge = options.merger || helpers._merger; - - for (i = 0; i < ilen; ++i) { - source = sources[i]; - if (!helpers.isObject(source)) { - continue; - } - - keys = Object.keys(source); - for (k = 0, klen = keys.length; k < klen; ++k) { - merge(keys[k], target, source, options); - } - } - - return target; - }, - - /** - * Recursively deep copies `source` properties into `target` *only* if not defined in target. - * IMPORTANT: `target` is not cloned and will be updated with `source` properties. - * @param {Object} target - The target object in which all sources are merged into. - * @param {Object|Array(Object)} source - Object(s) to merge into `target`. - * @returns {Object} The `target` object. - */ - mergeIf: function (target, source) { - return helpers.merge(target, source, {merger: helpers._mergerIf}); - }, - - /** - * Applies the contents of two or more objects together into the first object. - * @param {Object} target - The target object in which all objects are merged into. - * @param {Object} arg1 - Object containing additional properties to merge in target. - * @param {Object} argN - Additional objects containing properties to merge in target. - * @returns {Object} The `target` object. - */ - extend: function (target) { - var setFn = function (value, key) { - target[key] = value; - }; - for (var i = 1, ilen = arguments.length; i < ilen; ++i) { - helpers.each(arguments[i], setFn); - } - return target; - }, - - /** - * Basic javascript inheritance based on the model created in Backbone.js - */ - inherits: function (extensions) { - var me = this; - var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function () { - return me.apply(this, arguments); - }; - - var Surrogate = function () { - this.constructor = ChartElement; - }; - - Surrogate.prototype = me.prototype; - ChartElement.prototype = new Surrogate(); - ChartElement.extend = helpers.inherits; - - if (extensions) { - helpers.extend(ChartElement.prototype, extensions); - } - - ChartElement.__super__ = me.prototype; - return ChartElement; - } - }; - - module.exports = helpers; - -// DEPRECATIONS - - /** - * Provided for backward compatibility, use Chart.helpers.callback instead. - * @function Chart.helpers.callCallback - * @deprecated since version 2.6.0 - * @todo remove at version 3 - * @private - */ - helpers.callCallback = helpers.callback; - - /** - * Provided for backward compatibility, use Array.prototype.indexOf instead. - * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ - * @function Chart.helpers.indexOf - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.indexOf = function (array, item, fromIndex) { - return Array.prototype.indexOf.call(array, item, fromIndex); - }; - - /** - * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. - * @function Chart.helpers.getValueOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.getValueOrDefault = helpers.valueOrDefault; - - /** - * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. - * @function Chart.helpers.getValueAtIndexOrDefault - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; - - }, {}], 43: [function (require, module, exports) { - 'use strict'; - - var helpers = require(42); - - /** - * Easing functions adapted from Robert Penner's easing equations. - * @namespace Chart.helpers.easingEffects - * @see http://www.robertpenner.com/easing/ - */ - var effects = { - linear: function (t) { - return t; - }, - - easeInQuad: function (t) { - return t * t; - }, - - easeOutQuad: function (t) { - return -t * (t - 2); - }, - - easeInOutQuad: function (t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t; - } - return -0.5 * ((--t) * (t - 2) - 1); - }, - - easeInCubic: function (t) { - return t * t * t; - }, - - easeOutCubic: function (t) { - return (t = t - 1) * t * t + 1; - }, - - easeInOutCubic: function (t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t; - } - return 0.5 * ((t -= 2) * t * t + 2); - }, - - easeInQuart: function (t) { - return t * t * t * t; - }, - - easeOutQuart: function (t) { - return -((t = t - 1) * t * t * t - 1); - }, - - easeInOutQuart: function (t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t; - } - return -0.5 * ((t -= 2) * t * t * t - 2); - }, - - easeInQuint: function (t) { - return t * t * t * t * t; - }, - - easeOutQuint: function (t) { - return (t = t - 1) * t * t * t * t + 1; - }, - - easeInOutQuint: function (t) { - if ((t /= 0.5) < 1) { - return 0.5 * t * t * t * t * t; - } - return 0.5 * ((t -= 2) * t * t * t * t + 2); - }, - - easeInSine: function (t) { - return -Math.cos(t * (Math.PI / 2)) + 1; - }, - - easeOutSine: function (t) { - return Math.sin(t * (Math.PI / 2)); - }, - - easeInOutSine: function (t) { - return -0.5 * (Math.cos(Math.PI * t) - 1); - }, - - easeInExpo: function (t) { - return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); - }, - - easeOutExpo: function (t) { - return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; - }, - - easeInOutExpo: function (t) { - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if ((t /= 0.5) < 1) { - return 0.5 * Math.pow(2, 10 * (t - 1)); - } - return 0.5 * (-Math.pow(2, -10 * --t) + 2); - }, - - easeInCirc: function (t) { - if (t >= 1) { - return t; - } - return -(Math.sqrt(1 - t * t) - 1); - }, - - easeOutCirc: function (t) { - return Math.sqrt(1 - (t = t - 1) * t); - }, - - easeInOutCirc: function (t) { - if ((t /= 0.5) < 1) { - return -0.5 * (Math.sqrt(1 - t * t) - 1); - } - return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); - }, - - easeInElastic: function (t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - }, - - easeOutElastic: function (t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if (t === 1) { - return 1; - } - if (!p) { - p = 0.3; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; - }, - - easeInOutElastic: function (t) { - var s = 1.70158; - var p = 0; - var a = 1; - if (t === 0) { - return 0; - } - if ((t /= 0.5) === 2) { - return 1; - } - if (!p) { - p = 0.45; - } - if (a < 1) { - a = 1; - s = p / 4; - } else { - s = p / (2 * Math.PI) * Math.asin(1 / a); - } - if (t < 1) { - return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; - }, - easeInBack: function (t) { - var s = 1.70158; - return t * t * ((s + 1) * t - s); - }, - - easeOutBack: function (t) { - var s = 1.70158; - return (t = t - 1) * t * ((s + 1) * t + s) + 1; - }, - - easeInOutBack: function (t) { - var s = 1.70158; - if ((t /= 0.5) < 1) { - return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); - } - return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); - }, - - easeInBounce: function (t) { - return 1 - effects.easeOutBounce(1 - t); - }, - - easeOutBounce: function (t) { - if (t < (1 / 2.75)) { - return 7.5625 * t * t; - } - if (t < (2 / 2.75)) { - return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; - } - if (t < (2.5 / 2.75)) { - return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; - } - return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; - }, - - easeInOutBounce: function (t) { - if (t < 0.5) { - return effects.easeInBounce(t * 2) * 0.5; - } - return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; - } - }; - - module.exports = { - effects: effects - }; - -// DEPRECATIONS - - /** - * Provided for backward compatibility, use Chart.helpers.easing.effects instead. - * @function Chart.helpers.easingEffects - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.easingEffects = effects; - - }, {"42": 42}], 44: [function (require, module, exports) { - 'use strict'; - - var helpers = require(42); - - /** - * @alias Chart.helpers.options - * @namespace - */ - module.exports = { - /** - * Converts the given line height `value` in pixels for a specific font `size`. - * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). - * @param {Number} size - The font size (in pixels) used to resolve relative `value`. - * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid). - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height - * @since 2.7.0 - */ - toLineHeight: function (value, size) { - var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - if (!matches || matches[1] === 'normal') { - return size * 1.2; - } - - value = +matches[2]; - - switch (matches[3]) { - case 'px': - return value; - case '%': - value /= 100; - break; - default: - break; - } - - return size * value; - }, - - /** - * Converts the given value into a padding object with pre-computed width/height. - * @param {Number|Object} value - If a number, set the value to all TRBL component, - * else, if and object, use defined properties and sets undefined ones to 0. - * @returns {Object} The padding values (top, right, bottom, left, width, height) - * @since 2.7.0 - */ - toPadding: function (value) { - var t, r, b, l; - - if (helpers.isObject(value)) { - t = +value.top || 0; - r = +value.right || 0; - b = +value.bottom || 0; - l = +value.left || 0; - } else { - t = r = b = l = +value || 0; - } - - return { - top: t, - right: r, - bottom: b, - left: l, - height: t + b, - width: l + r - }; - }, - - /** - * Evaluates the given `inputs` sequentially and returns the first defined value. - * @param {Array[]} inputs - An array of values, falling back to the last value. - * @param {Object} [context] - If defined and the current value is a function, the value - * is called with `context` as first argument and the result becomes the new input. - * @param {Number} [index] - If defined and the current value is an array, the value - * at `index` become the new input. - * @since 2.7.0 - */ - resolve: function (inputs, context, index) { - var i, ilen, value; - - for (i = 0, ilen = inputs.length; i < ilen; ++i) { - value = inputs[i]; - if (value === undefined) { - continue; - } - if (context !== undefined && typeof value === 'function') { - value = value(context); - } - if (index !== undefined && helpers.isArray(value)) { - value = value[index]; - } - if (value !== undefined) { - return value; - } - } - } - }; - - }, {"42": 42}], 45: [function (require, module, exports) { - 'use strict'; - - module.exports = require(42); - module.exports.easing = require(43); - module.exports.canvas = require(41); - module.exports.options = require(44); - - }, {"41": 41, "42": 42, "43": 43, "44": 44}], 46: [function (require, module, exports) { - /** - * Platform fallback implementation (minimal). - * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 - */ - - module.exports = { - acquireContext: function (item) { - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - return item && item.getContext('2d') || null; - } - }; - - }, {}], 47: [function (require, module, exports) { - /** - * Chart.Platform implementation for targeting a web browser - */ - - 'use strict'; - - var helpers = require(45); - - var EXPANDO_KEY = '$chartjs'; - var CSS_PREFIX = 'chartjs-'; - var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; - var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; - var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; - - /** - * DOM event types -> Chart.js event types. - * Note: only events with different types are mapped. - * @see https://developer.mozilla.org/en-US/docs/Web/Events - */ - var EVENT_TYPES = { - touchstart: 'mousedown', - touchmove: 'mousemove', - touchend: 'mouseup', - pointerenter: 'mouseenter', - pointerdown: 'mousedown', - pointermove: 'mousemove', - pointerup: 'mouseup', - pointerleave: 'mouseout', - pointerout: 'mouseout' - }; - - /** - * The "used" size is the final value of a dimension property after all calculations have - * been performed. This method uses the computed style of `element` but returns undefined - * if the computed style is not expressed in pixels. That can happen in some cases where - * `element` has a size relative to its parent and this last one is not yet displayed, - * for example because of `display: none` on a parent node. - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value - * @returns {Number} Size in pixels or undefined if unknown. - */ - function readUsedSize(element, property) { - var value = helpers.getStyle(element, property); - var matches = value && value.match(/^(\d+)(\.\d+)?px$/); - return matches ? Number(matches[1]) : undefined; - } - - /** - * Initializes the canvas style and render size without modifying the canvas display size, - * since responsiveness is handled by the controller.resize() method. The config is used - * to determine the aspect ratio to apply in case no explicit height has been specified. - */ - function initCanvas(canvas, config) { - var style = canvas.style; - - // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it - // returns null or '' if no explicit value has been set to the canvas attribute. - var renderHeight = canvas.getAttribute('height'); - var renderWidth = canvas.getAttribute('width'); - - // Chart.js modifies some canvas values that we want to restore on destroy - canvas[EXPANDO_KEY] = { - initial: { - height: renderHeight, - width: renderWidth, - style: { - display: style.display, - height: style.height, - width: style.width - } - } - }; - - // Force canvas to display as block to avoid extra space caused by inline - // elements, which would interfere with the responsive resize process. - // https://github.com/chartjs/Chart.js/issues/2538 - style.display = style.display || 'block'; - - if (renderWidth === null || renderWidth === '') { - var displayWidth = readUsedSize(canvas, 'width'); - if (displayWidth !== undefined) { - canvas.width = displayWidth; - } - } - - if (renderHeight === null || renderHeight === '') { - if (canvas.style.height === '') { - // If no explicit render height and style height, let's apply the aspect ratio, - // which one can be specified by the user but also by charts as default option - // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. - canvas.height = canvas.width / (config.options.aspectRatio || 2); - } else { - var displayHeight = readUsedSize(canvas, 'height'); - if (displayWidth !== undefined) { - canvas.height = displayHeight; - } - } - } - - return canvas; - } - - /** - * Detects support for options object argument in addEventListener. - * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support - * @private - */ - var supportsEventListenerOptions = (function () { - var supports = false; - try { - var options = Object.defineProperty({}, 'passive', { - get: function () { - supports = true; - } - }); - window.addEventListener('e', null, options); - } catch (e) { - // continue regardless of error - } - return supports; - }()); - -// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. -// https://github.com/chartjs/Chart.js/issues/4287 - var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; - - function addEventListener(node, type, listener) { - node.addEventListener(type, listener, eventListenerOptions); - } - - function removeEventListener(node, type, listener) { - node.removeEventListener(type, listener, eventListenerOptions); - } - - function createEvent(type, chart, x, y, nativeEvent) { - return { - type: type, - chart: chart, - native: nativeEvent || null, - x: x !== undefined ? x : null, - y: y !== undefined ? y : null, - }; - } - - function fromNativeEvent(event, chart) { - var type = EVENT_TYPES[event.type] || event.type; - var pos = helpers.getRelativePosition(event, chart); - return createEvent(type, chart, pos.x, pos.y, event); - } - - function throttled(fn, thisArg) { - var ticking = false; - var args = []; - - return function () { - args = Array.prototype.slice.call(arguments); - thisArg = thisArg || this; - - if (!ticking) { - ticking = true; - helpers.requestAnimFrame.call(window, function () { - ticking = false; - fn.apply(thisArg, args); - }); - } - }; - } - -// Implementation based on https://github.com/marcj/css-element-queries - function createResizer(handler) { - var resizer = document.createElement('div'); - var cls = CSS_PREFIX + 'size-monitor'; - var maxSize = 1000000; - var style = - 'position:absolute;' + - 'left:0;' + - 'top:0;' + - 'right:0;' + - 'bottom:0;' + - 'overflow:hidden;' + - 'pointer-events:none;' + - 'visibility:hidden;' + - 'z-index:-1;'; - - resizer.style.cssText = style; - resizer.className = cls; - resizer.innerHTML = - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
'; - - var expand = resizer.childNodes[0]; - var shrink = resizer.childNodes[1]; - - resizer._reset = function () { - expand.scrollLeft = maxSize; - expand.scrollTop = maxSize; - shrink.scrollLeft = maxSize; - shrink.scrollTop = maxSize; - }; - var onScroll = function () { - resizer._reset(); - handler(); - }; - - addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand')); - addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); - - return resizer; - } - -// https://davidwalsh.name/detect-node-insertion - function watchForRender(node, handler) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - var proxy = expando.renderProxy = function (e) { - if (e.animationName === CSS_RENDER_ANIMATION) { - handler(); - } - }; - - helpers.each(ANIMATION_START_EVENTS, function (type) { - addEventListener(node, type, proxy); - }); - - // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class - // is removed then added back immediately (same animation frame?). Accessing the - // `offsetParent` property will force a reflow and re-evaluate the CSS animation. - // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics - // https://github.com/chartjs/Chart.js/issues/4737 - expando.reflow = !!node.offsetParent; - - node.classList.add(CSS_RENDER_MONITOR); - } - - function unwatchForRender(node) { - var expando = node[EXPANDO_KEY] || {}; - var proxy = expando.renderProxy; - - if (proxy) { - helpers.each(ANIMATION_START_EVENTS, function (type) { - removeEventListener(node, type, proxy); - }); - - delete expando.renderProxy; - } - - node.classList.remove(CSS_RENDER_MONITOR); - } - - function addResizeListener(node, listener, chart) { - var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); - - // Let's keep track of this added resizer and thus avoid DOM query when removing it. - var resizer = expando.resizer = createResizer(throttled(function () { - if (expando.resizer) { - return listener(createEvent('resize', chart)); - } - })); - - // The resizer needs to be attached to the node parent, so we first need to be - // sure that `node` is attached to the DOM before injecting the resizer element. - watchForRender(node, function () { - if (expando.resizer) { - var container = node.parentNode; - if (container && container !== resizer.parentNode) { - container.insertBefore(resizer, container.firstChild); - } - - // The container size might have changed, let's reset the resizer state. - resizer._reset(); - } - }); - } - - function removeResizeListener(node) { - var expando = node[EXPANDO_KEY] || {}; - var resizer = expando.resizer; - - delete expando.resizer; - unwatchForRender(node); - - if (resizer && resizer.parentNode) { - resizer.parentNode.removeChild(resizer); - } - } - - function injectCSS(platform, css) { - // http://stackoverflow.com/q/3922139 - var style = platform._style || document.createElement('style'); - if (!platform._style) { - platform._style = style; - css = '/* Chart.js */\n' + css; - style.setAttribute('type', 'text/css'); - document.getElementsByTagName('head')[0].appendChild(style); - } - - style.appendChild(document.createTextNode(css)); - } - - module.exports = { - /** - * This property holds whether this platform is enabled for the current environment. - * Currently used by platform.js to select the proper implementation. - * @private - */ - _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', - - initialize: function () { - var keyframes = 'from{opacity:0.99}to{opacity:1}'; - - injectCSS(this, - // DOM rendering detection - // https://davidwalsh.name/detect-node-insertion - '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + - '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + - '.' + CSS_RENDER_MONITOR + '{' + - '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + - 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + - '}' - ); - }, - - acquireContext: function (item, config) { - if (typeof item === 'string') { - item = document.getElementById(item); - } else if (item.length) { - // Support for array based queries (such as jQuery) - item = item[0]; - } - - if (item && item.canvas) { - // Support for any object associated to a canvas (including a context2d) - item = item.canvas; - } - - // To prevent canvas fingerprinting, some add-ons undefine the getContext - // method, for example: https://github.com/kkapsner/CanvasBlocker - // https://github.com/chartjs/Chart.js/issues/2807 - var context = item && item.getContext && item.getContext('2d'); - - // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is - // inside an iframe or when running in a protected environment. We could guess the - // types from their toString() value but let's keep things flexible and assume it's - // a sufficient condition if the item has a context2D which has item as `canvas`. - // https://github.com/chartjs/Chart.js/issues/3887 - // https://github.com/chartjs/Chart.js/issues/4102 - // https://github.com/chartjs/Chart.js/issues/4152 - if (context && context.canvas === item) { - initCanvas(item, config); - return context; - } - - return null; - }, - - releaseContext: function (context) { - var canvas = context.canvas; - if (!canvas[EXPANDO_KEY]) { - return; - } - - var initial = canvas[EXPANDO_KEY].initial; - ['height', 'width'].forEach(function (prop) { - var value = initial[prop]; - if (helpers.isNullOrUndef(value)) { - canvas.removeAttribute(prop); - } else { - canvas.setAttribute(prop, value); - } - }); - - helpers.each(initial.style || {}, function (value, key) { - canvas.style[key] = value; - }); - - // The canvas render size might have been changed (and thus the state stack discarded), - // we can't use save() and restore() to restore the initial state. So make sure that at - // least the canvas context is reset to the default state by setting the canvas width. - // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html - canvas.width = canvas.width; - - delete canvas[EXPANDO_KEY]; - }, - - addEventListener: function (chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - addResizeListener(canvas, listener, chart); - return; - } - - var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); - var proxies = expando.proxies || (expando.proxies = {}); - var proxy = proxies[chart.id + '_' + type] = function (event) { - listener(fromNativeEvent(event, chart)); - }; - - addEventListener(canvas, type, proxy); - }, - - removeEventListener: function (chart, type, listener) { - var canvas = chart.canvas; - if (type === 'resize') { - // Note: the resize event is not supported on all browsers. - removeResizeListener(canvas, listener); - return; - } - - var expando = listener[EXPANDO_KEY] || {}; - var proxies = expando.proxies || {}; - var proxy = proxies[chart.id + '_' + type]; - if (!proxy) { - return; - } - - removeEventListener(canvas, type, proxy); - } - }; - -// DEPRECATIONS - - /** - * Provided for backward compatibility, use EventTarget.addEventListener instead. - * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener - * @function Chart.helpers.addEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.addEvent = addEventListener; - - /** - * Provided for backward compatibility, use EventTarget.removeEventListener instead. - * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ - * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener - * @function Chart.helpers.removeEvent - * @deprecated since version 2.7.0 - * @todo remove at version 3 - * @private - */ - helpers.removeEvent = removeEventListener; - - }, {"45": 45}], 48: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - var basic = require(46); - var dom = require(47); - -// @TODO Make possible to select another platform at build time. - var implementation = dom._enabled ? dom : basic; - - /** - * @namespace Chart.platform - * @see https://chartjs.gitbooks.io/proposals/content/Platform.html - * @since 2.4.0 - */ - module.exports = helpers.extend({ - /** - * @since 2.7.0 - */ - initialize: function () { - }, - - /** - * Called at chart construction time, returns a context2d instance implementing - * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. - * @param {*} item - The native item from which to acquire context (platform specific) - * @param {Object} options - The chart options - * @returns {CanvasRenderingContext2D} context2d instance - */ - acquireContext: function () { - }, - - /** - * Called at chart destruction time, releases any resources associated to the context - * previously returned by the acquireContext() method. - * @param {CanvasRenderingContext2D} context - The context2d instance - * @returns {Boolean} true if the method succeeded, else false - */ - releaseContext: function () { - }, - - /** - * Registers the specified listener on the given chart. - * @param {Chart} chart - Chart from which to listen for event - * @param {String} type - The ({@link IEvent}) type to listen for - * @param {Function} listener - Receives a notification (an object that implements - * the {@link IEvent} interface) when an event of the specified type occurs. - */ - addEventListener: function () { - }, - - /** - * Removes the specified listener previously registered with addEventListener. - * @param {Chart} chart -Chart from which to remove the listener - * @param {String} type - The ({@link IEvent}) type to remove - * @param {Function} listener - The listener function to remove from the event target. - */ - removeEventListener: function () { - } - - }, implementation); - - /** - * @interface IPlatform - * Allows abstracting platform dependencies away from the chart - * @borrows Chart.platform.acquireContext as acquireContext - * @borrows Chart.platform.releaseContext as releaseContext - * @borrows Chart.platform.addEventListener as addEventListener - * @borrows Chart.platform.removeEventListener as removeEventListener - */ - - /** - * @interface IEvent - * @prop {String} type - The event type name, possible values are: - * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout', - * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize' - * @prop {*} native - The original native event (null for emulated events, e.g. 'resize') - * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events) - * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events) - */ - - }, {"45": 45, "46": 46, "47": 47}], 49: [function (require, module, exports) { - /** - * Plugin based on discussion from the following Chart.js issues: - * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569 - * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897 - */ - - 'use strict'; - - var defaults = require(25); - var elements = require(40); - var helpers = require(45); - - defaults._set('global', { - plugins: { - filler: { - propagate: true - } - } - }); - - module.exports = function () { - - var mappers = { - dataset: function (source) { - var index = source.fill; - var chart = source.chart; - var meta = chart.getDatasetMeta(index); - var visible = meta && chart.isDatasetVisible(index); - var points = (visible && meta.dataset._children) || []; - var length = points.length || 0; - - return !length ? null : function (point, i) { - return (i < length && points[i]._view) || null; - }; - }, - - boundary: function (source) { - var boundary = source.boundary; - var x = boundary ? boundary.x : null; - var y = boundary ? boundary.y : null; - - return function (point) { - return { - x: x === null ? point.x : x, - y: y === null ? point.y : y, - }; - }; - } - }; - - // @todo if (fill[0] === '#') - function decodeFill(el, index, count) { - var model = el._model || {}; - var fill = model.fill; - var target; - - if (fill === undefined) { - fill = !!model.backgroundColor; - } - - if (fill === false || fill === null) { - return false; - } - - if (fill === true) { - return 'origin'; - } - - target = parseFloat(fill, 10); - if (isFinite(target) && Math.floor(target) === target) { - if (fill[0] === '-' || fill[0] === '+') { - target = index + target; - } - - if (target === index || target < 0 || target >= count) { - return false; - } - - return target; - } - - switch (fill) { - // compatibility - case 'bottom': - return 'start'; - case 'top': - return 'end'; - case 'zero': - return 'origin'; - // supported boundaries - case 'origin': - case 'start': - case 'end': - return fill; - // invalid fill values - default: - return false; - } - } - - function computeBoundary(source) { - var model = source.el._model || {}; - var scale = source.el._scale || {}; - var fill = source.fill; - var target = null; - var horizontal; - - if (isFinite(fill)) { - return null; - } - - // Backward compatibility: until v3, we still need to support boundary values set on - // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and - // controllers might still use it (e.g. the Smith chart). - - if (fill === 'start') { - target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; - } else if (fill === 'end') { - target = model.scaleTop === undefined ? scale.top : model.scaleTop; - } else if (model.scaleZero !== undefined) { - target = model.scaleZero; - } else if (scale.getBasePosition) { - target = scale.getBasePosition(); - } else if (scale.getBasePixel) { - target = scale.getBasePixel(); - } - - if (target !== undefined && target !== null) { - if (target.x !== undefined && target.y !== undefined) { - return target; - } - - if (typeof target === 'number' && isFinite(target)) { - horizontal = scale.isHorizontal(); - return { - x: horizontal ? target : null, - y: horizontal ? null : target - }; - } - } - - return null; - } - - function resolveTarget(sources, index, propagate) { - var source = sources[index]; - var fill = source.fill; - var visited = [index]; - var target; - - if (!propagate) { - return fill; - } - - while (fill !== false && visited.indexOf(fill) === -1) { - if (!isFinite(fill)) { - return fill; - } - - target = sources[fill]; - if (!target) { - return false; - } - - if (target.visible) { - return fill; - } - - visited.push(fill); - fill = target.fill; - } - - return false; - } - - function createMapper(source) { - var fill = source.fill; - var type = 'dataset'; - - if (fill === false) { - return null; - } - - if (!isFinite(fill)) { - type = 'boundary'; - } - - return mappers[type](source); - } - - function isDrawable(point) { - return point && !point.skip; - } - - function drawArea(ctx, curve0, curve1, len0, len1) { - var i; - - if (!len0 || !len1) { - return; - } - - // building first area curve (normal) - ctx.moveTo(curve0[0].x, curve0[0].y); - for (i = 1; i < len0; ++i) { - helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); - } - - // joining the two area curves - ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); - - // building opposite area curve (reverse) - for (i = len1 - 1; i > 0; --i) { - helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); - } - } - - function doFill(ctx, points, mapper, view, color, loop) { - var count = points.length; - var span = view.spanGaps; - var curve0 = []; - var curve1 = []; - var len0 = 0; - var len1 = 0; - var i, ilen, index, p0, p1, d0, d1; - - ctx.beginPath(); - - for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { - index = i % count; - p0 = points[index]._view; - p1 = mapper(p0, index, view); - d0 = isDrawable(p0); - d1 = isDrawable(p1); - - if (d0 && d1) { - len0 = curve0.push(p0); - len1 = curve1.push(p1); - } else if (len0 && len1) { - if (!span) { - drawArea(ctx, curve0, curve1, len0, len1); - len0 = len1 = 0; - curve0 = []; - curve1 = []; - } else { - if (d0) { - curve0.push(p0); - } - if (d1) { - curve1.push(p1); - } - } - } - } - - drawArea(ctx, curve0, curve1, len0, len1); - - ctx.closePath(); - ctx.fillStyle = color; - ctx.fill(); - } - - return { - id: 'filler', - - afterDatasetsUpdate: function (chart, options) { - var count = (chart.data.datasets || []).length; - var propagate = options.propagate; - var sources = []; - var meta, i, el, source; - - for (i = 0; i < count; ++i) { - meta = chart.getDatasetMeta(i); - el = meta.dataset; - source = null; - - if (el && el._model && el instanceof elements.Line) { - source = { - visible: chart.isDatasetVisible(i), - fill: decodeFill(el, i, count), - chart: chart, - el: el - }; - } - - meta.$filler = source; - sources.push(source); - } - - for (i = 0; i < count; ++i) { - source = sources[i]; - if (!source) { - continue; - } - - source.fill = resolveTarget(sources, i, propagate); - source.boundary = computeBoundary(source); - source.mapper = createMapper(source); - } - }, - - beforeDatasetDraw: function (chart, args) { - var meta = args.meta.$filler; - if (!meta) { - return; - } - - var ctx = chart.ctx; - var el = meta.el; - var view = el._view; - var points = el._children || []; - var mapper = meta.mapper; - var color = view.backgroundColor || defaults.global.defaultColor; - - if (mapper && color && points.length) { - helpers.canvas.clipArea(ctx, chart.chartArea); - doFill(ctx, points, mapper, view, color, el._loop); - helpers.canvas.unclipArea(ctx); - } - } - }; - }; - - }, {"25": 25, "40": 40, "45": 45}], 50: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - defaults._set('global', { - legend: { - display: true, - position: 'top', - fullWidth: true, - reverse: false, - weight: 1000, - - // a callback that will handle - onClick: function (e, legendItem) { - var index = legendItem.datasetIndex; - var ci = this.chart; - var meta = ci.getDatasetMeta(index); - - // See controller.isDatasetVisible comment - meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; - - // We hid a dataset ... rerender the chart - ci.update(); - }, - - onHover: null, - - labels: { - boxWidth: 40, - padding: 10, - // Generates labels shown in the legend - // Valid properties to return: - // text : text to display - // fillStyle : fill of coloured box - // strokeStyle: stroke of coloured box - // hidden : if this legend item refers to a hidden item - // lineCap : cap style for line - // lineDash - // lineDashOffset : - // lineJoin : - // lineWidth : - generateLabels: function (chart) { - var data = chart.data; - return helpers.isArray(data.datasets) ? data.datasets.map(function (dataset, i) { - return { - text: dataset.label, - fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), - hidden: !chart.isDatasetVisible(i), - lineCap: dataset.borderCapStyle, - lineDash: dataset.borderDash, - lineDashOffset: dataset.borderDashOffset, - lineJoin: dataset.borderJoinStyle, - lineWidth: dataset.borderWidth, - strokeStyle: dataset.borderColor, - pointStyle: dataset.pointStyle, - - // Below is extra data used for toggling the datasets - datasetIndex: i - }; - }, this) : []; - } - } - }, - - legendCallback: function (chart) { - var text = []; - text.push('
    '); - for (var i = 0; i < chart.data.datasets.length; i++) { - text.push('
  • '); - if (chart.data.datasets[i].label) { - text.push(chart.data.datasets[i].label); - } - text.push('
  • '); - } - text.push('
'); - return text.join(''); - } - }); - - module.exports = function (Chart) { - - var layout = Chart.layoutService; - var noop = helpers.noop; - - /** - * Helper function to get the box width based on the usePointStyle option - * @param labelopts {Object} the label options on the legend - * @param fontSize {Number} the label font size - * @return {Number} width of the color box area - */ - function getBoxWidth(labelOpts, fontSize) { - return labelOpts.usePointStyle ? - fontSize * Math.SQRT2 : - labelOpts.boxWidth; - } - - Chart.Legend = Element.extend({ - - initialize: function (config) { - helpers.extend(this, config); - - // Contains hit boxes for each dataset (in dataset order) - this.legendHitBoxes = []; - - // Are we in doughnut mode which has a different data type - this.doughnutMode = false; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - // Any function defined here is inherited by all legend types. - // Any function can be extended by the legend type - - beforeUpdate: noop, - update: function (maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - }, - afterUpdate: noop, - - // - - beforeSetDimensions: noop, - setDimensions: function () { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop, - - // - - beforeBuildLabels: noop, - buildLabels: function () { - var me = this; - var labelOpts = me.options.labels || {}; - var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || []; - - if (labelOpts.filter) { - legendItems = legendItems.filter(function (item) { - return labelOpts.filter(item, me.chart.data); - }); - } - - if (me.options.reverse) { - legendItems.reverse(); - } - - me.legendItems = legendItems; - }, - afterBuildLabels: noop, - - // - - beforeFit: noop, - fit: function () { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var display = opts.display; - - var ctx = me.ctx; - - var globalDefault = defaults.global; - var valueOrDefault = helpers.valueOrDefault; - var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); - var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); - var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); - var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); - - // Reset hit boxes - var hitboxes = me.legendHitBoxes = []; - - var minSize = me.minSize; - var isHorizontal = me.isHorizontal(); - - if (isHorizontal) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = display ? 10 : 0; - } else { - minSize.width = display ? 10 : 0; - minSize.height = me.maxHeight; // fill all the height - } - - // Increase sizes here - if (display) { - ctx.font = labelFont; - - if (isHorizontal) { - // Labels - - // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one - var lineWidths = me.lineWidths = [0]; - var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0; - - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - - helpers.each(me.legendItems, function (legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) { - totalHeight += fontSize + (labelOpts.padding); - lineWidths[lineWidths.length] = me.left; - } - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: width, - height: fontSize - }; - - lineWidths[lineWidths.length - 1] += width + labelOpts.padding; - }); - - minSize.height += totalHeight; - - } else { - var vPadding = labelOpts.padding; - var columnWidths = me.columnWidths = []; - var totalWidth = labelOpts.padding; - var currentColWidth = 0; - var currentColHeight = 0; - var itemHeight = fontSize + vPadding; - - helpers.each(me.legendItems, function (legendItem, i) { - var boxWidth = getBoxWidth(labelOpts, fontSize); - var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; - - // If too tall, go to new column - if (currentColHeight + itemHeight > minSize.height) { - totalWidth += currentColWidth + labelOpts.padding; - columnWidths.push(currentColWidth); // previous column width - - currentColWidth = 0; - currentColHeight = 0; - } - - // Get max width - currentColWidth = Math.max(currentColWidth, itemWidth); - currentColHeight += itemHeight; - - // Store the hitbox width and height here. Final position will be updated in `draw` - hitboxes[i] = { - left: 0, - top: 0, - width: itemWidth, - height: fontSize - }; - }); - - totalWidth += currentColWidth; - columnWidths.push(currentColWidth); - minSize.width += totalWidth; - } - } - - me.width = minSize.width; - me.height = minSize.height; - }, - afterFit: noop, - - // Shared Methods - isHorizontal: function () { - return this.options.position === 'top' || this.options.position === 'bottom'; - }, - - // Actually draw the legend on the canvas - draw: function () { - var me = this; - var opts = me.options; - var labelOpts = opts.labels; - var globalDefault = defaults.global; - var lineDefault = globalDefault.elements.line; - var legendWidth = me.width; - var lineWidths = me.lineWidths; - - if (opts.display) { - var ctx = me.ctx; - var valueOrDefault = helpers.valueOrDefault; - var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor); - var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); - var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); - var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); - var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); - var cursor; - - // Canvas setup - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - ctx.lineWidth = 0.5; - ctx.strokeStyle = fontColor; // for strikethrough effect - ctx.fillStyle = fontColor; // render in correct colour - ctx.font = labelFont; - - var boxWidth = getBoxWidth(labelOpts, fontSize); - var hitboxes = me.legendHitBoxes; - - // current position - var drawLegendBox = function (x, y, legendItem) { - if (isNaN(boxWidth) || boxWidth <= 0) { - return; - } - - // Set the ctx for the box - ctx.save(); - - ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor); - ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle); - ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset); - ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle); - ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth); - ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor); - var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0); - - if (ctx.setLineDash) { - // IE 9 and 10 do not support line dash - ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash)); - } - - if (opts.labels && opts.labels.usePointStyle) { - // Recalculate x and y for drawPoint() because its expecting - // x and y to be center of figure (instead of top left) - var radius = fontSize * Math.SQRT2 / 2; - var offSet = radius / Math.SQRT2; - var centerX = x + offSet; - var centerY = y + offSet; - - // Draw pointStyle as legend symbol - helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); - } else { - // Draw box as legend symbol - if (!isLineWidthZero) { - ctx.strokeRect(x, y, boxWidth, fontSize); - } - ctx.fillRect(x, y, boxWidth, fontSize); - } - - ctx.restore(); - }; - var fillText = function (x, y, legendItem, textWidth) { - var halfFontSize = fontSize / 2; - var xLeft = boxWidth + halfFontSize + x; - var yMiddle = y + halfFontSize; - - ctx.fillText(legendItem.text, xLeft, yMiddle); - - if (legendItem.hidden) { - // Strikethrough the text if hidden - ctx.beginPath(); - ctx.lineWidth = 2; - ctx.moveTo(xLeft, yMiddle); - ctx.lineTo(xLeft + textWidth, yMiddle); - ctx.stroke(); - } - }; - - // Horizontal - var isHorizontal = me.isHorizontal(); - if (isHorizontal) { - cursor = { - x: me.left + ((legendWidth - lineWidths[0]) / 2), - y: me.top + labelOpts.padding, - line: 0 - }; - } else { - cursor = { - x: me.left + labelOpts.padding, - y: me.top + labelOpts.padding, - line: 0 - }; - } - - var itemHeight = fontSize + labelOpts.padding; - helpers.each(me.legendItems, function (legendItem, i) { - var textWidth = ctx.measureText(legendItem.text).width; - var width = boxWidth + (fontSize / 2) + textWidth; - var x = cursor.x; - var y = cursor.y; - - if (isHorizontal) { - if (x + width >= legendWidth) { - y = cursor.y += itemHeight; - cursor.line++; - x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2); - } - } else if (y + itemHeight > me.bottom) { - x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; - y = cursor.y = me.top + labelOpts.padding; - cursor.line++; - } - - drawLegendBox(x, y, legendItem); - - hitboxes[i].left = x; - hitboxes[i].top = y; - - // Fill the actual label - fillText(x, y, legendItem, textWidth); - - if (isHorizontal) { - cursor.x += width + (labelOpts.padding); - } else { - cursor.y += itemHeight; - } - - }); - } - }, - - /** - * Handle an event - * @private - * @param {IEvent} event - The event to handle - * @return {Boolean} true if a change occured - */ - handleEvent: function (e) { - var me = this; - var opts = me.options; - var type = e.type === 'mouseup' ? 'click' : e.type; - var changed = false; - - if (type === 'mousemove') { - if (!opts.onHover) { - return; - } - } else if (type === 'click') { - if (!opts.onClick) { - return; - } - } else { - return; - } - - // Chart event already has relative position in it - var x = e.x; - var y = e.y; - - if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { - // See if we are touching one of the dataset boxes - var lh = me.legendHitBoxes; - for (var i = 0; i < lh.length; ++i) { - var hitBox = lh[i]; - - if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { - // Touching an element - if (type === 'click') { - // use e.native for backwards compatibility - opts.onClick.call(me, e.native, me.legendItems[i]); - changed = true; - break; - } else if (type === 'mousemove') { - // use e.native for backwards compatibility - opts.onHover.call(me, e.native, me.legendItems[i]); - changed = true; - break; - } - } - } - } - - return changed; - } - }); - - function createNewLegendAndAttach(chart, legendOpts) { - var legend = new Chart.Legend({ - ctx: chart.ctx, - options: legendOpts, - chart: chart - }); - - layout.configure(chart, legend, legendOpts); - layout.addBox(chart, legend); - chart.legend = legend; - } - - return { - id: 'legend', - - beforeInit: function (chart) { - var legendOpts = chart.options.legend; - - if (legendOpts) { - createNewLegendAndAttach(chart, legendOpts); - } - }, - - beforeUpdate: function (chart) { - var legendOpts = chart.options.legend; - var legend = chart.legend; - - if (legendOpts) { - helpers.mergeIf(legendOpts, defaults.global.legend); - - if (legend) { - layout.configure(chart, legend, legendOpts); - legend.options = legendOpts; - } else { - createNewLegendAndAttach(chart, legendOpts); - } - } else if (legend) { - layout.removeBox(chart, legend); - delete chart.legend; - } - }, - - afterEvent: function (chart, e) { - var legend = chart.legend; - if (legend) { - legend.handleEvent(e); - } - } - }; - }; - - }, {"25": 25, "26": 26, "45": 45}], 51: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var Element = require(26); - var helpers = require(45); - - defaults._set('global', { - title: { - display: false, - fontStyle: 'bold', - fullWidth: true, - lineHeight: 1.2, - padding: 10, - position: 'top', - text: '', - weight: 2000 // by default greater than legend (1000) to be above - } - }); - - module.exports = function (Chart) { - - var layout = Chart.layoutService; - var noop = helpers.noop; - - Chart.Title = Element.extend({ - initialize: function (config) { - var me = this; - helpers.extend(me, config); - - // Contains hit boxes for each dataset (in dataset order) - me.legendHitBoxes = []; - }, - - // These methods are ordered by lifecycle. Utilities then follow. - - beforeUpdate: noop, - update: function (maxWidth, maxHeight, margins) { - var me = this; - - // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) - me.beforeUpdate(); - - // Absorb the master measurements - me.maxWidth = maxWidth; - me.maxHeight = maxHeight; - me.margins = margins; - - // Dimensions - me.beforeSetDimensions(); - me.setDimensions(); - me.afterSetDimensions(); - // Labels - me.beforeBuildLabels(); - me.buildLabels(); - me.afterBuildLabels(); - - // Fit - me.beforeFit(); - me.fit(); - me.afterFit(); - // - me.afterUpdate(); - - return me.minSize; - - }, - afterUpdate: noop, - - // - - beforeSetDimensions: noop, - setDimensions: function () { - var me = this; - // Set the unconstrained dimension before label rotation - if (me.isHorizontal()) { - // Reset position before calculating rotation - me.width = me.maxWidth; - me.left = 0; - me.right = me.width; - } else { - me.height = me.maxHeight; - - // Reset position before calculating rotation - me.top = 0; - me.bottom = me.height; - } - - // Reset padding - me.paddingLeft = 0; - me.paddingTop = 0; - me.paddingRight = 0; - me.paddingBottom = 0; - - // Reset minSize - me.minSize = { - width: 0, - height: 0 - }; - }, - afterSetDimensions: noop, - - // - - beforeBuildLabels: noop, - buildLabels: noop, - afterBuildLabels: noop, - - // - - beforeFit: noop, - fit: function () { - var me = this; - var valueOrDefault = helpers.valueOrDefault; - var opts = me.options; - var display = opts.display; - var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize); - var minSize = me.minSize; - var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1; - var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); - var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0; - - if (me.isHorizontal()) { - minSize.width = me.maxWidth; // fill all the width - minSize.height = textSize; - } else { - minSize.width = textSize; - minSize.height = me.maxHeight; // fill all the height - } - - me.width = minSize.width; - me.height = minSize.height; - - }, - afterFit: noop, - - // Shared Methods - isHorizontal: function () { - var pos = this.options.position; - return pos === 'top' || pos === 'bottom'; - }, - - // Actually draw the title block on the canvas - draw: function () { - var me = this; - var ctx = me.ctx; - var valueOrDefault = helpers.valueOrDefault; - var opts = me.options; - var globalDefaults = defaults.global; - - if (opts.display) { - var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize); - var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle); - var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily); - var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily); - var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); - var offset = lineHeight / 2 + opts.padding; - var rotation = 0; - var top = me.top; - var left = me.left; - var bottom = me.bottom; - var right = me.right; - var maxWidth, titleX, titleY; - - ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour - ctx.font = titleFont; - - // Horizontal - if (me.isHorizontal()) { - titleX = left + ((right - left) / 2); // midpoint of the width - titleY = top + offset; - maxWidth = right - left; - } else { - titleX = opts.position === 'left' ? left + offset : right - offset; - titleY = top + ((bottom - top) / 2); - maxWidth = bottom - top; - rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); - } - - ctx.save(); - ctx.translate(titleX, titleY); - ctx.rotate(rotation); - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - - var text = opts.text; - if (helpers.isArray(text)) { - var y = 0; - for (var i = 0; i < text.length; ++i) { - ctx.fillText(text[i], 0, y, maxWidth); - y += lineHeight; - } - } else { - ctx.fillText(text, 0, 0, maxWidth); - } - - ctx.restore(); - } - } - }); - - function createNewTitleBlockAndAttach(chart, titleOpts) { - var title = new Chart.Title({ - ctx: chart.ctx, - options: titleOpts, - chart: chart - }); - - layout.configure(chart, title, titleOpts); - layout.addBox(chart, title); - chart.titleBlock = title; - } - - return { - id: 'title', - - beforeInit: function (chart) { - var titleOpts = chart.options.title; - - if (titleOpts) { - createNewTitleBlockAndAttach(chart, titleOpts); - } - }, - - beforeUpdate: function (chart) { - var titleOpts = chart.options.title; - var titleBlock = chart.titleBlock; - - if (titleOpts) { - helpers.mergeIf(titleOpts, defaults.global.title); - - if (titleBlock) { - layout.configure(chart, titleBlock, titleOpts); - titleBlock.options = titleOpts; - } else { - createNewTitleBlockAndAttach(chart, titleOpts); - } - } else if (titleBlock) { - Chart.layoutService.removeBox(chart, titleBlock); - delete chart.titleBlock; - } - } - }; - }; - - }, {"25": 25, "26": 26, "45": 45}], 52: [function (require, module, exports) { - 'use strict'; - - module.exports = function (Chart) { - - // Default config for a category scale - var defaultConfig = { - position: 'bottom' - }; - - var DatasetScale = Chart.Scale.extend({ - /** - * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those - * else fall back to data.labels - * @private - */ - getLabels: function () { - var data = this.chart.data; - return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; - }, - - determineDataLimits: function () { - var me = this; - var labels = me.getLabels(); - me.minIndex = 0; - me.maxIndex = labels.length - 1; - var findIndex; - - if (me.options.ticks.min !== undefined) { - // user specified min value - findIndex = labels.indexOf(me.options.ticks.min); - me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; - } - - if (me.options.ticks.max !== undefined) { - // user specified max value - findIndex = labels.indexOf(me.options.ticks.max); - me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; - } - - me.min = labels[me.minIndex]; - me.max = labels[me.maxIndex]; - }, - - buildTicks: function () { - var me = this; - var labels = me.getLabels(); - // If we are viewing some subset of labels, slice the original array - me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); - }, - - getLabelForIndex: function (index, datasetIndex) { - var me = this; - var data = me.chart.data; - var isHorizontal = me.isHorizontal(); - - if (data.yLabels && !isHorizontal) { - return me.getRightValue(data.datasets[datasetIndex].data[index]); - } - return me.ticks[index - me.minIndex]; - }, - - // Used to get data value locations. Value can either be an index or a numerical value - getPixelForValue: function (value, index) { - var me = this; - var offset = me.options.offset; - // 1 is added because we need the length but we have the indexes - var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); - - // If value is a data object, then index is the index in the data array, - // not the index of the scale. We need to change that. - var valueCategory; - if (value !== undefined && value !== null) { - valueCategory = me.isHorizontal() ? value.x : value.y; - } - if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { - var labels = me.getLabels(); - value = valueCategory || value; - var idx = labels.indexOf(value); - index = idx !== -1 ? idx : index; - } - - if (me.isHorizontal()) { - var valueWidth = me.width / offsetAmt; - var widthOffset = (valueWidth * (index - me.minIndex)); - - if (offset) { - widthOffset += (valueWidth / 2); - } - - return me.left + Math.round(widthOffset); - } - var valueHeight = me.height / offsetAmt; - var heightOffset = (valueHeight * (index - me.minIndex)); - - if (offset) { - heightOffset += (valueHeight / 2); - } - - return me.top + Math.round(heightOffset); - }, - getPixelForTick: function (index) { - return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); - }, - getValueForPixel: function (pixel) { - var me = this; - var offset = me.options.offset; - var value; - var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); - var horz = me.isHorizontal(); - var valueDimension = (horz ? me.width : me.height) / offsetAmt; - - pixel -= horz ? me.left : me.top; - - if (offset) { - pixel -= (valueDimension / 2); - } - - if (pixel <= 0) { - value = 0; - } else { - value = Math.round(pixel / valueDimension); - } - - return value + me.minIndex; - }, - getBasePixel: function () { - return this.bottom; - } - }); - - Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig); - - }; - - }, {}], 53: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var helpers = require(45); - var Ticks = require(34); - - module.exports = function (Chart) { - - var defaultConfig = { - position: 'left', - ticks: { - callback: Ticks.formatters.linear - } - }; - - var LinearScale = Chart.LinearScaleBase.extend({ - - determineDataLimits: function () { - var me = this; - var opts = me.options; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var isHorizontal = me.isHorizontal(); - var DEFAULT_MIN = 0; - var DEFAULT_MAX = 1; - - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // First Calculate the range - me.min = null; - me.max = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers.each(datasets, function (dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers.each(datasets, function (dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = { - positiveValues: [], - negativeValues: [] - }; - } - - // Store these per type - var positiveValues = valuesPerStack[key].positiveValues; - var negativeValues = valuesPerStack[key].negativeValues; - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers.each(dataset.data, function (rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - positiveValues[index] = positiveValues[index] || 0; - negativeValues[index] = negativeValues[index] || 0; - - if (opts.relativePoints) { - positiveValues[index] = 100; - } else if (value < 0) { - negativeValues[index] += value; - } else { - positiveValues[index] += value; - } - }); - } - }); - - helpers.each(valuesPerStack, function (valuesForType) { - var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); - var minVal = helpers.min(values); - var maxVal = helpers.max(values); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - }); - - } else { - helpers.each(datasets, function (dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers.each(dataset.data, function (rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - }); - } - }); - } - - me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; - me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - this.handleTickRangeOptions(); - }, - getTickLimit: function () { - var maxTicks; - var me = this; - var tickOpts = me.options.ticks; - - if (me.isHorizontal()) { - maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50)); - } else { - // The factor of 2 used to scale the font size has been experimentally determined. - var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize); - maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize))); - } - - return maxTicks; - }, - // Called after the ticks are built. We need - handleDirectionalChanges: function () { - if (!this.isHorizontal()) { - // We are in a vertical orientation. The top value is the highest. So reverse the array - this.ticks.reverse(); - } - }, - getLabelForIndex: function (index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - // Utils - getPixelForValue: function (value) { - // This must be called after fit has been run so that - // this.left, this.top, this.right, and this.bottom have been defined - var me = this; - var start = me.start; - - var rightValue = +me.getRightValue(value); - var pixel; - var range = me.end - start; - - if (me.isHorizontal()) { - pixel = me.left + (me.width / range * (rightValue - start)); - return Math.round(pixel); - } - - pixel = me.bottom - (me.height / range * (rightValue - start)); - return Math.round(pixel); - }, - getValueForPixel: function (pixel) { - var me = this; - var isHorizontal = me.isHorizontal(); - var innerDimension = isHorizontal ? me.width : me.height; - var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; - return me.start + ((me.end - me.start) * offset); - }, - getPixelForTick: function (index) { - return this.getPixelForValue(this.ticksAsNumbers[index]); - } - }); - Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig); - - }; - - }, {"25": 25, "34": 34, "45": 45}], 54: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - var Ticks = require(34); - - module.exports = function (Chart) { - - var noop = helpers.noop; - - Chart.LinearScaleBase = Chart.Scale.extend({ - getRightValue: function (value) { - if (typeof value === 'string') { - return +value; - } - return Chart.Scale.prototype.getRightValue.call(this, value); - }, - - handleTickRangeOptions: function () { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, - // do nothing since that would make the chart weird. If the user really wants a weird chart - // axis, they can manually override it - if (tickOpts.beginAtZero) { - var minSign = helpers.sign(me.min); - var maxSign = helpers.sign(me.max); - - if (minSign < 0 && maxSign < 0) { - // move the top up to 0 - me.max = 0; - } else if (minSign > 0 && maxSign > 0) { - // move the bottom down to 0 - me.min = 0; - } - } - - var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; - var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; - - if (tickOpts.min !== undefined) { - me.min = tickOpts.min; - } else if (tickOpts.suggestedMin !== undefined) { - if (me.min === null) { - me.min = tickOpts.suggestedMin; - } else { - me.min = Math.min(me.min, tickOpts.suggestedMin); - } - } - - if (tickOpts.max !== undefined) { - me.max = tickOpts.max; - } else if (tickOpts.suggestedMax !== undefined) { - if (me.max === null) { - me.max = tickOpts.suggestedMax; - } else { - me.max = Math.max(me.max, tickOpts.suggestedMax); - } - } - - if (setMin !== setMax) { - // We set the min or the max but not both. - // So ensure that our range is good - // Inverted or 0 length range can happen when - // ticks.min is set, and no datasets are visible - if (me.min >= me.max) { - if (setMin) { - me.max = me.min + 1; - } else { - me.min = me.max - 1; - } - } - } - - if (me.min === me.max) { - me.max++; - - if (!tickOpts.beginAtZero) { - me.min--; - } - } - }, - getTickLimit: noop, - handleDirectionalChanges: noop, - - buildTicks: function () { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - // Figure out what the max number of ticks we can support it is based on the size of - // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 - // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on - // the graph. Make sure we always have at least 2 ticks - var maxTicks = me.getTickLimit(); - maxTicks = Math.max(2, maxTicks); - - var numericGeneratorOptions = { - maxTicks: maxTicks, - min: tickOpts.min, - max: tickOpts.max, - stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) - }; - var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me); - - me.handleDirectionalChanges(); - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers.max(ticks); - me.min = helpers.min(ticks); - - if (tickOpts.reverse) { - ticks.reverse(); - - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - }, - convertTicksToLabels: function () { - var me = this; - me.ticksAsNumbers = me.ticks.slice(); - me.zeroLineIndex = me.ticks.indexOf(0); - - Chart.Scale.prototype.convertTicksToLabels.call(me); - } - }); - }; - - }, {"34": 34, "45": 45}], 55: [function (require, module, exports) { - 'use strict'; - - var helpers = require(45); - var Ticks = require(34); - - module.exports = function (Chart) { - - var defaultConfig = { - position: 'left', - - // label settings - ticks: { - callback: Ticks.formatters.logarithmic - } - }; - - var LogarithmicScale = Chart.Scale.extend({ - determineDataLimits: function () { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - var chart = me.chart; - var data = chart.data; - var datasets = data.datasets; - var valueOrDefault = helpers.valueOrDefault; - var isHorizontal = me.isHorizontal(); - - function IDMatches(meta) { - return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; - } - - // Calculate Range - me.min = null; - me.max = null; - me.minNotZero = null; - - var hasStacks = opts.stacked; - if (hasStacks === undefined) { - helpers.each(datasets, function (dataset, datasetIndex) { - if (hasStacks) { - return; - } - - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && - meta.stack !== undefined) { - hasStacks = true; - } - }); - } - - if (opts.stacked || hasStacks) { - var valuesPerStack = {}; - - helpers.each(datasets, function (dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - var key = [ - meta.type, - // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined - ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), - meta.stack - ].join('.'); - - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - if (valuesPerStack[key] === undefined) { - valuesPerStack[key] = []; - } - - helpers.each(dataset.data, function (rawValue, index) { - var values = valuesPerStack[key]; - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - values[index] = values[index] || 0; - - if (opts.relativePoints) { - values[index] = 100; - } else { - // Don't need to split positive and negative since the log scale can't handle a 0 crossing - values[index] += value; - } - }); - } - }); - - helpers.each(valuesPerStack, function (valuesForType) { - var minVal = helpers.min(valuesForType); - var maxVal = helpers.max(valuesForType); - me.min = me.min === null ? minVal : Math.min(me.min, minVal); - me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); - }); - - } else { - helpers.each(datasets, function (dataset, datasetIndex) { - var meta = chart.getDatasetMeta(datasetIndex); - if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { - helpers.each(dataset.data, function (rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - if (me.min === null) { - me.min = value; - } else if (value < me.min) { - me.min = value; - } - - if (me.max === null) { - me.max = value; - } else if (value > me.max) { - me.max = value; - } - - if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { - me.minNotZero = value; - } - }); - } - }); - } - - me.min = valueOrDefault(tickOpts.min, me.min); - me.max = valueOrDefault(tickOpts.max, me.max); - - if (me.min === me.max) { - if (me.min !== 0 && me.min !== null) { - me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1); - me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1); - } else { - me.min = 1; - me.max = 10; - } - } - }, - buildTicks: function () { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - - var generationOptions = { - min: tickOpts.min, - max: tickOpts.max - }; - var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me); - - if (!me.isHorizontal()) { - // We are in a vertical orientation. The top value is the highest. So reverse the array - ticks.reverse(); - } - - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - me.max = helpers.max(ticks); - me.min = helpers.min(ticks); - - if (tickOpts.reverse) { - ticks.reverse(); - - me.start = me.max; - me.end = me.min; - } else { - me.start = me.min; - me.end = me.max; - } - }, - convertTicksToLabels: function () { - this.tickValues = this.ticks.slice(); - - Chart.Scale.prototype.convertTicksToLabels.call(this); - }, - // Get the correct tooltip label - getLabelForIndex: function (index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - getPixelForTick: function (index) { - return this.getPixelForValue(this.tickValues[index]); - }, - getPixelForValue: function (value) { - var me = this; - var start = me.start; - var newVal = +me.getRightValue(value); - var opts = me.options; - var tickOpts = opts.ticks; - var innerDimension, pixel, range; - - if (me.isHorizontal()) { - range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0 - if (newVal === 0) { - pixel = me.left; - } else { - innerDimension = me.width; - pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); - } - } else { - // Bottom - top since pixels increase downward on a screen - innerDimension = me.height; - if (start === 0 && !tickOpts.reverse) { - range = helpers.log10(me.end) - helpers.log10(me.minNotZero); - if (newVal === start) { - pixel = me.bottom; - } else if (newVal === me.minNotZero) { - pixel = me.bottom - innerDimension * 0.02; - } else { - pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); - } - } else if (me.end === 0 && tickOpts.reverse) { - range = helpers.log10(me.start) - helpers.log10(me.minNotZero); - if (newVal === me.end) { - pixel = me.top; - } else if (newVal === me.minNotZero) { - pixel = me.top + innerDimension * 0.02; - } else { - pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); - } - } else if (newVal === 0) { - pixel = tickOpts.reverse ? me.top : me.bottom; - } else { - range = helpers.log10(me.end) - helpers.log10(start); - innerDimension = me.height; - pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); - } - } - return pixel; - }, - getValueForPixel: function (pixel) { - var me = this; - var range = helpers.log10(me.end) - helpers.log10(me.start); - var value, innerDimension; - - if (me.isHorizontal()) { - innerDimension = me.width; - value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension); - } else { // todo: if start === 0 - innerDimension = me.height; - value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start; - } - return value; - } - }); - Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig); - - }; - - }, {"34": 34, "45": 45}], 56: [function (require, module, exports) { - 'use strict'; - - var defaults = require(25); - var helpers = require(45); - var Ticks = require(34); - - module.exports = function (Chart) { - - var globalDefaults = defaults.global; - - var defaultConfig = { - display: true, - - // Boolean - Whether to animate scaling the chart from the centre - animate: true, - position: 'chartArea', - - angleLines: { - display: true, - color: 'rgba(0, 0, 0, 0.1)', - lineWidth: 1 - }, - - gridLines: { - circular: false - }, - - // label settings - ticks: { - // Boolean - Show a backdrop to the scale label - showLabelBackdrop: true, - - // String - The colour of the label backdrop - backdropColor: 'rgba(255,255,255,0.75)', - - // Number - The backdrop padding above & below the label in pixels - backdropPaddingY: 2, - - // Number - The backdrop padding to the side of the label in pixels - backdropPaddingX: 2, - - callback: Ticks.formatters.linear - }, - - pointLabels: { - // Boolean - if true, show point labels - display: true, - - // Number - Point label font size in pixels - fontSize: 10, - - // Function - Used to convert point labels - callback: function (label) { - return label; - } - } - }; - - function getValueCount(scale) { - var opts = scale.options; - return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; - } - - function getPointLabelFontOptions(scale) { - var pointLabelOptions = scale.options.pointLabels; - var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize); - var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle); - var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily); - var font = helpers.fontString(fontSize, fontStyle, fontFamily); - - return { - size: fontSize, - style: fontStyle, - family: fontFamily, - font: font - }; - } - - function measureLabelSize(ctx, fontSize, label) { - if (helpers.isArray(label)) { - return { - w: helpers.longestText(ctx, ctx.font, label), - h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize) - }; - } - - return { - w: ctx.measureText(label).width, - h: fontSize - }; - } - - function determineLimits(angle, pos, size, min, max) { - if (angle === min || angle === max) { - return { - start: pos - (size / 2), - end: pos + (size / 2) - }; - } else if (angle < min || angle > max) { - return { - start: pos - size - 5, - end: pos - }; - } - - return { - start: pos, - end: pos + size + 5 - }; - } - - /** - * Helper function to fit a radial linear scale with point labels - */ - function fitWithPointLabels(scale) { - /* - * Right, this is really confusing and there is a lot of maths going on here - * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 - * - * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif - * - * Solution: - * - * We assume the radius of the polygon is half the size of the canvas at first - * at each index we check if the text overlaps. - * - * Where it does, we store that angle and that index. - * - * After finding the largest index and angle we calculate how much we need to remove - * from the shape radius to move the point inwards by that x. - * - * We average the left and right distances to get the maximum shape radius that can fit in the box - * along with labels. - * - * Once we have that, we can find the centre point for the chart, by taking the x text protrusion - * on each side, removing that from the size, halving it and adding the left x protrusion width. - * - * This will mean we have a shape fitted to the canvas, as large as it can be with the labels - * and position it in the most space efficient manner - * - * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif - */ - - var plFont = getPointLabelFontOptions(scale); - - // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. - // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points - var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); - var furthestLimits = { - r: scale.width, - l: 0, - t: scale.height, - b: 0 - }; - var furthestAngles = {}; - var i, textSize, pointPosition; - - scale.ctx.font = plFont.font; - scale._pointLabelSizes = []; - - var valueCount = getValueCount(scale); - for (i = 0; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, largestPossibleRadius); - textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || ''); - scale._pointLabelSizes[i] = textSize; - - // Add quarter circle to make degree 0 mean top of circle - var angleRadians = scale.getIndexAngle(i); - var angle = helpers.toDegrees(angleRadians) % 360; - var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); - var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); - - if (hLimits.start < furthestLimits.l) { - furthestLimits.l = hLimits.start; - furthestAngles.l = angleRadians; - } - - if (hLimits.end > furthestLimits.r) { - furthestLimits.r = hLimits.end; - furthestAngles.r = angleRadians; - } - - if (vLimits.start < furthestLimits.t) { - furthestLimits.t = vLimits.start; - furthestAngles.t = angleRadians; - } - - if (vLimits.end > furthestLimits.b) { - furthestLimits.b = vLimits.end; - furthestAngles.b = angleRadians; - } - } - - scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles); - } - - /** - * Helper function to fit a radial linear scale with no point labels - */ - function fit(scale) { - var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); - scale.drawingArea = Math.round(largestPossibleRadius); - scale.setCenterPoint(0, 0, 0, 0); - } - - function getTextAlignForAngle(angle) { - if (angle === 0 || angle === 180) { - return 'center'; - } else if (angle < 180) { - return 'left'; - } - - return 'right'; - } - - function fillText(ctx, text, position, fontSize) { - if (helpers.isArray(text)) { - var y = position.y; - var spacing = 1.5 * fontSize; - - for (var i = 0; i < text.length; ++i) { - ctx.fillText(text[i], position.x, y); - y += spacing; - } - } else { - ctx.fillText(text, position.x, position.y); - } - } - - function adjustPointPositionForLabelHeight(angle, textSize, position) { - if (angle === 90 || angle === 270) { - position.y -= (textSize.h / 2); - } else if (angle > 270 || angle < 90) { - position.y -= textSize.h; - } - } - - function drawPointLabels(scale) { - var ctx = scale.ctx; - var valueOrDefault = helpers.valueOrDefault; - var opts = scale.options; - var angleLineOpts = opts.angleLines; - var pointLabelOpts = opts.pointLabels; - - ctx.lineWidth = angleLineOpts.lineWidth; - ctx.strokeStyle = angleLineOpts.color; - - var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); - - // Point Label Font - var plFont = getPointLabelFontOptions(scale); - - ctx.textBaseline = 'top'; - - for (var i = getValueCount(scale) - 1; i >= 0; i--) { - if (angleLineOpts.display) { - var outerPosition = scale.getPointPosition(i, outerDistance); - ctx.beginPath(); - ctx.moveTo(scale.xCenter, scale.yCenter); - ctx.lineTo(outerPosition.x, outerPosition.y); - ctx.stroke(); - ctx.closePath(); - } - - if (pointLabelOpts.display) { - // Extra 3px out for some label spacing - var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5); - - // Keep this in loop since we may support array properties here - var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor); - ctx.font = plFont.font; - ctx.fillStyle = pointLabelFontColor; - - var angleRadians = scale.getIndexAngle(i); - var angle = helpers.toDegrees(angleRadians); - ctx.textAlign = getTextAlignForAngle(angle); - adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); - fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size); - } - } - } - - function drawRadiusLine(scale, gridLineOpts, radius, index) { - var ctx = scale.ctx; - ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1); - ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1); - - if (scale.options.gridLines.circular) { - // Draw circular arcs between the points - ctx.beginPath(); - ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); - ctx.closePath(); - ctx.stroke(); - } else { - // Draw straight lines connecting each index - var valueCount = getValueCount(scale); - - if (valueCount === 0) { - return; - } - - ctx.beginPath(); - var pointPosition = scale.getPointPosition(0, radius); - ctx.moveTo(pointPosition.x, pointPosition.y); - - for (var i = 1; i < valueCount; i++) { - pointPosition = scale.getPointPosition(i, radius); - ctx.lineTo(pointPosition.x, pointPosition.y); - } - - ctx.closePath(); - ctx.stroke(); - } - } - - function numberOrZero(param) { - return helpers.isNumber(param) ? param : 0; - } - - var LinearRadialScale = Chart.LinearScaleBase.extend({ - setDimensions: function () { - var me = this; - var opts = me.options; - var tickOpts = opts.ticks; - // Set the unconstrained dimension before label rotation - me.width = me.maxWidth; - me.height = me.maxHeight; - me.xCenter = Math.round(me.width / 2); - me.yCenter = Math.round(me.height / 2); - - var minSize = helpers.min([me.height, me.width]); - var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); - me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2); - }, - determineDataLimits: function () { - var me = this; - var chart = me.chart; - var min = Number.POSITIVE_INFINITY; - var max = Number.NEGATIVE_INFINITY; - - helpers.each(chart.data.datasets, function (dataset, datasetIndex) { - if (chart.isDatasetVisible(datasetIndex)) { - var meta = chart.getDatasetMeta(datasetIndex); - - helpers.each(dataset.data, function (rawValue, index) { - var value = +me.getRightValue(rawValue); - if (isNaN(value) || meta.data[index].hidden) { - return; - } - - min = Math.min(value, min); - max = Math.max(value, max); - }); - } - }); - - me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); - me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); - - // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero - me.handleTickRangeOptions(); - }, - getTickLimit: function () { - var tickOpts = this.options.ticks; - var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); - return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize))); - }, - convertTicksToLabels: function () { - var me = this; - - Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me); - - // Point labels - me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); - }, - getLabelForIndex: function (index, datasetIndex) { - return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); - }, - fit: function () { - if (this.options.pointLabels.display) { - fitWithPointLabels(this); - } else { - fit(this); - } - }, - /** - * Set radius reductions and determine new radius and center point - * @private - */ - setReductions: function (largestPossibleRadius, furthestLimits, furthestAngles) { - var me = this; - var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); - var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); - var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); - var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b); - - radiusReductionLeft = numberOrZero(radiusReductionLeft); - radiusReductionRight = numberOrZero(radiusReductionRight); - radiusReductionTop = numberOrZero(radiusReductionTop); - radiusReductionBottom = numberOrZero(radiusReductionBottom); - - me.drawingArea = Math.min( - Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), - Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); - me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); - }, - setCenterPoint: function (leftMovement, rightMovement, topMovement, bottomMovement) { - var me = this; - var maxRight = me.width - rightMovement - me.drawingArea; - var maxLeft = leftMovement + me.drawingArea; - var maxTop = topMovement + me.drawingArea; - var maxBottom = me.height - bottomMovement - me.drawingArea; - - me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left); - me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top); - }, - - getIndexAngle: function (index) { - var angleMultiplier = (Math.PI * 2) / getValueCount(this); - var startAngle = this.chart.options && this.chart.options.startAngle ? - this.chart.options.startAngle : - 0; - - var startAngleRadians = startAngle * Math.PI * 2 / 360; - - // Start from the top instead of right, so remove a quarter of the circle - return index * angleMultiplier + startAngleRadians; - }, - getDistanceFromCenterForValue: function (value) { - var me = this; - - if (value === null) { - return 0; // null always in center - } - - // Take into account half font size + the yPadding of the top value - var scalingFactor = me.drawingArea / (me.max - me.min); - if (me.options.ticks.reverse) { - return (me.max - value) * scalingFactor; - } - return (value - me.min) * scalingFactor; - }, - getPointPosition: function (index, distanceFromCenter) { - var me = this; - var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); - return { - x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter, - y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter - }; - }, - getPointPositionForValue: function (index, value) { - return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); - }, - - getBasePosition: function () { - var me = this; - var min = me.min; - var max = me.max; - - return me.getPointPositionForValue(0, - me.beginAtZero ? 0 : - min < 0 && max < 0 ? max : - min > 0 && max > 0 ? min : - 0); - }, - - draw: function () { - var me = this; - var opts = me.options; - var gridLineOpts = opts.gridLines; - var tickOpts = opts.ticks; - var valueOrDefault = helpers.valueOrDefault; - - if (opts.display) { - var ctx = me.ctx; - var startAngle = this.getIndexAngle(0); - - // Tick Font - var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); - var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle); - var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily); - var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily); - - helpers.each(me.ticks, function (label, index) { - // Don't draw a centre value (if it is minimum) - if (index > 0 || tickOpts.reverse) { - var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); - - // Draw circular lines around the scale - if (gridLineOpts.display && index !== 0) { - drawRadiusLine(me, gridLineOpts, yCenterOffset, index); - } - - if (tickOpts.display) { - var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor); - ctx.font = tickLabelFont; - - ctx.save(); - ctx.translate(me.xCenter, me.yCenter); - ctx.rotate(startAngle); - - if (tickOpts.showLabelBackdrop) { - var labelWidth = ctx.measureText(label).width; - ctx.fillStyle = tickOpts.backdropColor; - ctx.fillRect( - -labelWidth / 2 - tickOpts.backdropPaddingX, - -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, - labelWidth + tickOpts.backdropPaddingX * 2, - tickFontSize + tickOpts.backdropPaddingY * 2 - ); - } - - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = tickFontColor; - ctx.fillText(label, 0, -yCenterOffset); - ctx.restore(); - } - } - }); - - if (opts.angleLines.display || opts.pointLabels.display) { - drawPointLabels(me); - } - } - } - }); - Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig); - - }; - - }, {"25": 25, "34": 34, "45": 45}], 57: [function (require, module, exports) { - /* global window: false */ - 'use strict'; - - var moment = require(6); - moment = typeof moment === 'function' ? moment : window.moment; - - var defaults = require(25); - var helpers = require(45); - -// Integer constants are from the ES6 spec. - var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; - var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - - var INTERVALS = { - millisecond: { - common: true, - size: 1, - steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] - }, - second: { - common: true, - size: 1000, - steps: [1, 2, 5, 10, 30] - }, - minute: { - common: true, - size: 60000, - steps: [1, 2, 5, 10, 30] - }, - hour: { - common: true, - size: 3600000, - steps: [1, 2, 3, 6, 12] - }, - day: { - common: true, - size: 86400000, - steps: [1, 2, 5] - }, - week: { - common: false, - size: 604800000, - steps: [1, 2, 3, 4] - }, - month: { - common: true, - size: 2.628e9, - steps: [1, 2, 3] - }, - quarter: { - common: false, - size: 7.884e9, - steps: [1, 2, 3, 4] - }, - year: { - common: true, - size: 3.154e10 - } - }; - - var UNITS = Object.keys(INTERVALS); - - function sorter(a, b) { - return a - b; - } - - function arrayUnique(items) { - var hash = {}; - var out = []; - var i, ilen, item; - - for (i = 0, ilen = items.length; i < ilen; ++i) { - item = items[i]; - if (!hash[item]) { - hash[item] = true; - out.push(item); - } - } - - return out; - } - - /** - * Returns an array of {time, pos} objects used to interpolate a specific `time` or position - * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is - * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other - * extremity (left + width or top + height). Note that it would be more optimized to directly - * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need - * to create the lookup table. The table ALWAYS contains at least two items: min and max. - * - * @param {Number[]} timestamps - timestamps sorted from lowest to highest. - * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min - * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. - * If 'series', timestamps will be positioned at the same distance from each other. In this - * case, only timestamps that break the time linearity are registered, meaning that in the - * best case, all timestamps are linear, the table contains only min and max. - */ - function buildLookupTable(timestamps, min, max, distribution) { - if (distribution === 'linear' || !timestamps.length) { - return [ - {time: min, pos: 0}, - {time: max, pos: 1} - ]; - } - - var table = []; - var items = [min]; - var i, ilen, prev, curr, next; - - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - curr = timestamps[i]; - if (curr > min && curr < max) { - items.push(curr); - } - } - - items.push(max); - - for (i = 0, ilen = items.length; i < ilen; ++i) { - next = items[i + 1]; - prev = items[i - 1]; - curr = items[i]; - - // only add points that breaks the scale linearity - if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { - table.push({time: curr, pos: i / (ilen - 1)}); - } - } - - return table; - } - -// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ - function lookup(table, key, value) { - var lo = 0; - var hi = table.length - 1; - var mid, i0, i1; - - while (lo >= 0 && lo <= hi) { - mid = (lo + hi) >> 1; - i0 = table[mid - 1] || null; - i1 = table[mid]; - - if (!i0) { - // given value is outside table (before first item) - return {lo: null, hi: i1}; - } else if (i1[key] < value) { - lo = mid + 1; - } else if (i0[key] > value) { - hi = mid - 1; - } else { - return {lo: i0, hi: i1}; - } - } - - // given value is outside table (after last item) - return {lo: i1, hi: null}; - } - - /** - * Linearly interpolates the given source `value` using the table items `skey` values and - * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') - * returns the position for a timestamp equal to 42. If value is out of bounds, values at - * index [0, 1] or [n - 1, n] are used for the interpolation. - */ - function interpolate(table, skey, sval, tkey) { - var range = lookup(table, skey, sval); - - // Note: the lookup table ALWAYS contains at least 2 items (min and max) - var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; - var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; - - var span = next[skey] - prev[skey]; - var ratio = span ? (sval - prev[skey]) / span : 0; - var offset = (next[tkey] - prev[tkey]) * ratio; - - return prev[tkey] + offset; - } - - /** - * Convert the given value to a moment object using the given time options. - * @see http://momentjs.com/docs/#/parsing/ - */ - function momentify(value, options) { - var parser = options.parser; - var format = options.parser || options.format; - - if (typeof parser === 'function') { - return parser(value); - } - - if (typeof value === 'string' && typeof format === 'string') { - return moment(value, format); - } - - if (!(value instanceof moment)) { - value = moment(value); - } - - if (value.isValid()) { - return value; - } - - // Labels are in an incompatible moment format and no `parser` has been provided. - // The user might still use the deprecated `format` option to convert his inputs. - if (typeof format === 'function') { - return format(value); - } - - return value; - } - - function parse(input, scale) { - if (helpers.isNullOrUndef(input)) { - return null; - } - - var options = scale.options.time; - var value = momentify(scale.getRightValue(input), options); - if (!value.isValid()) { - return null; - } - - if (options.round) { - value.startOf(options.round); - } - - return value.valueOf(); - } - - /** - * Returns the number of unit to skip to be able to display up to `capacity` number of ticks - * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. - */ - function determineStepSize(min, max, unit, capacity) { - var range = max - min; - var interval = INTERVALS[unit]; - var milliseconds = interval.size; - var steps = interval.steps; - var i, ilen, factor; - - if (!steps) { - return Math.ceil(range / ((capacity || 1) * milliseconds)); - } - - for (i = 0, ilen = steps.length; i < ilen; ++i) { - factor = steps[i]; - if (Math.ceil(range / (milliseconds * factor)) <= capacity) { - break; - } - } - - return factor; - } - - /** - * Figures out what unit results in an appropriate number of auto-generated ticks - */ - function determineUnitForAutoTicks(minUnit, min, max, capacity) { - var ilen = UNITS.length; - var i, interval, factor; - - for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { - interval = INTERVALS[UNITS[i]]; - factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; - - if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { - return UNITS[i]; - } - } - - return UNITS[ilen - 1]; - } - - /** - * Figures out what unit to format a set of ticks with - */ - function determineUnitForFormatting(ticks, minUnit, min, max) { - var duration = moment.duration(moment(max).diff(moment(min))); - var ilen = UNITS.length; - var i, unit; - - for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { - unit = UNITS[i]; - if (INTERVALS[unit].common && duration.as(unit) >= ticks.length) { - return unit; - } - } - - return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; - } - - function determineMajorUnit(unit) { - for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { - if (INTERVALS[UNITS[i]].common) { - return UNITS[i]; - } - } - } - - /** - * Generates a maximum of `capacity` timestamps between min and max, rounded to the - * `minor` unit, aligned on the `major` unit and using the given scale time `options`. - * Important: this method can return ticks outside the min and max range, it's the - * responsibility of the calling code to clamp values if needed. - */ - function generate(min, max, capacity, options) { - var timeOpts = options.time; - var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); - var major = determineMajorUnit(minor); - var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize); - var weekday = minor === 'week' ? timeOpts.isoWeekday : false; - var majorTicksEnabled = options.ticks.major.enabled; - var interval = INTERVALS[minor]; - var first = moment(min); - var last = moment(max); - var ticks = []; - var time; - - if (!stepSize) { - stepSize = determineStepSize(min, max, minor, capacity); - } - - // For 'week' unit, handle the first day of week option - if (weekday) { - first = first.isoWeekday(weekday); - last = last.isoWeekday(weekday); - } - - // Align first/last ticks on unit - first = first.startOf(weekday ? 'day' : minor); - last = last.startOf(weekday ? 'day' : minor); - - // Make sure that the last tick include max - if (last < max) { - last.add(1, minor); - } - - time = moment(first); - - if (majorTicksEnabled && major && !weekday && !timeOpts.round) { - // Align the first tick on the previous `minor` unit aligned on the `major` unit: - // we first aligned time on the previous `major` unit then add the number of full - // stepSize there is between first and the previous major time. - time.startOf(major); - time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor); - } - - for (; time < last; time.add(stepSize, minor)) { - ticks.push(+time); - } - - ticks.push(+time); - - return ticks; - } - - /** - * Returns the right and left offsets from edges in the form of {left, right}. - * Offsets are added when the `offset` option is true. - */ - function computeOffsets(table, ticks, min, max, options) { - var left = 0; - var right = 0; - var upper, lower; - - if (options.offset && ticks.length) { - if (!options.time.min) { - upper = ticks.length > 1 ? ticks[1] : max; - lower = ticks[0]; - left = ( - interpolate(table, 'time', upper, 'pos') - - interpolate(table, 'time', lower, 'pos') - ) / 2; - } - if (!options.time.max) { - upper = ticks[ticks.length - 1]; - lower = ticks.length > 1 ? ticks[ticks.length - 2] : min; - right = ( - interpolate(table, 'time', upper, 'pos') - - interpolate(table, 'time', lower, 'pos') - ) / 2; - } - } - - return {left: left, right: right}; - } - - function ticksFromTimestamps(values, majorUnit) { - var ticks = []; - var i, ilen, value, major; - - for (i = 0, ilen = values.length; i < ilen; ++i) { - value = values[i]; - major = majorUnit ? value === +moment(value).startOf(majorUnit) : false; - - ticks.push({ - value: value, - major: major - }); - } - - return ticks; - } - - module.exports = function (Chart) { - - var defaultConfig = { - position: 'bottom', - - /** - * Data distribution along the scale: - * - 'linear': data are spread according to their time (distances can vary), - * - 'series': data are spread at the same distance from each other. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - distribution: 'linear', - - /** - * Scale boundary strategy (bypassed by min/max time options) - * - `data`: make sure data are fully visible, ticks outside are removed - * - `ticks`: make sure ticks are fully visible, data outside are truncated - * @see https://github.com/chartjs/Chart.js/pull/4556 - * @since 2.7.0 - */ - bounds: 'data', - - time: { - parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment - format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/ - unit: false, // false == automatic or override with week, month, year, etc. - round: false, // none, or override with week, month, year, etc. - displayFormat: false, // DEPRECATED - isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/ - minUnit: 'millisecond', - - // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/ - displayFormats: { - millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM, - second: 'h:mm:ss a', // 11:20:01 AM - minute: 'h:mm a', // 11:20 AM - hour: 'hA', // 5PM - day: 'MMM D', // Sep 4 - week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? - month: 'MMM YYYY', // Sept 2015 - quarter: '[Q]Q - YYYY', // Q3 - year: 'YYYY' // 2015 - }, - }, - ticks: { - autoSkip: false, - - /** - * Ticks generation input values: - * - 'auto': generates "optimal" ticks based on scale size and time options. - * - 'data': generates ticks from data (including labels from data {t|x|y} objects). - * - 'labels': generates ticks from user given `data.labels` values ONLY. - * @see https://github.com/chartjs/Chart.js/pull/4507 - * @since 2.7.0 - */ - source: 'auto', - - major: { - enabled: false - } - } - }; - - var TimeScale = Chart.Scale.extend({ - initialize: function () { - if (!moment) { - throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com'); - } - - this.mergeTicksOptions(); - - Chart.Scale.prototype.initialize.call(this); - }, - - update: function () { - var me = this; - var options = me.options; - - // DEPRECATIONS: output a message only one time per update - if (options.time && options.time.format) { - console.warn('options.time.format is deprecated and replaced by options.time.parser.'); - } - - return Chart.Scale.prototype.update.apply(me, arguments); - }, - - /** - * Allows data to be referenced via 't' attribute - */ - getRightValue: function (rawValue) { - if (rawValue && rawValue.t !== undefined) { - rawValue = rawValue.t; - } - return Chart.Scale.prototype.getRightValue.call(this, rawValue); - }, - - determineDataLimits: function () { - var me = this; - var chart = me.chart; - var timeOpts = me.options.time; - var min = MAX_INTEGER; - var max = MIN_INTEGER; - var timestamps = []; - var datasets = []; - var labels = []; - var i, j, ilen, jlen, data, timestamp; - - // Convert labels to timestamps - for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) { - labels.push(parse(chart.data.labels[i], me)); - } - - // Convert data to timestamps - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - data = chart.data.datasets[i].data; - - // Let's consider that all data have the same format. - if (helpers.isObject(data[0])) { - datasets[i] = []; - - for (j = 0, jlen = data.length; j < jlen; ++j) { - timestamp = parse(data[j], me); - timestamps.push(timestamp); - datasets[i][j] = timestamp; - } - } else { - timestamps.push.apply(timestamps, labels); - datasets[i] = labels.slice(0); - } - } else { - datasets[i] = []; - } - } - - if (labels.length) { - // Sort labels **after** data have been converted - labels = arrayUnique(labels).sort(sorter); - min = Math.min(min, labels[0]); - max = Math.max(max, labels[labels.length - 1]); - } - - if (timestamps.length) { - timestamps = arrayUnique(timestamps).sort(sorter); - min = Math.min(min, timestamps[0]); - max = Math.max(max, timestamps[timestamps.length - 1]); - } - - min = parse(timeOpts.min, me) || min; - max = parse(timeOpts.max, me) || max; - - // In case there is no valid min/max, let's use today limits - min = min === MAX_INTEGER ? +moment().startOf('day') : min; - max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max; - - // Make sure that max is strictly higher than min (required by the lookup table) - me.min = Math.min(min, max); - me.max = Math.max(min + 1, max); - - // PRIVATE - me._horizontal = me.isHorizontal(); - me._table = []; - me._timestamps = { - data: timestamps, - datasets: datasets, - labels: labels - }; - }, - - buildTicks: function () { - var me = this; - var min = me.min; - var max = me.max; - var options = me.options; - var timeOpts = options.time; - var timestamps = []; - var ticks = []; - var i, ilen, timestamp; - - switch (options.ticks.source) { - case 'data': - timestamps = me._timestamps.data; - break; - case 'labels': - timestamps = me._timestamps.labels; - break; - case 'auto': - default: - timestamps = generate(min, max, me.getLabelCapacity(min), options); - } - - if (options.bounds === 'ticks' && timestamps.length) { - min = timestamps[0]; - max = timestamps[timestamps.length - 1]; - } - - // Enforce limits with user min/max options - min = parse(timeOpts.min, me) || min; - max = parse(timeOpts.max, me) || max; - - // Remove ticks outside the min/max range - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - timestamp = timestamps[i]; - if (timestamp >= min && timestamp <= max) { - ticks.push(timestamp); - } - } - - me.min = min; - me.max = max; - - // PRIVATE - me._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max); - me._majorUnit = determineMajorUnit(me._unit); - me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); - me._offsets = computeOffsets(me._table, ticks, min, max, options); - - return ticksFromTimestamps(ticks, me._majorUnit); - }, - - getLabelForIndex: function (index, datasetIndex) { - var me = this; - var data = me.chart.data; - var timeOpts = me.options.time; - var label = data.labels && index < data.labels.length ? data.labels[index] : ''; - var value = data.datasets[datasetIndex].data[index]; - - if (helpers.isObject(value)) { - label = me.getRightValue(value); - } - if (timeOpts.tooltipFormat) { - label = momentify(label, timeOpts).format(timeOpts.tooltipFormat); - } - - return label; - }, - - /** - * Function to format an individual tick mark - * @private - */ - tickFormatFunction: function (tick, index, ticks, formatOverride) { - var me = this; - var options = me.options; - var time = tick.valueOf(); - var formats = options.time.displayFormats; - var minorFormat = formats[me._unit]; - var majorUnit = me._majorUnit; - var majorFormat = formats[majorUnit]; - var majorTime = tick.clone().startOf(majorUnit).valueOf(); - var majorTickOpts = options.ticks.major; - var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; - var label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat); - var tickOpts = major ? majorTickOpts : options.ticks.minor; - var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback); - - return formatter ? formatter(label, index, ticks) : label; - }, - - convertTicksToLabels: function (ticks) { - var labels = []; - var i, ilen; - - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks)); - } - - return labels; - }, - - /** - * @private - */ - getPixelForOffset: function (time) { - var me = this; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? me.left : me.top; - var pos = interpolate(me._table, 'time', time, 'pos'); - - return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right); - }, - - getPixelForValue: function (value, index, datasetIndex) { - var me = this; - var time = null; - - if (index !== undefined && datasetIndex !== undefined) { - time = me._timestamps.datasets[datasetIndex][index]; - } - - if (time === null) { - time = parse(value, me); - } - - if (time !== null) { - return me.getPixelForOffset(time); - } - }, - - getPixelForTick: function (index) { - var ticks = this.getTicks(); - return index >= 0 && index < ticks.length ? - this.getPixelForOffset(ticks[index].value) : - null; - }, - - getValueForPixel: function (pixel) { - var me = this; - var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? me.left : me.top; - var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right; - var time = interpolate(me._table, 'pos', pos, 'time'); - - return moment(time); - }, - - /** - * Crude approximation of what the label width might be - * @private - */ - getLabelWidth: function (label) { - var me = this; - var ticksOpts = me.options.ticks; - var tickLabelWidth = me.ctx.measureText(label).width; - var angle = helpers.toRadians(ticksOpts.maxRotation); - var cosRotation = Math.cos(angle); - var sinRotation = Math.sin(angle); - var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize); - - return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); - }, - - /** - * @private - */ - getLabelCapacity: function (exampleTime) { - var me = this; - - var formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation - - var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride); - var tickLabelWidth = me.getLabelWidth(exampleLabel); - var innerWidth = me.isHorizontal() ? me.width : me.height; - - return Math.floor(innerWidth / tickLabelWidth); - } - }); - - Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig); - }; - - }, {"25": 25, "45": 45, "6": 6}] - }, {}, [7])(7) -}); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.min.js b/src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.min.js deleted file mode 100644 index f832ef4e8..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/chart/chartjs/resources.js/Chart.bundle.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Chart.js - * http://chartjs.org/ - * Version: 2.7.1 - * - * Copyright 2017 Nick Downie - * Released under the MIT license - * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md - */ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(o,s){if(!n[o]){if(!e[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);var u=new Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[o]={exports:{}};e[o][0].call(d.exports,function(t){var n=e[o][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[o].exports}for(var r="function"==typeof require&&require,o=0;on?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,r=2*a-1,o=n.alpha()-i.alpha(),s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*n.red()+l*i.red(),s*n.green()+l*i.green(),s*n.blue()+l*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new r,i=this.values,a=n.values;for(var o in i)i.hasOwnProperty(o)&&(t=i[o],"[object Array]"===(e={}.toString.call(t))?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return n}},r.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},r.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},r.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),r=a[0],o=a[1],s=a[2];return r/=95.047,o/=100,s/=108.883,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*o-16,n=500*(r-o),i=200*(o-s),[e,n,i]}function c(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return r=255*l,[r,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r)),i=255*i;switch(a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}}function f(t){var e,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),e=Math.floor(6*o),n=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),a=s+i*(n-s),e){default:case 6:case 0:r=n,g=a,b=s;break;case 1:r=a,g=n,b=s;break;case 2:r=s,g=n,b=a;break;case 3:r=s,g=a,b=n;break;case 4:r=a,g=s,b=n;break;case 5:r=n,g=s,b=a}return[255*r,255*g,255*b]}function m(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100,s=t[3]/100;return e=1-Math.min(1,a*(1-s)+s),n=1-Math.min(1,r*(1-s)+s),i=1-Math.min(1,o*(1-s)+s),[255*e,255*n,255*i]}function p(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return e=3.2406*a+-1.5372*r+-.4986*o,n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0],r=t[1],o=t[2];return a/=95.047,r/=100,o/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,e=116*r-16,n=500*(a-r),i=200*(r-o),[e,n,i]}function y(t){var e,n,i,a,r=t[0],o=t[1],s=t[2];return r<=8?a=(n=100*r/903.3)/100*7.787+16/116:(n=100*Math.pow((r+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i=i/108.883<=.008859?i=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3),[e,n,i]}function x(t){var e,n,i,a=t[0],r=t[1],o=t[2];return e=Math.atan2(o,r),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(r*r+o*o),[a,i,n]}function _(t){return p(y(t))}function k(t){var e,n,i,a=t[0],r=t[1];return i=t[2]/360*2*Math.PI,e=r*Math.cos(i),n=r*Math.sin(i),[a,e,n]}function w(t){return M[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return 0===r?[0,0,0]:(r*=2,a*=r<=1?r:2-r,n=(r+a)/2,e=2*a/(r+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return s(c(t))},hsl2keyword:function(t){return l(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return n=(2-a)*r,e=a*r,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return s(h(t))},hsv2keyword:function(t){return l(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return s(f(t))},hwb2keyword:function(t){return l(f(t))},cmyk2rgb:m,cmyk2hsl:function(t){return i(m(t))},cmyk2hsv:function(t){return a(m(t))},cmyk2hwb:function(t){return o(m(t))},cmyk2keyword:function(t){return l(m(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return a(w(t))},keyword2hwb:function(t){return o(w(t))},keyword2cmyk:function(t){return s(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return u(w(t))},xyz2rgb:p,xyz2lab:v,xyz2lch:function(t){return x(v(t))},lab2xyz:y,lab2rgb:_,lab2lch:x,lch2lab:k,lch2xyz:function(t){return y(k(t))},lch2rgb:function(t){return _(k(t))}};var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},S={};for(var D in M)S[JSON.stringify(M[D])]=D},{}],4:[function(t,e,n){var i=t(3),a=function(){return new u};for(var r in i){a[r+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(r);var o=/(\w+)2(\w+)/.exec(r),s=o[1],l=o[2];(a[s]=a[s]||{})[l]=a[r]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}function N(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(Re[t]=a),e&&(Re[e[0]]=function(){return Y(a.apply(this,arguments),e[1],e[2])}),n&&(Re[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function z(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function B(t){var e,n,i=t.match(Ie);for(e=0,n=i.length;e=0&&Oe.test(t);)t=t.replace(Oe,function(t){return e.longDateFormat(t)||t}),Oe.lastIndex=0,n-=1;return t}function E(t,e,n){Ke[t]=D(e)?e:function(t,i){return t&&n?n:e}}function j(t,e){return d(Ke,t)?Ke[t](e._strict,e._locale):new RegExp(U(t))}function U(t){return q(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,a){return e||n||i||a}))}function q(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function G(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),s(e)&&(i=function(t,n){n[e]=_(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function at(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function rt(t,e,n){var i=7+e-n;return-((7+at(t,0,i).getUTCDay()-e)%7)+i-1}function ot(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+rt(t,i,a);return s<=0?o=et(r=t-1)+s:s>et(t)?(r=t+1,o=s-et(t)):(r=t,o=s),{year:r,dayOfYear:o}}function st(t,e,n){var i,a,r=rt(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+lt(a=t.year()-1,e,n):o>lt(t.year(),e,n)?(i=o-lt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function lt(t,e,n){var i=rt(t,e,n),a=rt(t+1,e,n);return(et(t)-i+a)/7}function ut(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}function dt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function ct(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=h([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(a=un.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=un.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._shortWeekdaysParse,o))?a:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=un.call(this._shortWeekdaysParse,o))?a:-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._minWeekdaysParse,o))?a:null:-1!==(a=un.call(this._minWeekdaysParse,o))?a:-1!==(a=un.call(this._weekdaysParse,o))?a:-1!==(a=un.call(this._shortWeekdaysParse,o))?a:null}function ht(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=h([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=q(s[e]),l[e]=q(l[e]),u[e]=q(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function ft(){return this.hours()%12||12}function gt(t,e){N(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function mt(t,e){return e._meridiemParse}function pt(t){return t?t.toLowerCase().replace("_","-"):t}function vt(t){for(var e,n,i,a,r=0;r0;){if(i=yt(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&k(a,n,!0)>=e-1)break;e--}r++}return null}function yt(n){var i=null;if(!Sn[n]&&void 0!==e&&e&&e.exports)try{i=kn._abbr,t("./locale/"+n),bt(i)}catch(t){}return Sn[n]}function bt(t,e){var n;return t&&(n=o(e)?_t(t):xt(t,e))&&(kn=n),kn._abbr}function xt(t,e){if(null!==e){var n=Mn;if(e.abbr=t,null!=Sn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Sn[t]._config;else if(null!=e.parentLocale){if(null==Sn[e.parentLocale])return Dn[e.parentLocale]||(Dn[e.parentLocale]=[]),Dn[e.parentLocale].push({name:t,config:e}),null;n=Sn[e.parentLocale]._config}return Sn[t]=new P(C(n,e)),Dn[t]&&Dn[t].forEach(function(t){xt(t.name,t.config)}),bt(t),Sn[t]}return delete Sn[t],null}function _t(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return kn;if(!i(t)){if(e=yt(t))return e;t=[t]}return vt(t)}function kt(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[tn]<0||n[tn]>11?tn:n[en]<1||n[en]>J(n[$e],n[tn])?en:n[nn]<0||n[nn]>24||24===n[nn]&&(0!==n[an]||0!==n[rn]||0!==n[on])?nn:n[an]<0||n[an]>59?an:n[rn]<0||n[rn]>59?rn:n[on]<0||n[on]>999?on:-1,g(t)._overflowDayOfYear&&(e<$e||e>en)&&(e=en),g(t)._overflowWeeks&&-1===e&&(e=sn),g(t)._overflowWeekday&&-1===e&&(e=ln),g(t).overflow=e),t}function wt(t){var e,n,i,a,r,o,s=t._i,l=Cn.exec(s)||Pn.exec(s);if(l){for(g(t).iso=!0,e=0,n=An.length;e10?"YYYY ":"YY "),r="HH:mm"+(n[4]?":ss":""),n[1]){var d=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date(n[2]).getDay()];if(n[1].substr(0,3)!==d)return g(t).weekdayMismatch=!0,void(t._isValid=!1)}switch(n[5].length){case 2:s=0===l?" +0000":((l="YXWVUTSRQPONZABCDEFGHIKLM".indexOf(n[5][1].toUpperCase())-12)<0?" -":" +")+(""+l).replace(/^-?/,"0").match(/..$/)[0]+"00";break;case 4:s=u[n[5]];break;default:s=u[" GMT"]}n[5]=s,t._i=n.splice(1).join(""),o=" ZZ",t._f=i+a+r+o,At(t),g(t).rfc2822=!0}else t._isValid=!1}function St(t){var e=On.exec(t._i);null===e?(wt(t),!1===t._isValid&&(delete t._isValid,Mt(t),!1===t._isValid&&(delete t._isValid,n.createFromInputFallback(t)))):t._d=new Date(+e[1])}function Dt(t,e,n){return null!=t?t:null!=e?e:n}function Ct(t){var e=new Date(n.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Pt(t){var e,n,i,a,r=[];if(!t._d){for(i=Ct(t),t._w&&null==t._a[en]&&null==t._a[tn]&&Tt(t),null!=t._dayOfYear&&(a=Dt(t._a[$e],i[$e]),(t._dayOfYear>et(a)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=at(a,0,t._dayOfYear),t._a[tn]=n.getUTCMonth(),t._a[en]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=r[e]=i[e];for(;e<7;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[nn]&&0===t._a[an]&&0===t._a[rn]&&0===t._a[on]&&(t._nextDay=!0,t._a[nn]=0),t._d=(t._useUTC?at:it).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[nn]=24)}}function Tt(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=Dt(e.GG,t._a[$e],st(Nt(),1,4).year),i=Dt(e.W,1),((a=Dt(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=st(Nt(),r,o);n=Dt(e.gg,t._a[$e],u.year),i=Dt(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>lt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=ot(n,i,a,r,o),t._a[$e]=s.year,t._dayOfYear=s.dayOfYear)}function At(t){if(t._f!==n.ISO_8601)if(t._f!==n.RFC_2822){t._a=[],g(t).empty=!0;var e,i,a,r,o,s=""+t._i,l=s.length,u=0;for(a=H(t._f,t._locale).match(Ie)||[],e=0;e0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(i)+i.length),u+=i.length),Re[r]?(i?g(t).empty=!1:g(t).unusedTokens.push(r),X(r,i,t)):t._strict&&!i&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[nn]<=12&&!0===g(t).bigHour&&t._a[nn]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[nn]=It(t._locale,t._a[nn],t._meridiem),Pt(t),kt(t)}else Mt(t);else wt(t)}function It(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function Ot(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;ar&&(e=r),oe.call(this,t,e,n,i,a))}function oe(t,e,n,i,a){var r=ot(t,e,n,i,a),o=at(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function se(t){return t}function le(t,e,n,i){var a=_t(),r=h().set(i,e);return a[n](r,t)}function ue(t,e,n){if(s(t)&&(e=t,t=void 0),t=t||"",null!=e)return le(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=le(t,i,n,"month");return a}function de(t,e,n,i){"boolean"==typeof t?(s(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,s(e)&&(n=e,e=void 0),e=e||"");var a=_t(),r=t?a._week.dow:0;if(null!=n)return le(e,(n+r)%7,i,"day");var o,l=[];for(o=0;o<7;o++)l[o]=le(e,(o+r)%7,i,"day");return l}function ce(t,e,n,i){var a=Xt(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function he(t){return t<0?Math.floor(t):Math.ceil(t)}function fe(t){return 4800*t/146097}function ge(t){return 146097*t/4800}function me(t){return function(){return this.as(t)}}function pe(t){return function(){return this.isValid()?this._data[t]:NaN}}function ve(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function ye(t,e,n){var i=Xt(t).abs(),a=hi(i.as("s")),r=hi(i.as("m")),o=hi(i.as("h")),s=hi(i.as("d")),l=hi(i.as("M")),u=hi(i.as("y")),d=a<=fi.ss&&["s",a]||a0,d[4]=n,ve.apply(null,d)}function be(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=gi(this._milliseconds)/1e3,a=gi(this._days),r=gi(this._months);e=x((t=x(i/60))/60),i%=60,t%=60;var o=n=x(r/12),s=r%=12,l=a,u=e,d=t,c=i,h=this.asSeconds();return h?(h<0?"-":"")+"P"+(o?o+"Y":"")+(s?s+"M":"")+(l?l+"D":"")+(u||d||c?"T":"")+(u?u+"H":"")+(d?d+"M":"")+(c?c+"S":""):"P0D"}var xe,_e,ke=_e=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var mn=R("FullYear",!0);N("w",["ww",2],"wo","week"),N("W",["WW",2],"Wo","isoWeek"),T("week","w"),T("isoWeek","W"),O("week",5),O("isoWeek",5),E("w",Be),E("ww",Be,We),E("W",Be),E("WW",Be,We),Z(["w","ww","W","WW"],function(t,e,n,i){e[i.substr(0,1)]=_(t)});N("d",0,"do","day"),N("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),N("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),N("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),N("e",0,0,"weekday"),N("E",0,0,"isoWeekday"),T("day","d"),T("weekday","e"),T("isoWeekday","E"),O("day",11),O("weekday",11),O("isoWeekday",11),E("d",Be),E("e",Be),E("E",Be),E("dd",function(t,e){return e.weekdaysMinRegex(t)}),E("ddd",function(t,e){return e.weekdaysShortRegex(t)}),E("dddd",function(t,e){return e.weekdaysRegex(t)}),Z(["dd","ddd","dddd"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t}),Z(["d","e","E"],function(t,e,n,i){e[i]=_(t)});var pn="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),vn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),yn="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),bn=Je,xn=Je,_n=Je;N("H",["HH",2],0,"hour"),N("h",["hh",2],0,ft),N("k",["kk",2],0,function(){return this.hours()||24}),N("hmm",0,0,function(){return""+ft.apply(this)+Y(this.minutes(),2)}),N("hmmss",0,0,function(){return""+ft.apply(this)+Y(this.minutes(),2)+Y(this.seconds(),2)}),N("Hmm",0,0,function(){return""+this.hours()+Y(this.minutes(),2)}),N("Hmmss",0,0,function(){return""+this.hours()+Y(this.minutes(),2)+Y(this.seconds(),2)}),gt("a",!0),gt("A",!1),T("hour","h"),O("hour",13),E("a",mt),E("A",mt),E("H",Be),E("h",Be),E("k",Be),E("HH",Be,We),E("hh",Be,We),E("kk",Be,We),E("hmm",Ve),E("hmmss",He),E("Hmm",Ve),E("Hmmss",He),G(["H","HH"],nn),G(["k","kk"],function(t,e,n){var i=_(t);e[nn]=24===i?0:i}),G(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),G(["h","hh"],function(t,e,n){e[nn]=_(t),g(n).bigHour=!0}),G("hmm",function(t,e,n){var i=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i)),g(n).bigHour=!0}),G("hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i,2)),e[rn]=_(t.substr(a)),g(n).bigHour=!0}),G("Hmm",function(t,e,n){var i=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i))}),G("Hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[nn]=_(t.substr(0,i)),e[an]=_(t.substr(i,2)),e[rn]=_(t.substr(a))});var kn,wn=R("Hours",!0),Mn={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:cn,monthsShort:hn,week:{dow:0,doy:6},weekdays:pn,weekdaysMin:yn,weekdaysShort:vn,meridiemParse:/[ap]\.?m?\.?/i},Sn={},Dn={},Cn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Pn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Tn=/Z|[+-]\d\d(?::?\d\d)?/,An=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],In=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],On=/^\/?Date\((\-?\d+)/i,Fn=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;n.createFromInputFallback=M("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),n.ISO_8601=function(){},n.RFC_2822=function(){};var Rn=M("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=Nt.apply(null,arguments);return this.isValid()&&t.isValid()?tthis?this:t:p()}),Wn=["year","quarter","month","week","day","hour","minute","second","millisecond"];jt("Z",":"),jt("ZZ",""),E("Z",Xe),E("ZZ",Xe),G(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Ut(Xe,t)});var Yn=/([\+\-]|\d\d)/gi;n.updateOffset=function(){};var Nn=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,zn=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Xt.fn=Vt.prototype,Xt.invalid=function(){return Xt(NaN)};var Bn=$t(1,"add"),Vn=$t(-1,"subtract");n.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",n.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Hn=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});N(0,["gg",2],0,function(){return this.weekYear()%100}),N(0,["GG",2],0,function(){return this.isoWeekYear()%100}),ae("gggg","weekYear"),ae("ggggg","weekYear"),ae("GGGG","isoWeekYear"),ae("GGGGG","isoWeekYear"),T("weekYear","gg"),T("isoWeekYear","GG"),O("weekYear",1),O("isoWeekYear",1),E("G",Ge),E("g",Ge),E("GG",Be,We),E("gg",Be,We),E("GGGG",je,Ne),E("gggg",je,Ne),E("GGGGG",Ue,ze),E("ggggg",Ue,ze),Z(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=_(t)}),Z(["gg","GG"],function(t,e,i,a){e[a]=n.parseTwoDigitYear(t)}),N("Q",0,"Qo","quarter"),T("quarter","Q"),O("quarter",7),E("Q",Le),G("Q",function(t,e){e[tn]=3*(_(t)-1)}),N("D",["DD",2],"Do","date"),T("date","D"),O("date",9),E("D",Be),E("DD",Be,We),E("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),G(["D","DD"],en),G("Do",function(t,e){e[en]=_(t.match(Be)[0],10)});var En=R("Date",!0);N("DDD",["DDDD",3],"DDDo","dayOfYear"),T("dayOfYear","DDD"),O("dayOfYear",4),E("DDD",Ee),E("DDDD",Ye),G(["DDD","DDDD"],function(t,e,n){n._dayOfYear=_(t)}),N("m",["mm",2],0,"minute"),T("minute","m"),O("minute",14),E("m",Be),E("mm",Be,We),G(["m","mm"],an);var jn=R("Minutes",!1);N("s",["ss",2],0,"second"),T("second","s"),O("second",15),E("s",Be),E("ss",Be,We),G(["s","ss"],rn);var Un=R("Seconds",!1);N("S",0,0,function(){return~~(this.millisecond()/100)}),N(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),N(0,["SSS",3],0,"millisecond"),N(0,["SSSS",4],0,function(){return 10*this.millisecond()}),N(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),N(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),N(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),N(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),N(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),T("millisecond","ms"),O("millisecond",16),E("S",Ee,Le),E("SS",Ee,We),E("SSS",Ee,Ye);var qn;for(qn="SSSS";qn.length<=9;qn+="S")E(qn,qe);for(qn="S";qn.length<=9;qn+="S")G(qn,function(t,e){e[on]=_(1e3*("0."+t))});var Gn=R("Milliseconds",!1);N("z",0,0,"zoneAbbr"),N("zz",0,0,"zoneName");var Zn=y.prototype;Zn.add=Bn,Zn.calendar=function(t,e){var i=t||Nt(),a=qt(i,this).startOf("day"),r=n.calendarFormat(this,a)||"sameElse",o=e&&(D(e[r])?e[r].call(this,i):e[r]);return this.format(o||this.localeData().calendar(r,this,Nt(i)))},Zn.clone=function(){return new y(this)},Zn.diff=function(t,e,n){var i,a,r,o;return this.isValid()&&(i=qt(t,this)).isValid()?(a=6e4*(i.utcOffset()-this.utcOffset()),"year"===(e=A(e))||"month"===e||"quarter"===e?(o=ee(this,i),"quarter"===e?o/=3:"year"===e&&(o/=12)):(r=this-i,o="second"===e?r/1e3:"minute"===e?r/6e4:"hour"===e?r/36e5:"day"===e?(r-a)/864e5:"week"===e?(r-a)/6048e5:r),n?o:x(o)):NaN},Zn.endOf=function(t){return void 0===(t=A(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))},Zn.format=function(t){t||(t=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var e=V(this,t);return this.localeData().postformat(e)},Zn.from=function(t,e){return this.isValid()&&(b(t)&&t.isValid()||Nt(t).isValid())?Xt({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Zn.fromNow=function(t){return this.from(Nt(),t)},Zn.to=function(t,e){return this.isValid()&&(b(t)&&t.isValid()||Nt(t).isValid())?Xt({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Zn.toNow=function(t){return this.to(Nt(),t)},Zn.get=function(t){return t=A(t),D(this[t])?this[t]():this},Zn.invalidAt=function(){return g(this).overflow},Zn.isAfter=function(t,e){var n=b(t)?t:Nt(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=A(o(e)?"millisecond":e))?this.valueOf()>n.valueOf():n.valueOf()9999?V(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():V(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},Zn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a=e+'[")]';return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+a)},Zn.toJSON=function(){return this.isValid()?this.toISOString():null},Zn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Zn.unix=function(){return Math.floor(this.valueOf()/1e3)},Zn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Zn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Zn.year=mn,Zn.isLeapYear=function(){return nt(this.year())},Zn.weekYear=function(t){return re.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Zn.isoWeekYear=function(t){return re.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Zn.quarter=Zn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Zn.month=$,Zn.daysInMonth=function(){return J(this.year(),this.month())},Zn.week=Zn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Zn.isoWeek=Zn.isoWeeks=function(t){var e=st(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Zn.weeksInYear=function(){var t=this.localeData()._week;return lt(this.year(),t.dow,t.doy)},Zn.isoWeeksInYear=function(){return lt(this.year(),1,4)},Zn.date=En,Zn.day=Zn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=ut(t,this.localeData()),this.add(t-e,"d")):e},Zn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Zn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=dt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Zn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Zn.hour=Zn.hours=wn,Zn.minute=Zn.minutes=jn,Zn.second=Zn.seconds=Un,Zn.millisecond=Zn.milliseconds=Gn,Zn.utcOffset=function(t,e,i){var a,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Ut(Xe,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(a=Gt(this)),this._offset=t,this._isUTC=!0,null!=a&&this.add(a,"m"),r!==t&&(!e||this._changeInProgress?te(this,Xt(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,n.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Gt(this)},Zn.utc=function(t){return this.utcOffset(0,t)},Zn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Gt(this),"m")),this},Zn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Ut(Ze,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Zn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Nt(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Zn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Zn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Zn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Zn.isUtc=Zt,Zn.isUTC=Zt,Zn.zoneAbbr=function(){return this._isUTC?"UTC":""},Zn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Zn.dates=M("dates accessor is deprecated. Use date instead.",En),Zn.months=M("months accessor is deprecated. Use month instead",$),Zn.years=M("years accessor is deprecated. Use year instead",mn),Zn.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),Zn.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),(t=Lt(t))._a){var e=t._isUTC?h(t._a):Nt(t._a);this._isDSTShifted=this.isValid()&&k(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var Xn=P.prototype;Xn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return D(i)?i.call(e,n):i},Xn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},Xn.invalidDate=function(){return this._invalidDate},Xn.ordinal=function(t){return this._ordinal.replace("%d",t)},Xn.preparse=se,Xn.postformat=se,Xn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return D(a)?a(t,e,n,i):a.replace(/%d/i,t)},Xn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return D(n)?n(e):n.replace(/%s/i,e)},Xn.set=function(t){var e,n;for(n in t)D(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Xn.months=function(t,e){return t?i(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||dn).test(e)?"format":"standalone"][t.month()]:i(this._months)?this._months:this._months.standalone},Xn.monthsShort=function(t,e){return t?i(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[dn.test(e)?"format":"standalone"][t.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Xn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return K.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=h([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Xn.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||tt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=gn),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Xn.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||tt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=fn),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Xn.week=function(t){return st(t,this._week.dow,this._week.doy).week},Xn.firstDayOfYear=function(){return this._week.doy},Xn.firstDayOfWeek=function(){return this._week.dow},Xn.weekdays=function(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone},Xn.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},Xn.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},Xn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return ct.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=h([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Xn.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||ht.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=bn),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Xn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||ht.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=xn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Xn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||ht.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=_n),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Xn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},Xn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},bt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),n.lang=M("moment.lang is deprecated. Use moment.locale instead.",bt),n.langData=M("moment.langData is deprecated. Use moment.localeData instead.",_t);var Jn=Math.abs,Kn=me("ms"),Qn=me("s"),$n=me("m"),ti=me("h"),ei=me("d"),ni=me("w"),ii=me("M"),ai=me("y"),ri=pe("milliseconds"),oi=pe("seconds"),si=pe("minutes"),li=pe("hours"),ui=pe("days"),di=pe("months"),ci=pe("years"),hi=Math.round,fi={ss:44,s:45,m:45,h:22,d:26,M:11},gi=Math.abs,mi=Vt.prototype;return mi.isValid=function(){return this._isValid},mi.abs=function(){var t=this._data;return this._milliseconds=Jn(this._milliseconds),this._days=Jn(this._days),this._months=Jn(this._months),t.milliseconds=Jn(t.milliseconds),t.seconds=Jn(t.seconds),t.minutes=Jn(t.minutes),t.hours=Jn(t.hours),t.months=Jn(t.months),t.years=Jn(t.years),this},mi.add=function(t,e){return ce(this,t,e,1)},mi.subtract=function(t,e){return ce(this,t,e,-1)},mi.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=A(t))||"year"===t)return e=this._days+i/864e5,n=this._months+fe(e),"month"===t?n:n/12;switch(e=this._days+Math.round(ge(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},mi.asMilliseconds=Kn,mi.asSeconds=Qn,mi.asMinutes=$n,mi.asHours=ti,mi.asDays=ei,mi.asWeeks=ni,mi.asMonths=ii,mi.asYears=ai,mi.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN},mi._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*he(ge(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=x(r/1e3),l.seconds=t%60,e=x(t/60),l.minutes=e%60,n=x(e/60),l.hours=n%24,o+=x(n/24),a=x(fe(o)),s+=a,o-=he(ge(a)),i=x(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},mi.get=function(t){return t=A(t),this.isValid()?this[t+"s"]():NaN},mi.milliseconds=ri,mi.seconds=oi,mi.minutes=si,mi.hours=li,mi.days=ui,mi.weeks=function(){return x(this.days()/7)},mi.months=di,mi.years=ci,mi.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=ye(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},mi.toISOString=be,mi.toString=be,mi.toJSON=be,mi.locale=ne,mi.localeData=ie,mi.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",be),mi.lang=Hn,N("X",0,0,"unix"),N("x",0,0,"valueOf"),E("x",Ge),E("X",/[+-]?\d+(\.\d{1,3})?/),G("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),G("x",function(t,e,n){n._d=new Date(_(t))}),n.version="2.18.1",function(t){xe=t}(Nt),n.fn=Zn,n.min=function(){return zt("isBefore",[].slice.call(arguments,0))},n.max=function(){return zt("isAfter",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=h,n.unix=function(t){return Nt(1e3*t)},n.months=function(t,e){return ue(t,e,"months")},n.isDate=l,n.locale=bt,n.invalid=p,n.duration=Xt,n.isMoment=b,n.weekdays=function(t,e,n){return de(t,e,n,"weekdays")},n.parseZone=function(){return Nt.apply(null,arguments).parseZone()},n.localeData=_t,n.isDuration=Ht,n.monthsShort=function(t,e){return ue(t,e,"monthsShort")},n.weekdaysMin=function(t,e,n){return de(t,e,n,"weekdaysMin")},n.defineLocale=xt,n.updateLocale=function(t,e){if(null!=e){var n,i=Mn;null!=Sn[t]&&(i=Sn[t]._config),(n=new P(e=C(i,e))).parentLocale=Sn[t],Sn[t]=n,bt(t)}else null!=Sn[t]&&(null!=Sn[t].parentLocale?Sn[t]=Sn[t].parentLocale:null!=Sn[t]&&delete Sn[t]);return Sn[t]},n.locales=function(){return Pe(Sn)},n.weekdaysShort=function(t,e,n){return de(t,e,n,"weekdaysShort")},n.normalizeUnits=A,n.relativeTimeRounding=function(t){return void 0===t?hi:"function"==typeof t&&(hi=t,!0)},n.relativeTimeThreshold=function(t,e){return void 0!==fi[t]&&(void 0===e?fi[t]:(fi[t]=e,"s"===t&&(fi.ss=e-1),!0))},n.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},n.prototype=Zn,n})},{}],7:[function(t,e,n){var i=t(29)();i.helpers=t(45),t(27)(i),i.defaults=t(25),i.Element=t(26),i.elements=t(40),i.Interaction=t(28),i.platform=t(48),t(31)(i),t(22)(i),t(23)(i),t(24)(i),t(30)(i),t(33)(i),t(32)(i),t(35)(i),t(54)(i),t(52)(i),t(53)(i),t(55)(i),t(56)(i),t(57)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(21)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i);var a=[];a.push(t(49)(i),t(50)(i),t(51)(i)),i.plugins.register(a),i.platform.initialize(),e.exports=i,"undefined"!=typeof window&&(window.Chart=i),i.canvasHelpers=i.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(t,e,n){"use strict";e.exports=function(t){t.Bar=function(e,n){return n.type="bar",new t(e,n)}}},{}],9:[function(t,e,n){"use strict";e.exports=function(t){t.Bubble=function(e,n){return n.type="bubble",new t(e,n)}}},{}],10:[function(t,e,n){"use strict";e.exports=function(t){t.Doughnut=function(e,n){return n.type="doughnut",new t(e,n)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t){t.Line=function(e,n){return n.type="line",new t(e,n)}}},{}],12:[function(t,e,n){"use strict";e.exports=function(t){t.PolarArea=function(e,n){return n.type="polarArea",new t(e,n)}}},{}],13:[function(t,e,n){"use strict";e.exports=function(t){t.Radar=function(e,n){return n.type="radar",new t(e,n)}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t){t.Scatter=function(e,n){return n.type="scatter",new t(e,n)}}},{}],15:[function(t,e,n){"use strict";var i=t(25),a=t(40),r=t(45);i._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),i._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var n="";return t.length>0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index=0&&a>0)&&(p+=a));return r=c.getPixelForValue(p),o=c.getPixelForValue(p+f),s=(o-r)/2,{size:s,base:r,head:o,center:o+s/2}},calculateBarIndexPixels:function(t,e,n){var i,a,o,s,l,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],m=f.length,p=n.start,v=n.end;return 1===m?(i=g>p?g-p:v-g,a=g0&&(i=(g-f[e-1])/2,e===m-1&&(a=i)),e');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r'),a[r]&&e.push(a[r]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[i],l=s&&s.custom||{},u=r.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:u(o.backgroundColor,i,d.backgroundColor),strokeStyle:l.borderColor?l.borderColor:u(o.borderColor,i,d.borderColor),lineWidth:l.borderWidth?l.borderWidth:u(o.borderWidth,i,d.borderWidth),hidden:isNaN(o.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0))+f,p={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(m),y:Math.sin(m)},y=g<=0&&m>=0||g<=2*Math.PI&&2*Math.PI<=m,b=g<=.5*Math.PI&&.5*Math.PI<=m||g<=2.5*Math.PI&&2.5*Math.PI<=m,x=g<=-Math.PI&&-Math.PI<=m||g<=Math.PI&&Math.PI<=m,_=g<=.5*-Math.PI&&.5*-Math.PI<=m||g<=1.5*Math.PI&&1.5*Math.PI<=m,k=h/100,w={x:x?-1:Math.min(p.x*(p.x<0?1:k),v.x*(v.x<0?1:k)),y:_?-1:Math.min(p.y*(p.y<0?1:k),v.y*(v.y<0?1:k))},M={x:y?1:Math.max(p.x*(p.x>0?1:k),v.x*(v.x>0?1:k)),y:b?1:Math.max(p.y*(p.y>0?1:k),v.y*(v.y>0?1:k))},S={width:.5*(M.x-w.x),height:.5*(M.y-w.y)};u=Math.min(s/S.width,l/S.height),d={x:-.5*(M.x+w.x),y:-.5*(M.y+w.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),r.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,o=a.chartArea,s=a.options,l=s.animation,u=(o.left+o.right)/2,d=(o.top+o.bottom)/2,c=s.rotation,h=s.rotation,f=i.getDataset(),g=n&&l.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(s.circumference/(2*Math.PI)),m=n&&l.animateScale?0:i.innerRadius,p=n&&l.animateScale?0:i.outerRadius,v=r.valueAtIndexOrDefault;r.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:p,innerRadius:m,label:v(f.label,e,a.data.labels[e])}});var y=t._model;this.removeHoverStyle(t),n&&l.animateRotate||(y.startAngle=0===e?s.rotation:i.getMeta().data[e-1]._model.endAngle,y.endAngle=y.startAngle+y.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return r.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,r=t.length,o=0;o(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){"use strict";var i=t(25),a=t(40),r=t(45);i._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return r.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,o=this,s=o.getMeta(),l=s.dataset,u=s.data||[],d=o.chart.options,c=d.elements.line,h=o.getScaleForId(s.yAxisID),f=o.getDataset(),g=e(f,d);for(g&&(a=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=o.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:r.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:r.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:r.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},l.pivot()),n=0,i=u.length;n');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r'),a[r]&&e.push(a[r]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[i].custom||{},l=r.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:l(o.backgroundColor,i,u.backgroundColor),strokeStyle:s.borderColor?s.borderColor:l(o.borderColor,i,u.borderColor),lineWidth:s.borderWidth?s.borderWidth:l(o.borderWidth,i,u.borderWidth),hidden:isNaN(o.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){"use strict";var i=t(25),a=t(40),r=t(45);i._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:r.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,o=i.custom||{},s=e.getDataset(),l=e.chart.options.elements.line,u=e.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),r.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:o.tension?o.tension:r.valueOrDefault(s.lineTension,l.tension),backgroundColor:o.backgroundColor?o.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:s.borderWidth||l.borderWidth,borderColor:o.borderColor?o.borderColor:s.borderColor||l.borderColor,fill:o.fill?o.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:o.borderDash?o.borderDash:s.borderDash||l.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle}}),n.dataset.pivot(),r.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},o=i.getDataset(),s=i.chart.scale,l=i.chart.options.elements.point,u=s.getPointPositionForValue(e,o.data[e]);void 0!==o.radius&&void 0===o.pointRadius&&(o.pointRadius=o.radius),void 0!==o.hitRadius&&void 0===o.pointHitRadius&&(o.pointHitRadius=o.hitRadius),r.extend(t,{_datasetIndex:i.index,_index:e,_scale:s,_model:{x:n?s.xCenter:u.x,y:n?s.yCenter:u.y,tension:a.tension?a.tension:r.valueOrDefault(o.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:r.valueAtIndexOrDefault(o.pointRadius,e,l.radius),backgroundColor:a.backgroundColor?a.backgroundColor:r.valueAtIndexOrDefault(o.pointBackgroundColor,e,l.backgroundColor),borderColor:a.borderColor?a.borderColor:r.valueAtIndexOrDefault(o.pointBorderColor,e,l.borderColor),borderWidth:a.borderWidth?a.borderWidth:r.valueAtIndexOrDefault(o.pointBorderWidth,e,l.borderWidth),pointStyle:a.pointStyle?a.pointStyle:r.valueAtIndexOrDefault(o.pointStyle,e,l.pointStyle),hitRadius:a.hitRadius?a.hitRadius:r.valueAtIndexOrDefault(o.pointHitRadius,e,l.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();r.each(e.data,function(n,i){var a=n._model,o=r.splineCurve(r.previousItem(e.data,i,!0)._model,a,r.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(o.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(o.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(o.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(o.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:r.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,r.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:r.valueAtIndexOrDefault(e.pointHoverBorderColor,i,r.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:r.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,o=this.chart.options.elements.point;a.radius=n.radius?n.radius:r.valueAtIndexOrDefault(e.pointRadius,i,o.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:r.valueAtIndexOrDefault(e.pointBackgroundColor,i,o.backgroundColor),a.borderColor=n.borderColor?n.borderColor:r.valueAtIndexOrDefault(e.pointBorderColor,i,o.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:r.valueAtIndexOrDefault(e.pointBorderWidth,i,o.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){"use strict";var i=t(25),a=t(26),r=t(45);i._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:r.noop,onComplete:r.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,r=o.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a=e.numSteps?(r.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){"use strict";var i=t(25),a=t(45),r=t(28),o=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function s(t){return"top"===t||"bottom"===t}var l=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var r=this;i=e(i);var s=o.acquireContext(n,i),l=s&&s.canvas,u=l&&l.height,d=l&&l.width;r.id=a.uid(),r.ctx=s,r.canvas=l,r.config=i,r.width=d,r.height=u,r.aspectRatio=u?d/u:null,r.options=i.options,r._bufferedRender=!1,r.chart=r,r.controller=r,t.instances[r.id]=r,Object.defineProperty(r,"data",{get:function(){return r.config.data},set:function(t){r.config.data=t}}),s&&l?(r.initialize(),r.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return l.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),l.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,r=n.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(a.getMaximumWidth(i))),s=Math.max(0,Math.floor(r?o/r:a.getMaximumHeight(i)));if((e.width!==o||e.height!==s)&&(i.width=e.width=o,i.height=e.height=s,i.style.width=o+"px",i.style.height=s+"px",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:o,height:s};l.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,i=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&r.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(r,function(n){var r=n.options,o=a.valueOrDefault(r.type,n.dtype),l=t.scaleService.getScaleConstructor(o);if(l){s(r.position)!==s(n.dposition)&&(r.position=n.dposition);var u=new l({id:r.id,options:r,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,r){var o=e.getDatasetMeta(r),s=a.type||e.config.type;if(o.type&&o.type!==s&&(e.destroyDatasetMeta(r),o=e.getDatasetMeta(r)),o.type=s,n.push(o.type),o.controller)o.controller.updateIndex(r);else{var l=t.controllers[o.type];if(void 0===l)throw new Error('"'+o.type+'" is not a chart type.');o.controller=new l(e,r),i.push(o.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==l.notify(e,"beforeUpdate")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],l.notify(e,"afterUpdate"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==l.notify(e,"beforeLayout")&&(t.layoutService.update(this,this.width,this.height),l.notify(e,"afterScaleUpdate"),l.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==l.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);l.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==l.notify(n,"beforeDatasetDraw",[a])&&(i.controller.draw(e),l.notify(n,"afterDatasetDraw",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==l.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),l.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return r.modes.single(this,t)},getElementsAtEvent:function(t){return r.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return r.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=r.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return r.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],r=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=n[e].length&&n[e].push({}),!n[e][o].type||l.type&&l.type!==n[e][o].type?r.merge(n[e][o],[t.scaleService.getScaleDefaults(s),l]):r.merge(n[e][o],l)}else r._merger(e,n,i,a)}})},r.where=function(t,e){if(r.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return r.each(t,function(t){e(t)&&n.push(t)}),n},r.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i=0;i--){var a=t[i];if(e(a))return a}},r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},r.almostEquals=function(t,e,n){return Math.abs(t-e)t},r.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},r.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},r.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},r.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},r.toRadians=function(t){return t*(Math.PI/180)},r.toDegrees=function(t){return t*(180/Math.PI)},r.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},r.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},r.aliasPixel=function(t){return t%2==0?0:.5},r.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-c*(o.x-a.x),y:r.y-c*(o.y-a.y)},next:{x:r.x+h*(o.x-a.x),y:r.y+h*(o.y-a.y)}}},r.EPSILON=Number.EPSILON||1e-14,r.splineCurveMonotone=function(t){var e,n,i,a,o=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),s=o.length;for(e=0;e0?o[e-1]:null,(a=e0?o[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},r.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},r.niceNum=function(t,e){var n=Math.floor(r.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},r.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},r.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,o=t.currentTarget||t.srcElement,s=o.getBoundingClientRect(),l=a.touches;l&&l.length>0?(n=l[0].clientX,i=l[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(r.getStyle(o,"padding-left")),d=parseFloat(r.getStyle(o,"padding-top")),c=parseFloat(r.getStyle(o,"padding-right")),h=parseFloat(r.getStyle(o,"padding-bottom")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return n=Math.round((n-s.left-u)/f*o.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-d)/g*o.height/e.currentDevicePixelRatio),{x:n,y:i}},r.getConstraintWidth=function(t){return o(t,"max-width","clientWidth")},r.getConstraintHeight=function(t){return o(t,"max-height","clientHeight")},r.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(r.getStyle(e,"padding-left"),10),i=parseInt(r.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,o=r.getConstraintWidth(t);return isNaN(o)?a:Math.min(a,o)},r.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(r.getStyle(e,"padding-top"),10),i=parseInt(r.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,o=r.getConstraintHeight(t);return isNaN(o)?a:Math.min(a,o)},r.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},r.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height=a+"px",i.style.width=r+"px"}},r.fontString=function(t,e,n){return e+" "+t+"px "+n},r.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},o=i.garbageCollect=[],i.font=e),t.font=e;var s=0;r.each(n,function(e){void 0!==e&&null!==e&&!0!==r.isArray(e)?s=r.measureText(t,a,o,s,e):r.isArray(e)&&r.each(e,function(e){void 0===e||null===e||r.isArray(e)||(s=r.measureText(t,a,o,s,e))})});var l=o.length/2;if(l>n.length){for(var u=0;ui&&(i=r),i},r.numberOfLabelLines=function(t){var e=1;return r.each(t,function(t){r.isArray(t)&&t.length>e&&(e=t.length)}),e},r.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},r.getHoverColor=function(t){return t instanceof CanvasPattern?t:r.color(t).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(t,e,n){"use strict";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,r,o;for(i=0,r=t.data.datasets.length;i0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return l(t,e,{intersect:!1})},point:function(t,e){return r(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var r=s(n.axis),l=o(t,a,n.intersect,r);return l.length>1&&l.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),l.slice(0,1)},x:function(t,e,n){var r=i(e,t),o=[],s=!1;return a(t,function(t){t.inXRange(r.x)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),n.intersect&&!s&&(o=[]),o},y:function(t,e,n){var r=i(e,t),o=[],s=!1;return a(t,function(t){t.inYRange(r.y)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),n.intersect&&!s&&(o=[]),o}}}},{45:45}],29:[function(t,e,n){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],r=a.length,o=0;oh&&lt.maxHeight){l--;break}l++,c=u*d}t.labelRotation=l},afterCalculateTickRotation:function(){s.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){s.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},r=i(t._ticks),o=t.options,u=o.ticks,d=o.scaleLabel,c=o.gridLines,h=o.display,f=t.isHorizontal(),g=n(u),m=o.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?m:0,a.height=f?h&&c.drawTicks?m:0:t.maxHeight,d.display&&h){var p=l(d)+s.options.toPadding(d.padding).height;f?a.height+=p:a.width+=p}if(u.display&&h){var v=s.longestText(t.ctx,g.font,r,t.longestTextCache),y=s.numberOfLabelLines(r),b=.5*g.size,x=t.options.ticks.padding;if(f){t.longestLabelWidth=v;var _=s.toRadians(t.labelRotation),k=Math.cos(_),w=Math.sin(_)*v+g.size*y+b*(y-1)+b;a.height=Math.min(t.maxHeight,a.height+w+x),t.ctx.font=g.font;var M=e(t.ctx,r[0],g.font),S=e(t.ctx,r[r.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===o.position?k*M+3:k*b+3,t.paddingRight="bottom"===o.position?k*b+3:k*S+3):(t.paddingLeft=M/2+3,t.paddingRight=S/2+3)}else u.mirror?v=0:v+=x+b,a.width=Math.min(t.maxWidth,a.width+v),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){s.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(s.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:s.noop,getPixelForValue:s.noop,getValueForPixel:s.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var r=e.left+Math.round(a);return r+=e.isFullWidth()?e.margins.left:0}var o=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(o/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,r=this,o=r.isHorizontal(),l=r.options.ticks.minor,u=t.length,d=s.toRadians(r.labelRotation),c=Math.cos(d),h=r.longestLabelWidth*c,f=[];for(l.maxTicksLimit&&(a=l.maxTicksLimit),o&&(e=!1,(h+l.autoSkipPadding)*u>r.width-(r.paddingLeft+r.paddingRight)&&(e=1+Math.floor((h+l.autoSkipPadding)*u/(r.width-(r.paddingLeft+r.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var o=e.ctx,u=r.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,m=e.isHorizontal(),p=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),v=s.valueOrDefault(d.fontColor,u.defaultFontColor),y=n(d),b=s.valueOrDefault(c.fontColor,u.defaultFontColor),x=n(c),_=h.drawTicks?h.tickMarkLength:0,k=s.valueOrDefault(f.fontColor,u.defaultFontColor),w=n(f),M=s.options.toPadding(f.padding),S=s.toRadians(e.labelRotation),D=[],C="right"===i.position?e.left:e.right-_,P="right"===i.position?e.left+_:e.right,T="bottom"===i.position?e.top:e.bottom-_,A="bottom"===i.position?e.top+_:e.bottom;if(s.each(p,function(n,r){if(!s.isNullOrUndef(n.label)){var o,l,c,f,v=n.label;r===e.zeroLineIndex&&i.offset===h.offsetGridLines?(o=h.zeroLineWidth,l=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(o=s.valueAtIndexOrDefault(h.lineWidth,r),l=s.valueAtIndexOrDefault(h.color,r),c=s.valueOrDefault(h.borderDash,u.borderDash),f=s.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var y,b,x,k,w,M,I,O,F,R,L="middle",W="middle",Y=d.padding;if(m){var N=_+Y;"bottom"===i.position?(W=g?"middle":"top",L=g?"right":"center",R=e.top+N):(W=g?"middle":"bottom",L=g?"left":"center",R=e.bottom-N);var z=a(e,r,h.offsetGridLines&&p.length>1);z1);H0)n=t.stepSize;else{var r=i.niceNum(e.max-e.min,!1);n=i.niceNum(r/(t.maxTicks-1),!0)}var o=Math.floor(e.min/n)*n,s=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(o=t.min,s=t.max);var l=(s-o)/n;l=i.almostEquals(l,Math.round(l),n/1e3)?Math.round(l):Math.ceil(l),a.push(void 0!==t.min?t.min:o);for(var u=1;u3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var r=i.log10(Math.abs(a)),o="";if(0!==t){var s=-1*Math.floor(r);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,n){"use strict";var i=t(25),a=t(26),r=t(45);i._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:r.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.xLabel?n=r.xLabel:a>0&&r.indexi.height-e.height&&(o="bottom");var s,l,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===o?(s=function(t){return t<=h},l=function(t){return t>h}):(s=function(t){return t<=e.width/2},l=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},s(n.x)?(r="left",u(n.x)&&(r="center",o=c(n.y))):l(n.x)&&(r="right",d(n.x)&&(r="center",o=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:r,yAlign:g.yAlign?g.yAlign:o}}function d(t,e,n){var i=t.x,a=t.y,r=t.caretSize,o=t.caretPadding,s=t.cornerRadius,l=n.xAlign,u=n.yAlign,d=r+o,c=s+o;return"right"===l?i-=e.width:"center"===l&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===l?i+=d:"right"===l&&(i-=d):"left"===l?i-=c:"right"===l&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=s(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),r=e.afterTitle.apply(t,arguments),o=[];return o=n(o,i),o=n(o,a),o=n(o,r)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,o=[];return r.each(t,function(t){var r={before:[],lines:[],after:[]};n(r.before,a.beforeLabel.call(i,t,e)),n(r.lines,a.label.call(i,t,e)),n(r.after,a.afterLabel.call(i,t,e)),o.push(r)}),o},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),r=e.afterFooter.apply(t,arguments),o=[];return o=n(o,i),o=n(o,a),o=n(o,r)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=s(c),g=a._active,m=a._data,p={xAlign:h.xAlign,yAlign:h.yAlign},v={x:h.x,y:h.y},y={width:h.width,height:h.height},b={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var x=[],_=[];b=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var k=[];for(n=0,i=g.length;n0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!r.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;el;)a-=2*Math.PI;for(;a=s&&a<=l,d=o>=n.innerRadius&&o<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){"use strict";var i=t(25),a=t(26),r=t(45),o=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:o.defaultColor,borderWidth:3,borderColor:o.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,s=a._view,l=a._chart.ctx,u=s.spanGaps,d=a._children.slice(),c=o.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),l.save(),l.lineCap=s.borderCapStyle||c.borderCapStyle,l.setLineDash&&l.setLineDash(s.borderDash||c.borderDash),l.lineDashOffset=s.borderDashOffset||c.borderDashOffset,l.lineJoin=s.borderJoinStyle||c.borderJoinStyle,l.lineWidth=s.borderWidth||c.borderWidth,l.strokeStyle=s.borderColor||o.defaultColor,l.beginPath(),h=-1,t=0;te?1:-1,o=1,s=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,r=1,o=(a=u.base)>i?1:-1,s=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+("left"!==s?h*r:0),g=n+("right"!==s?-h*r:0),m=i+("top"!==s?h*o:0),p=a+("bottom"!==s?-h*o:0);f!==g&&(i=m,a=p),m!==p&&(e=f,n=g)}l.beginPath(),l.fillStyle=u.backgroundColor,l.strokeStyle=u.borderColor,l.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],y=["bottom","left","top","right"].indexOf(s,0);-1===y&&(y=0);var b=t(0);l.moveTo(b[0],b[1]);for(var x=1;x<4;x++)b=t(x),l.lineTo(b[0],b[1]);l.fill(),d&&l.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var r=a(n);return i(n)?t>=r.left&&t<=r.right:e>=r.top&&e<=r.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){"use strict";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,i/2),s=Math.min(r,a/2);t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.quadraticCurveTo(e+i,n,e+i,n+s),t.lineTo(e+i,n+a-s),t.quadraticCurveTo(e+i,n+a,e+i-o,n+a),t.lineTo(e+o,n+a),t.quadraticCurveTo(e,n+a,e,n+a-s),t.lineTo(e,n+s),t.quadraticCurveTo(e,n,e+o,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var r,o,s,l,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(r=e.toString())&&"[object HTMLCanvasElement]"!==r){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(o=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-o/2,a+u/3),t.lineTo(i+o/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case"rectRounded":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"crossRot":t.beginPath(),s=Math.cos(Math.PI/4)*n,l=Math.sin(Math.PI/4)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i-s,a+l),t.lineTo(i+s,a-l),t.closePath();break;case"star":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),s=Math.cos(Math.PI/4)*n,l=Math.sin(Math.PI/4)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i-s,a+l),t.lineTo(i+s,a-l),t.closePath();break;case"line":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){"use strict";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var r,o,s;if(i.isArray(t))if(o=t.length,a)for(r=o-1;r>=0;r--)e.call(n,t[r],r);else for(r=0;r=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){"use strict";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,a,r;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,r=+t.left||0):e=n=a=r=+t||0,{top:e,right:n,bottom:a,left:r,height:e+a,width:r+n}},resolve:function(t,e,n){var a,r,o;for(a=0,r=t.length;a
';var a=e.childNodes[0],o=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,o.scrollLeft=1e6,o.scrollTop=1e6};var s=function(){e._reset(),t()};return r(a,"scroll",s.bind(a,"expand")),r(o,"scroll",s.bind(o,"shrink")),e}function c(t,e){var n=t[v]||(t[v]={}),i=n.renderProxy=function(t){t.animationName===x&&e()};p.each(_,function(e){r(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(b)}function h(t){var e=t[v]||{},n=e.renderProxy;n&&(p.each(_,function(e){o(t,e,n)}),delete e.renderProxy),t.classList.remove(b)}function f(t,e,n){var i=t[v]||(t[v]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(s("resize",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[v]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function m(t,e){var n=t._style||document.createElement("style");t._style||(t._style=n,e="/* Chart.js */\n"+e,n.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var p=t(45),v="$chartjs",y="chartjs-",b=y+"render-monitor",x=y+"render-animation",_=["animationstart","webkitAnimationStart"],k={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},w=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t="from{opacity:0.99}to{opacity:1}";m(this,"@-webkit-keyframes "+x+"{"+t+"}@keyframes "+x+"{"+t+"}."+b+"{-webkit-animation:"+x+" 0.001s;animation:"+x+" 0.001s;}")},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[v]){var n=e[v].initial;["height","width"].forEach(function(t){var i=n[t];p.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),p.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[v]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[v]||(n[v]={});r(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(l(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[v]||{}).proxies||{})[t.id+"_"+e];a&&o(i,e,a)}else g(i)}},p.addEvent=r,p.removeEvent=o},{45:45}],48:[function(t,e,n){"use strict";var i=t(45),a=t(46),r=t(47),o=r._enabled?r:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},o)},{45:45,46:46,47:47}],49:[function(t,e,n){"use strict";var i=t(25),a=t(40),r=t(45);i._set("global",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return"-"!==r[0]&&"+"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePosition?r=i.getBasePosition():i.getBasePixel&&(r=i.getBasePixel()),void 0!==r&&null!==r){if(void 0!==r.x&&void 0!==r.y)return r;if("number"==typeof r&&isFinite(r))return e=i.isHorizontal(),{x:e?r:null,y:e?null:r}}return null}function n(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function o(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),d[n](t))}function s(t){return t&&!t.skip}function l(t,e,n,i,a){var o;if(i&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o0;--o)r.canvas.lineTo(t,n[o],n[o-1],!0)}}function u(t,e,n,i,a,r){var o,u,d,c,h,f,g,m=e.length,p=i.spanGaps,v=[],y=[],b=0,x=0;for(t.beginPath(),o=0,u=m+!!r;o');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push(""),e.join("")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});o.configure(e,i,n),o.addBox(e,i),e.legend=i}var o=t.layoutService,s=r.noop;return t.Legend=a.extend({initialize:function(t){r.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:s,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:function(){var t=this,e=t.options.labels||{},n=r.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:s,beforeFit:s,fit:function(){var t=this,n=t.options,a=n.labels,o=n.display,s=t.ctx,l=i.global,u=r.valueOrDefault,d=u(a.fontSize,l.defaultFontSize),c=u(a.fontStyle,l.defaultFontStyle),h=u(a.fontFamily,l.defaultFontFamily),f=r.fontString(d,c,h),g=t.legendHitBoxes=[],m=t.minSize,p=t.isHorizontal();if(p?(m.width=t.maxWidth,m.height=o?10:0):(m.width=o?10:0,m.height=t.maxHeight),o)if(s.font=f,p){var v=t.lineWidths=[0],y=t.legendItems.length?d+a.padding:0;s.textAlign="left",s.textBaseline="top",r.each(t.legendItems,function(n,i){var r=e(a,d)+d/2+s.measureText(n.text).width;v[v.length-1]+r+a.padding>=t.width&&(y+=d+a.padding,v[v.length]=t.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+a.padding}),m.height+=y}else{var b=a.padding,x=t.columnWidths=[],_=a.padding,k=0,w=0,M=d+b;r.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+s.measureText(t.text).width;w+M>m.height&&(_+=k+a.padding,x.push(k),k=0,w=0),k=Math.max(k,i),w+=M,g[n]={left:0,top:0,width:i,height:d}}),_+=k,x.push(k),m.width+=_}t.width=m.width,t.height=m.height},afterFit:s,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,o=i.global,s=o.elements.line,l=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=r.valueOrDefault,f=h(a.fontColor,o.defaultFontColor),g=h(a.fontSize,o.defaultFontSize),m=h(a.fontStyle,o.defaultFontStyle),p=h(a.fontFamily,o.defaultFontFamily),v=r.fontString(g,m,p);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var y=e(a,g),b=t.legendHitBoxes,x=function(t,e,i){if(!(isNaN(y)||y<=0)){c.save(),c.fillStyle=h(i.fillStyle,o.defaultColor),c.lineCap=h(i.lineCap,s.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,s.borderDashOffset),c.lineJoin=h(i.lineJoin,s.borderJoinStyle),c.lineWidth=h(i.lineWidth,s.borderWidth),c.strokeStyle=h(i.strokeStyle,o.defaultColor);var a=0===h(i.lineWidth,s.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,s.borderDash)),n.labels&&n.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=t+u,f=e+u;r.canvas.drawPoint(c,i.pointStyle,l,d,f)}else a||c.strokeRect(t,e,y,g),c.fillRect(t,e,y,g);c.restore()}},_=function(t,e,n,i){var a=g/2,r=y+a+t,o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(r+i,o),c.stroke())},k=t.isHorizontal();d=k?{x:t.left+(l-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var w=g+a.padding;r.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,r=y+g/2+i,o=d.x,s=d.y;k?o+r>=l&&(s=d.y+=w,d.line++,o=d.x=t.left+(l-u[d.line])/2):s+w>t.bottom&&(o=d.x=o+t.columnWidths[d.line]+a.padding,s=d.y=t.top+a.padding,d.line++),x(o,s,e),b[n].left=o,b[n].top=s,_(o,s,e,i),k?d.x+=r+a.padding:d.y+=w})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var r=t.x,o=t.y;if(r>=e.left&&r<=e.right&&o>=e.top&&o<=e.bottom)for(var s=e.legendHitBoxes,l=0;l=u.left&&r<=u.left+u.width&&o>=u.top&&o<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(r.mergeIf(e,i.global.legend),a?(o.configure(t,a,e),a.options=e):n(t,e)):a&&(o.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){"use strict";var i=t(25),a=t(26),r=t(45);i._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,o=r.noop;return t.Title=a.extend({initialize:function(t){var e=this;r.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:o,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:o,beforeSetDimensions:o,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:o,beforeBuildLabels:o,buildLabels:o,afterBuildLabels:o,beforeFit:o,fit:function(){var t=this,e=r.valueOrDefault,n=t.options,a=n.display,o=e(n.fontSize,i.global.defaultFontSize),s=t.minSize,l=r.isArray(n.text)?n.text.length:1,u=r.options.toLineHeight(n.lineHeight,o),d=a?l*u+2*n.padding:0;t.isHorizontal()?(s.width=t.maxWidth,s.height=d):(s.width=d,s.height=t.maxHeight),t.width=s.width,t.height=s.height},afterFit:o,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=r.valueOrDefault,a=t.options,o=i.global;if(a.display){var s,l,u,d=n(a.fontSize,o.defaultFontSize),c=n(a.fontStyle,o.defaultFontStyle),h=n(a.fontFamily,o.defaultFontFamily),f=r.fontString(d,c,h),g=r.options.toLineHeight(a.lineHeight,d),m=g/2+a.padding,p=0,v=t.top,y=t.left,b=t.bottom,x=t.right;e.fillStyle=n(a.fontColor,o.defaultFontColor),e.font=f,t.isHorizontal()?(l=y+(x-y)/2,u=v+m,s=x-y):(l="left"===a.position?y+m:x-m,u=v+(b-v)/2,s=b-v,p=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(l,u),e.rotate(p),e.textAlign="center",e.textBaseline="middle";var _=a.text;if(r.isArray(_))for(var k=0,w=0;w<_.length;++w)e.fillText(_[w],0,k,s),k+=g;else e.fillText(_,0,0,s);e.restore()}}}),{id:"title",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var o=a.options.title,s=a.titleBlock;o?(r.mergeIf(o,i.global.title),s?(n.configure(a,s,o),s.options=o):e(a,o)):s&&(t.layoutService.removeBox(a,s),delete a.titleBlock)}}}},{25:25,26:26,45:45}],52:[function(t,e,n){"use strict";e.exports=function(t){var e=t.Scale.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,e=t.getLabels();t.minIndex=0,t.maxIndex=e.length-1;var n;void 0!==t.options.ticks.min&&(n=e.indexOf(t.options.ticks.min),t.minIndex=-1!==n?n:t.minIndex),void 0!==t.options.ticks.max&&(n=e.indexOf(t.options.ticks.max),t.maxIndex=-1!==n?n:t.maxIndex),t.min=e[t.minIndex],t.max=e[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e){var n,i=this,a=i.options.offset,r=Math.max(i.maxIndex+1-i.minIndex-(a?0:1),1);if(void 0!==t&&null!==t&&(n=i.isHorizontal()?t.x:t.y),void 0!==n||void 0!==t&&isNaN(e)){var o=i.getLabels();t=n||t;var s=o.indexOf(t);e=-1!==s?s:e}if(i.isHorizontal()){var l=i.width/r,u=l*(e-i.minIndex);return a&&(u+=l/2),i.left+Math.round(u)}var d=i.height/r,c=d*(e-i.minIndex);return a&&(c+=d/2),i.top+Math.round(c)},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,n=e.options.offset,i=Math.max(e._ticks.length-(n?0:1),1),a=e.isHorizontal(),r=(a?e.width:e.height)/i;return t-=a?e.left:e.top,n&&(t-=r/2),(t<=0?0:Math.round(t/r))+e.minIndex},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",e,{position:"bottom"})}},{}],53:[function(t,e,n){"use strict";var i=t(25),a=t(45),r=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:r.formatters.linear}},n=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return o?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,i=e.chart,r=i.data.datasets,o=e.isHorizontal();e.min=null,e.max=null;var s=n.stacked;if(void 0===s&&a.each(r,function(e,n){if(!s){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&t(a)&&void 0!==a.stack&&(s=!0)}}),n.stacked||s){var l={};a.each(r,function(r,o){var s=i.getDatasetMeta(o),u=[s.type,void 0===n.stacked&&void 0===s.stack?o:"",s.stack].join(".");void 0===l[u]&&(l[u]={positiveValues:[],negativeValues:[]});var d=l[u].positiveValues,c=l[u].negativeValues;i.isDatasetVisible(o)&&t(s)&&a.each(r.data,function(t,i){var a=+e.getRightValue(t);isNaN(a)||s.data[i].hidden||(d[i]=d[i]||0,c[i]=c[i]||0,n.relativePoints?d[i]=100:a<0?c[i]+=a:d[i]+=a)})}),a.each(l,function(t){var n=t.positiveValues.concat(t.negativeValues),i=a.min(n),r=a.max(n);e.min=null===e.min?i:Math.min(e.min,i),e.max=null===e.max?r:Math.max(e.max,r)})}else a.each(r,function(n,r){var o=i.getDatasetMeta(r);i.isDatasetVisible(r)&&t(o)&&a.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||o.data[n].hidden||(null===e.min?e.min=i:ie.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var r=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*r)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),r=n.end-i;return n.isHorizontal()?(e=n.left+n.width/r*(a-i),Math.round(e)):(e=n.bottom-n.height/r*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var r=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),r!==o&&t.min>=t.max&&(r?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),r={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},o=t.ticks=a.generators.linear(r,t);t.handleDirectionalChanges(),t.max=i.max(o),t.min=i.min(o),e.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,r=e.chart,o=r.data.datasets,s=i.valueOrDefault,l=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(o,function(e,n){if(!u){var i=r.getDatasetMeta(n);r.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(o,function(a,o){var s=r.getDatasetMeta(o),l=[s.type,void 0===n.stacked&&void 0===s.stack?o:"",s.stack].join(".");r.isDatasetVisible(o)&&t(s)&&(void 0===d[l]&&(d[l]=[]),i.each(a.data,function(t,i){var a=d[l],r=+e.getRightValue(t);isNaN(r)||s.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=r)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(o,function(n,a){var o=r.getDatasetMeta(a);r.isDatasetVisible(a)&&t(o)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||o.data[n].hidden||(null===e.min?e.min=i:ie.max&&(e.max=i),0!==i&&(null===e.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function l(t){var i,r,l,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;ic.r&&(c.r=p.end,h.r=g),v.startc.b&&(c.b=v.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?"center":t<180?"left":"right"}function c(t,e,n,i){if(a.isArray(e))for(var r=n.y,o=1.5*i,s=0;s270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,r=a.valueOrDefault,o=t.options,s=o.angleLines,l=o.pointLabels;i.lineWidth=s.lineWidth,i.strokeStyle=s.color;var u=t.getDistanceFromCenterForValue(o.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline="top";for(var g=e(t)-1;g>=0;g--){if(s.display){var m=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}if(l.display){var v=t.getPointPosition(g,u+5),y=r(l.fontColor,p.defaultFontColor);i.font=f.font,i.fillStyle=y;var b=t.getIndexAngle(g),x=a.toDegrees(b);i.textAlign=d(x),h(x,t._pointLabelSizes[g],v),c(i,t.pointLabels[g]||"",v,f.size)}}}function g(t,n,i,r){var o=t.ctx;if(o.strokeStyle=a.valueAtIndexOrDefault(n.color,r-1),o.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,r-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var s=e(t);if(0===s)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var u=1;u0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,r=a.valueOrDefault;if(e.display){var o=t.ctx,s=this.getIndexAngle(0),l=r(i.fontSize,p.defaultFontSize),u=r(i.fontStyle,p.defaultFontStyle),d=r(i.fontFamily,p.defaultFontFamily),c=a.fontString(l,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=r(i.fontColor,p.defaultFontColor);if(o.font=c,o.save(),o.translate(t.xCenter,t.yCenter),o.rotate(s),i.showLabelBackdrop){var h=o.measureText(e).width;o.fillStyle=i.backdropColor,o.fillRect(-h/2-i.backdropPaddingX,-u-l/2-i.backdropPaddingY,h+2*i.backdropPaddingX,l+2*i.backdropPaddingY)}o.textAlign="center",o.textBaseline="middle",o.fillStyle=d,o.fillText(e,0,-u),o.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType("radialLinear",y,v)}},{25:25,34:34,45:45}],57:[function(t,e,n){"use strict";function i(t,e){return t-e}function a(t){var e,n,i,a={},r=[];for(e=0,n=t.length;ee&&s=0&&o<=s;){if(i=o+s>>1,a=t[i-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}function s(t,e,n,i){var a=o(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],s=a.lo?a.hi?a.hi:t[t.length-1]:t[1],l=s[e]-r[e],u=l?(n-r[e])/l:0,d=(s[i]-r[i])*u;return r[i]+d}function l(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?v(t,i):(t instanceof v||(t=v(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function u(t,e){if(b.isNullOrUndef(t))return null;var n=e.options.time,i=l(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,r,o,s=e-t,l=k[n],u=l.size,d=l.steps;if(!d)return Math.ceil(s/((i||1)*u));for(a=0,r=d.length;a=w.indexOf(e);a--)if(r=w[a],k[r].common&&o.as(r)>=t.length)return r;return w[e?w.indexOf(e):0]}function f(t){for(var e=w.indexOf(t)+1,n=w.length;e1?e[1]:i,o=e[0],l=(s(t,"time",r,"pos")-s(t,"time",o,"pos"))/2),a.time.max||(r=e[e.length-1],o=e.length>1?e[e.length-2]:n,u=(s(t,"time",r,"pos")-s(t,"time",o,"pos"))/2)),{left:l,right:u}}function p(t,e){var n,i,a,r,o=[];for(n=0,i=t.length;n=a&&n<=o&&c.push(n);return i.min=a,i.max=o,i._unit=l.unit||h(c,l.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=r(i._timestamps.data,a,o,s.distribution),i._offsets=m(i._table,c,a,o,s),p(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,r=i.labels&&t=0&&t element; its readystatechange event will be fired asynchronously once it is inserted + // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. + var scriptEl = global.document.createElement('script'); + scriptEl.onreadystatechange = function () { + nextTick(); + + scriptEl.onreadystatechange = null; + scriptEl.parentNode.removeChild(scriptEl); + scriptEl = null; + }; + global.document.documentElement.appendChild(scriptEl); + }; + } else { + scheduleDrain = function () { + setTimeout(nextTick, 0); + }; + } +} + +var draining; +var queue = []; +//named nextTick for less confusing stack traces +function nextTick() { + draining = true; + var i, oldQueue; + var len = queue.length; + while (len) { + oldQueue = queue; + queue = []; + i = -1; + while (++i < len) { + oldQueue[i](); + } + len = queue.length; + } + draining = false; +} + +module.exports = immediate; +function immediate(task) { + if (queue.push(task) === 1 && !draining) { + scheduleDrain(); + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],2:[function(_dereq_,module,exports){ +'use strict'; +var immediate = _dereq_(1); + +/* istanbul ignore next */ +function INTERNAL() {} + +var handlers = {}; + +var REJECTED = ['REJECTED']; +var FULFILLED = ['FULFILLED']; +var PENDING = ['PENDING']; + +module.exports = Promise; + +function Promise(resolver) { + if (typeof resolver !== 'function') { + throw new TypeError('resolver must be a function'); + } + this.state = PENDING; + this.queue = []; + this.outcome = void 0; + if (resolver !== INTERNAL) { + safelyResolveThenable(this, resolver); + } +} + +Promise.prototype["catch"] = function (onRejected) { + return this.then(null, onRejected); +}; +Promise.prototype.then = function (onFulfilled, onRejected) { + if (typeof onFulfilled !== 'function' && this.state === FULFILLED || + typeof onRejected !== 'function' && this.state === REJECTED) { + return this; + } + var promise = new this.constructor(INTERNAL); + if (this.state !== PENDING) { + var resolver = this.state === FULFILLED ? onFulfilled : onRejected; + unwrap(promise, resolver, this.outcome); + } else { + this.queue.push(new QueueItem(promise, onFulfilled, onRejected)); + } + + return promise; +}; +function QueueItem(promise, onFulfilled, onRejected) { + this.promise = promise; + if (typeof onFulfilled === 'function') { + this.onFulfilled = onFulfilled; + this.callFulfilled = this.otherCallFulfilled; + } + if (typeof onRejected === 'function') { + this.onRejected = onRejected; + this.callRejected = this.otherCallRejected; + } +} +QueueItem.prototype.callFulfilled = function (value) { + handlers.resolve(this.promise, value); +}; +QueueItem.prototype.otherCallFulfilled = function (value) { + unwrap(this.promise, this.onFulfilled, value); +}; +QueueItem.prototype.callRejected = function (value) { + handlers.reject(this.promise, value); +}; +QueueItem.prototype.otherCallRejected = function (value) { + unwrap(this.promise, this.onRejected, value); +}; + +function unwrap(promise, func, value) { + immediate(function () { + var returnValue; + try { + returnValue = func(value); + } catch (e) { + return handlers.reject(promise, e); + } + if (returnValue === promise) { + handlers.reject(promise, new TypeError('Cannot resolve promise with itself')); + } else { + handlers.resolve(promise, returnValue); + } + }); +} + +handlers.resolve = function (self, value) { + var result = tryCatch(getThen, value); + if (result.status === 'error') { + return handlers.reject(self, result.value); + } + var thenable = result.value; + + if (thenable) { + safelyResolveThenable(self, thenable); + } else { + self.state = FULFILLED; + self.outcome = value; + var i = -1; + var len = self.queue.length; + while (++i < len) { + self.queue[i].callFulfilled(value); + } + } + return self; +}; +handlers.reject = function (self, error) { + self.state = REJECTED; + self.outcome = error; + var i = -1; + var len = self.queue.length; + while (++i < len) { + self.queue[i].callRejected(error); + } + return self; +}; + +function getThen(obj) { + // Make sure we only access the accessor once as required by the spec + var then = obj && obj.then; + if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') { + return function appyThen() { + then.apply(obj, arguments); + }; + } +} + +function safelyResolveThenable(self, thenable) { + // Either fulfill, reject or reject with error + var called = false; + function onError(value) { + if (called) { + return; + } + called = true; + handlers.reject(self, value); + } + + function onSuccess(value) { + if (called) { + return; + } + called = true; + handlers.resolve(self, value); + } + + function tryToUnwrap() { + thenable(onSuccess, onError); + } + + var result = tryCatch(tryToUnwrap); + if (result.status === 'error') { + onError(result.value); + } +} + +function tryCatch(func, value) { + var out = {}; + try { + out.value = func(value); + out.status = 'success'; + } catch (e) { + out.status = 'error'; + out.value = e; + } + return out; +} + +Promise.resolve = resolve; +function resolve(value) { + if (value instanceof this) { + return value; + } + return handlers.resolve(new this(INTERNAL), value); +} + +Promise.reject = reject; +function reject(reason) { + var promise = new this(INTERNAL); + return handlers.reject(promise, reason); +} + +Promise.all = all; +function all(iterable) { + var self = this; + if (Object.prototype.toString.call(iterable) !== '[object Array]') { + return this.reject(new TypeError('must be an array')); + } + + var len = iterable.length; + var called = false; + if (!len) { + return this.resolve([]); + } + + var values = new Array(len); + var resolved = 0; + var i = -1; + var promise = new this(INTERNAL); + + while (++i < len) { + allResolver(iterable[i], i); + } + return promise; + function allResolver(value, i) { + self.resolve(value).then(resolveFromAll, function (error) { + if (!called) { + called = true; + handlers.reject(promise, error); + } + }); + function resolveFromAll(outValue) { + values[i] = outValue; + if (++resolved === len && !called) { + called = true; + handlers.resolve(promise, values); + } + } + } +} + +Promise.race = race; +function race(iterable) { + var self = this; + if (Object.prototype.toString.call(iterable) !== '[object Array]') { + return this.reject(new TypeError('must be an array')); + } + + var len = iterable.length; + var called = false; + if (!len) { + return this.resolve([]); + } + + var i = -1; + var promise = new this(INTERNAL); + + while (++i < len) { + resolver(iterable[i]); + } + return promise; + function resolver(value) { + self.resolve(value).then(function (response) { + if (!called) { + called = true; + handlers.resolve(promise, response); + } + }, function (error) { + if (!called) { + called = true; + handlers.reject(promise, error); + } + }); + } +} + +},{"1":1}],3:[function(_dereq_,module,exports){ +(function (global){ +'use strict'; +if (typeof global.Promise !== 'function') { + global.Promise = _dereq_(2); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"2":2}],4:[function(_dereq_,module,exports){ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function getIDB() { + /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */ + try { + if (typeof indexedDB !== 'undefined') { + return indexedDB; + } + if (typeof webkitIndexedDB !== 'undefined') { + return webkitIndexedDB; + } + if (typeof mozIndexedDB !== 'undefined') { + return mozIndexedDB; + } + if (typeof OIndexedDB !== 'undefined') { + return OIndexedDB; + } + if (typeof msIndexedDB !== 'undefined') { + return msIndexedDB; + } + } catch (e) { + return; + } +} + +var idb = getIDB(); + +function isIndexedDBValid() { + try { + // Initialize IndexedDB; fall back to vendor-prefixed versions + // if needed. + if (!idb) { + return false; + } + // We mimic PouchDB here; + // + // We test for openDatabase because IE Mobile identifies itself + // as Safari. Oh the lulz... + var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform); + + var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1; + + // Safari <10.1 does not meet our requirements for IDB support (#5572) + // since Safari 10.1 shipped with fetch, we can use that to detect it + return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' && + // some outdated implementations of IDB that appear on Samsung + // and HTC Android devices <4.4 are missing IDBKeyRange + // See: https://github.com/mozilla/localForage/issues/128 + // See: https://github.com/mozilla/localForage/issues/272 + typeof IDBKeyRange !== 'undefined'; + } catch (e) { + return false; + } +} + +// Abstracts constructing a Blob object, so it also works in older +// browsers that don't support the native Blob constructor. (i.e. +// old QtWebKit versions, at least). +// Abstracts constructing a Blob object, so it also works in older +// browsers that don't support the native Blob constructor. (i.e. +// old QtWebKit versions, at least). +function createBlob(parts, properties) { + /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */ + parts = parts || []; + properties = properties || {}; + try { + return new Blob(parts, properties); + } catch (e) { + if (e.name !== 'TypeError') { + throw e; + } + var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder; + var builder = new Builder(); + for (var i = 0; i < parts.length; i += 1) { + builder.append(parts[i]); + } + return builder.getBlob(properties.type); + } +} + +// This is CommonJS because lie is an external dependency, so Rollup +// can just ignore it. +if (typeof Promise === 'undefined') { + // In the "nopromises" build this will just throw if you don't have + // a global promise object, but it would throw anyway later. + _dereq_(3); +} +var Promise$1 = Promise; + +function executeCallback(promise, callback) { + if (callback) { + promise.then(function (result) { + callback(null, result); + }, function (error) { + callback(error); + }); + } +} + +function executeTwoCallbacks(promise, callback, errorCallback) { + if (typeof callback === 'function') { + promise.then(callback); + } + + if (typeof errorCallback === 'function') { + promise["catch"](errorCallback); + } +} + +function normalizeKey(key) { + // Cast the key to a string, as that's all we can set as a key. + if (typeof key !== 'string') { + console.warn(key + ' used as a key, but it is not a string.'); + key = String(key); + } + + return key; +} + +function getCallback() { + if (arguments.length && typeof arguments[arguments.length - 1] === 'function') { + return arguments[arguments.length - 1]; + } +} + +// Some code originally from async_storage.js in +// [Gaia](https://github.com/mozilla-b2g/gaia). + +var DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support'; +var supportsBlobs = void 0; +var dbContexts = {}; +var toString = Object.prototype.toString; + +// Transaction Modes +var READ_ONLY = 'readonly'; +var READ_WRITE = 'readwrite'; + +// Transform a binary string to an array buffer, because otherwise +// weird stuff happens when you try to work with the binary string directly. +// It is known. +// From http://stackoverflow.com/questions/14967647/ (continues on next line) +// encode-decode-image-with-base64-breaks-image (2013-04-21) +function _binStringToArrayBuffer(bin) { + var length = bin.length; + var buf = new ArrayBuffer(length); + var arr = new Uint8Array(buf); + for (var i = 0; i < length; i++) { + arr[i] = bin.charCodeAt(i); + } + return buf; +} + +// +// Blobs are not supported in all versions of IndexedDB, notably +// Chrome <37 and Android <5. In those versions, storing a blob will throw. +// +// Various other blob bugs exist in Chrome v37-42 (inclusive). +// Detecting them is expensive and confusing to users, and Chrome 37-42 +// is at very low usage worldwide, so we do a hacky userAgent check instead. +// +// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120 +// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916 +// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836 +// +// Code borrowed from PouchDB. See: +// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js +// +function _checkBlobSupportWithoutCaching(idb) { + return new Promise$1(function (resolve) { + var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE); + var blob = createBlob(['']); + txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key'); + + txn.onabort = function (e) { + // If the transaction aborts now its due to not being able to + // write to the database, likely due to the disk being full + e.preventDefault(); + e.stopPropagation(); + resolve(false); + }; + + txn.oncomplete = function () { + var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/); + var matchedEdge = navigator.userAgent.match(/Edge\//); + // MS Edge pretends to be Chrome 42: + // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx + resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43); + }; + })["catch"](function () { + return false; // error, so assume unsupported + }); +} + +function _checkBlobSupport(idb) { + if (typeof supportsBlobs === 'boolean') { + return Promise$1.resolve(supportsBlobs); + } + return _checkBlobSupportWithoutCaching(idb).then(function (value) { + supportsBlobs = value; + return supportsBlobs; + }); +} + +function _deferReadiness(dbInfo) { + var dbContext = dbContexts[dbInfo.name]; + + // Create a deferred object representing the current database operation. + var deferredOperation = {}; + + deferredOperation.promise = new Promise$1(function (resolve, reject) { + deferredOperation.resolve = resolve; + deferredOperation.reject = reject; + }); + + // Enqueue the deferred operation. + dbContext.deferredOperations.push(deferredOperation); + + // Chain its promise to the database readiness. + if (!dbContext.dbReady) { + dbContext.dbReady = deferredOperation.promise; + } else { + dbContext.dbReady = dbContext.dbReady.then(function () { + return deferredOperation.promise; + }); + } +} + +function _advanceReadiness(dbInfo) { + var dbContext = dbContexts[dbInfo.name]; + + // Dequeue a deferred operation. + var deferredOperation = dbContext.deferredOperations.pop(); + + // Resolve its promise (which is part of the database readiness + // chain of promises). + if (deferredOperation) { + deferredOperation.resolve(); + return deferredOperation.promise; + } +} + +function _rejectReadiness(dbInfo, err) { + var dbContext = dbContexts[dbInfo.name]; + + // Dequeue a deferred operation. + var deferredOperation = dbContext.deferredOperations.pop(); + + // Reject its promise (which is part of the database readiness + // chain of promises). + if (deferredOperation) { + deferredOperation.reject(err); + return deferredOperation.promise; + } +} + +function _getConnection(dbInfo, upgradeNeeded) { + return new Promise$1(function (resolve, reject) { + dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext(); + + if (dbInfo.db) { + if (upgradeNeeded) { + _deferReadiness(dbInfo); + dbInfo.db.close(); + } else { + return resolve(dbInfo.db); + } + } + + var dbArgs = [dbInfo.name]; + + if (upgradeNeeded) { + dbArgs.push(dbInfo.version); + } + + var openreq = idb.open.apply(idb, dbArgs); + + if (upgradeNeeded) { + openreq.onupgradeneeded = function (e) { + var db = openreq.result; + try { + db.createObjectStore(dbInfo.storeName); + if (e.oldVersion <= 1) { + // Added when support for blob shims was added + db.createObjectStore(DETECT_BLOB_SUPPORT_STORE); + } + } catch (ex) { + if (ex.name === 'ConstraintError') { + console.warn('The database "' + dbInfo.name + '"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.'); + } else { + throw ex; + } + } + }; + } + + openreq.onerror = function (e) { + e.preventDefault(); + reject(openreq.error); + }; + + openreq.onsuccess = function () { + resolve(openreq.result); + _advanceReadiness(dbInfo); + }; + }); +} + +function _getOriginalConnection(dbInfo) { + return _getConnection(dbInfo, false); +} + +function _getUpgradedConnection(dbInfo) { + return _getConnection(dbInfo, true); +} + +function _isUpgradeNeeded(dbInfo, defaultVersion) { + if (!dbInfo.db) { + return true; + } + + var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName); + var isDowngrade = dbInfo.version < dbInfo.db.version; + var isUpgrade = dbInfo.version > dbInfo.db.version; + + if (isDowngrade) { + // If the version is not the default one + // then warn for impossible downgrade. + if (dbInfo.version !== defaultVersion) { + console.warn('The database "' + dbInfo.name + '"' + " can't be downgraded from version " + dbInfo.db.version + ' to version ' + dbInfo.version + '.'); + } + // Align the versions to prevent errors. + dbInfo.version = dbInfo.db.version; + } + + if (isUpgrade || isNewStore) { + // If the store is new then increment the version (if needed). + // This will trigger an "upgradeneeded" event which is required + // for creating a store. + if (isNewStore) { + var incVersion = dbInfo.db.version + 1; + if (incVersion > dbInfo.version) { + dbInfo.version = incVersion; + } + } + + return true; + } + + return false; +} + +// encode a blob for indexeddb engines that don't support blobs +function _encodeBlob(blob) { + return new Promise$1(function (resolve, reject) { + var reader = new FileReader(); + reader.onerror = reject; + reader.onloadend = function (e) { + var base64 = btoa(e.target.result || ''); + resolve({ + __local_forage_encoded_blob: true, + data: base64, + type: blob.type + }); + }; + reader.readAsBinaryString(blob); + }); +} + +// decode an encoded blob +function _decodeBlob(encodedBlob) { + var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data)); + return createBlob([arrayBuff], { type: encodedBlob.type }); +} + +// is this one of our fancy encoded blobs? +function _isEncodedBlob(value) { + return value && value.__local_forage_encoded_blob; +} + +// Specialize the default `ready()` function by making it dependent +// on the current database operations. Thus, the driver will be actually +// ready when it's been initialized (default) *and* there are no pending +// operations on the database (initiated by some other instances). +function _fullyReady(callback) { + var self = this; + + var promise = self._initReady().then(function () { + var dbContext = dbContexts[self._dbInfo.name]; + + if (dbContext && dbContext.dbReady) { + return dbContext.dbReady; + } + }); + + executeTwoCallbacks(promise, callback, callback); + return promise; +} + +// Try to establish a new db connection to replace the +// current one which is broken (i.e. experiencing +// InvalidStateError while creating a transaction). +function _tryReconnect(dbInfo) { + _deferReadiness(dbInfo); + + var dbContext = dbContexts[dbInfo.name]; + var forages = dbContext.forages; + + for (var i = 0; i < forages.length; i++) { + var forage = forages[i]; + if (forage._dbInfo.db) { + forage._dbInfo.db.close(); + forage._dbInfo.db = null; + } + } + dbInfo.db = null; + + return _getOriginalConnection(dbInfo).then(function (db) { + dbInfo.db = db; + if (_isUpgradeNeeded(dbInfo)) { + // Reopen the database for upgrading. + return _getUpgradedConnection(dbInfo); + } + return db; + }).then(function (db) { + // store the latest db reference + // in case the db was upgraded + dbInfo.db = dbContext.db = db; + for (var i = 0; i < forages.length; i++) { + forages[i]._dbInfo.db = db; + } + })["catch"](function (err) { + _rejectReadiness(dbInfo, err); + throw err; + }); +} + +// FF doesn't like Promises (micro-tasks) and IDDB store operations, +// so we have to do it with callbacks +function createTransaction(dbInfo, mode, callback, retries) { + if (retries === undefined) { + retries = 1; + } + + try { + var tx = dbInfo.db.transaction(dbInfo.storeName, mode); + callback(null, tx); + } catch (err) { + if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) { + return Promise$1.resolve().then(function () { + if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) { + // increase the db version, to create the new ObjectStore + if (dbInfo.db) { + dbInfo.version = dbInfo.db.version + 1; + } + // Reopen the database for upgrading. + return _getUpgradedConnection(dbInfo); + } + }).then(function () { + return _tryReconnect(dbInfo).then(function () { + createTransaction(dbInfo, mode, callback, retries - 1); + }); + })["catch"](callback); + } + + callback(err); + } +} + +function createDbContext() { + return { + // Running localForages sharing a database. + forages: [], + // Shared database. + db: null, + // Database readiness (promise). + dbReady: null, + // Deferred operations on the database. + deferredOperations: [] + }; +} + +// Open the IndexedDB database (automatically creates one if one didn't +// previously exist), using any options set in the config. +function _initStorage(options) { + var self = this; + var dbInfo = { + db: null + }; + + if (options) { + for (var i in options) { + dbInfo[i] = options[i]; + } + } + + // Get the current context of the database; + var dbContext = dbContexts[dbInfo.name]; + + // ...or create a new context. + if (!dbContext) { + dbContext = createDbContext(); + // Register the new context in the global container. + dbContexts[dbInfo.name] = dbContext; + } + + // Register itself as a running localForage in the current context. + dbContext.forages.push(self); + + // Replace the default `ready()` function with the specialized one. + if (!self._initReady) { + self._initReady = self.ready; + self.ready = _fullyReady; + } + + // Create an array of initialization states of the related localForages. + var initPromises = []; + + function ignoreErrors() { + // Don't handle errors here, + // just makes sure related localForages aren't pending. + return Promise$1.resolve(); + } + + for (var j = 0; j < dbContext.forages.length; j++) { + var forage = dbContext.forages[j]; + if (forage !== self) { + // Don't wait for itself... + initPromises.push(forage._initReady()["catch"](ignoreErrors)); + } + } + + // Take a snapshot of the related localForages. + var forages = dbContext.forages.slice(0); + + // Initialize the connection process only when + // all the related localForages aren't pending. + return Promise$1.all(initPromises).then(function () { + dbInfo.db = dbContext.db; + // Get the connection or open a new one without upgrade. + return _getOriginalConnection(dbInfo); + }).then(function (db) { + dbInfo.db = db; + if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) { + // Reopen the database for upgrading. + return _getUpgradedConnection(dbInfo); + } + return db; + }).then(function (db) { + dbInfo.db = dbContext.db = db; + self._dbInfo = dbInfo; + // Share the final connection amongst related localForages. + for (var k = 0; k < forages.length; k++) { + var forage = forages[k]; + if (forage !== self) { + // Self is already up-to-date. + forage._dbInfo.db = dbInfo.db; + forage._dbInfo.version = dbInfo.version; + } + } + }); +} + +function getItem(key, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.get(key); + + req.onsuccess = function () { + var value = req.result; + if (value === undefined) { + value = null; + } + if (_isEncodedBlob(value)) { + value = _decodeBlob(value); + } + resolve(value); + }; + + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +// Iterate over all items stored in database. +function iterate(iterator, callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.openCursor(); + var iterationNumber = 1; + + req.onsuccess = function () { + var cursor = req.result; + + if (cursor) { + var value = cursor.value; + if (_isEncodedBlob(value)) { + value = _decodeBlob(value); + } + var result = iterator(value, cursor.key, iterationNumber++); + + // when the iterator callback retuns any + // (non-`undefined`) value, then we stop + // the iteration immediately + if (result !== void 0) { + resolve(result); + } else { + cursor["continue"](); + } + } else { + resolve(); + } + }; + + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + + return promise; +} + +function setItem(key, value, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + var dbInfo; + self.ready().then(function () { + dbInfo = self._dbInfo; + if (toString.call(value) === '[object Blob]') { + return _checkBlobSupport(dbInfo.db).then(function (blobSupport) { + if (blobSupport) { + return value; + } + return _encodeBlob(value); + }); + } + return value; + }).then(function (value) { + createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + + // The reason we don't _save_ null is because IE 10 does + // not support saving the `null` type in IndexedDB. How + // ironic, given the bug below! + // See: https://github.com/mozilla/localForage/issues/161 + if (value === null) { + value = undefined; + } + + var req = store.put(value, key); + + transaction.oncomplete = function () { + // Cast to undefined so the value passed to + // callback/promise is the same as what one would get out + // of `getItem()` later. This leads to some weirdness + // (setItem('foo', undefined) will return `null`), but + // it's not my fault localStorage is our baseline and that + // it's weird. + if (value === undefined) { + value = null; + } + + resolve(value); + }; + transaction.onabort = transaction.onerror = function () { + var err = req.error ? req.error : req.transaction.error; + reject(err); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function removeItem(key, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + // We use a Grunt task to make this safe for IE and some + // versions of Android (including those used by Cordova). + // Normally IE won't like `.delete()` and will insist on + // using `['delete']()`, but we have a build step that + // fixes this for us now. + var req = store["delete"](key); + transaction.oncomplete = function () { + resolve(); + }; + + transaction.onerror = function () { + reject(req.error); + }; + + // The request will be also be aborted if we've exceeded our storage + // space. + transaction.onabort = function () { + var err = req.error ? req.error : req.transaction.error; + reject(err); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function clear(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.clear(); + + transaction.oncomplete = function () { + resolve(); + }; + + transaction.onabort = transaction.onerror = function () { + var err = req.error ? req.error : req.transaction.error; + reject(err); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function length(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.count(); + + req.onsuccess = function () { + resolve(req.result); + }; + + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function key(n, callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + if (n < 0) { + resolve(null); + + return; + } + + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var advanced = false; + var req = store.openCursor(); + + req.onsuccess = function () { + var cursor = req.result; + if (!cursor) { + // this means there weren't enough keys + resolve(null); + + return; + } + + if (n === 0) { + // We have the first key, return it if that's what they + // wanted. + resolve(cursor.key); + } else { + if (!advanced) { + // Otherwise, ask the cursor to skip ahead n + // records. + advanced = true; + cursor.advance(n); + } else { + // When we get here, we've got the nth key. + resolve(cursor.key); + } + } + }; + + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function keys(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } + + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.openCursor(); + var keys = []; + + req.onsuccess = function () { + var cursor = req.result; + + if (!cursor) { + resolve(keys); + return; + } + + keys.push(cursor.key); + cursor["continue"](); + }; + + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function dropInstance(options, callback) { + callback = getCallback.apply(this, arguments); + + var currentConfig = this.config(); + options = typeof options !== 'function' && options || {}; + if (!options.name) { + options.name = options.name || currentConfig.name; + options.storeName = options.storeName || currentConfig.storeName; + } + + var self = this; + var promise; + if (!options.name) { + promise = Promise$1.reject('Invalid arguments'); + } else { + var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db; + + var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) { + var dbContext = dbContexts[options.name]; + var forages = dbContext.forages; + dbContext.db = db; + for (var i = 0; i < forages.length; i++) { + forages[i]._dbInfo.db = db; + } + return db; + }); + + if (!options.storeName) { + promise = dbPromise.then(function (db) { + _deferReadiness(options); + + var dbContext = dbContexts[options.name]; + var forages = dbContext.forages; + + db.close(); + for (var i = 0; i < forages.length; i++) { + var forage = forages[i]; + forage._dbInfo.db = null; + } + + var dropDBPromise = new Promise$1(function (resolve, reject) { + var req = idb.deleteDatabase(options.name); + + req.onerror = req.onblocked = function (err) { + var db = req.result; + if (db) { + db.close(); + } + reject(err); + }; + + req.onsuccess = function () { + var db = req.result; + if (db) { + db.close(); + } + resolve(db); + }; + }); + + return dropDBPromise.then(function (db) { + dbContext.db = db; + for (var i = 0; i < forages.length; i++) { + var _forage = forages[i]; + _advanceReadiness(_forage._dbInfo); + } + })["catch"](function (err) { + (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); + throw err; + }); + }); + } else { + promise = dbPromise.then(function (db) { + if (!db.objectStoreNames.contains(options.storeName)) { + return; + } + + var newVersion = db.version + 1; + + _deferReadiness(options); + + var dbContext = dbContexts[options.name]; + var forages = dbContext.forages; + + db.close(); + for (var i = 0; i < forages.length; i++) { + var forage = forages[i]; + forage._dbInfo.db = null; + forage._dbInfo.version = newVersion; + } + + var dropObjectPromise = new Promise$1(function (resolve, reject) { + var req = idb.open(options.name, newVersion); + + req.onerror = function (err) { + var db = req.result; + db.close(); + reject(err); + }; + + req.onupgradeneeded = function () { + var db = req.result; + db.deleteObjectStore(options.storeName); + }; + + req.onsuccess = function () { + var db = req.result; + db.close(); + resolve(db); + }; + }); + + return dropObjectPromise.then(function (db) { + dbContext.db = db; + for (var j = 0; j < forages.length; j++) { + var _forage2 = forages[j]; + _forage2._dbInfo.db = db; + _advanceReadiness(_forage2._dbInfo); + } + })["catch"](function (err) { + (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); + throw err; + }); + }); + } + } + + executeCallback(promise, callback); + return promise; +} + +var asyncStorage = { + _driver: 'asyncStorage', + _initStorage: _initStorage, + _support: isIndexedDBValid(), + iterate: iterate, + getItem: getItem, + setItem: setItem, + removeItem: removeItem, + clear: clear, + length: length, + key: key, + keys: keys, + dropInstance: dropInstance +}; + +function isWebSQLValid() { + return typeof openDatabase === 'function'; +} + +// Sadly, the best way to save binary data in WebSQL/localStorage is serializing +// it to Base64, so this is how we store it to prevent very strange errors with less +// verbose ways of binary <-> string data storage. +var BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +var BLOB_TYPE_PREFIX = '~~local_forage_type~'; +var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/; + +var SERIALIZED_MARKER = '__lfsc__:'; +var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; + +// OMG the serializations! +var TYPE_ARRAYBUFFER = 'arbf'; +var TYPE_BLOB = 'blob'; +var TYPE_INT8ARRAY = 'si08'; +var TYPE_UINT8ARRAY = 'ui08'; +var TYPE_UINT8CLAMPEDARRAY = 'uic8'; +var TYPE_INT16ARRAY = 'si16'; +var TYPE_INT32ARRAY = 'si32'; +var TYPE_UINT16ARRAY = 'ur16'; +var TYPE_UINT32ARRAY = 'ui32'; +var TYPE_FLOAT32ARRAY = 'fl32'; +var TYPE_FLOAT64ARRAY = 'fl64'; +var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length; + +var toString$1 = Object.prototype.toString; + +function stringToBuffer(serializedString) { + // Fill the string into a ArrayBuffer. + var bufferLength = serializedString.length * 0.75; + var len = serializedString.length; + var i; + var p = 0; + var encoded1, encoded2, encoded3, encoded4; + + if (serializedString[serializedString.length - 1] === '=') { + bufferLength--; + if (serializedString[serializedString.length - 2] === '=') { + bufferLength--; + } + } + + var buffer = new ArrayBuffer(bufferLength); + var bytes = new Uint8Array(buffer); + + for (i = 0; i < len; i += 4) { + encoded1 = BASE_CHARS.indexOf(serializedString[i]); + encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]); + encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]); + encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]); + + /*jslint bitwise: true */ + bytes[p++] = encoded1 << 2 | encoded2 >> 4; + bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; + bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; + } + return buffer; +} + +// Converts a buffer to a string to store, serialized, in the backend +// storage library. +function bufferToString(buffer) { + // base64-arraybuffer + var bytes = new Uint8Array(buffer); + var base64String = ''; + var i; + + for (i = 0; i < bytes.length; i += 3) { + /*jslint bitwise: true */ + base64String += BASE_CHARS[bytes[i] >> 2]; + base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; + base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; + base64String += BASE_CHARS[bytes[i + 2] & 63]; + } + + if (bytes.length % 3 === 2) { + base64String = base64String.substring(0, base64String.length - 1) + '='; + } else if (bytes.length % 3 === 1) { + base64String = base64String.substring(0, base64String.length - 2) + '=='; + } + + return base64String; +} + +// Serialize a value, afterwards executing a callback (which usually +// instructs the `setItem()` callback/promise to be executed). This is how +// we store binary data with localStorage. +function serialize(value, callback) { + var valueType = ''; + if (value) { + valueType = toString$1.call(value); + } + + // Cannot use `value instanceof ArrayBuffer` or such here, as these + // checks fail when running the tests using casper.js... + // + // TODO: See why those tests fail and use a better solution. + if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) { + // Convert binary arrays to a string and prefix the string with + // a special marker. + var buffer; + var marker = SERIALIZED_MARKER; + + if (value instanceof ArrayBuffer) { + buffer = value; + marker += TYPE_ARRAYBUFFER; + } else { + buffer = value.buffer; + + if (valueType === '[object Int8Array]') { + marker += TYPE_INT8ARRAY; + } else if (valueType === '[object Uint8Array]') { + marker += TYPE_UINT8ARRAY; + } else if (valueType === '[object Uint8ClampedArray]') { + marker += TYPE_UINT8CLAMPEDARRAY; + } else if (valueType === '[object Int16Array]') { + marker += TYPE_INT16ARRAY; + } else if (valueType === '[object Uint16Array]') { + marker += TYPE_UINT16ARRAY; + } else if (valueType === '[object Int32Array]') { + marker += TYPE_INT32ARRAY; + } else if (valueType === '[object Uint32Array]') { + marker += TYPE_UINT32ARRAY; + } else if (valueType === '[object Float32Array]') { + marker += TYPE_FLOAT32ARRAY; + } else if (valueType === '[object Float64Array]') { + marker += TYPE_FLOAT64ARRAY; + } else { + callback(new Error('Failed to get type for BinaryArray')); + } + } + + callback(marker + bufferToString(buffer)); + } else if (valueType === '[object Blob]') { + // Conver the blob to a binaryArray and then to a string. + var fileReader = new FileReader(); + + fileReader.onload = function () { + // Backwards-compatible prefix for the blob type. + var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result); + + callback(SERIALIZED_MARKER + TYPE_BLOB + str); + }; + + fileReader.readAsArrayBuffer(value); + } else { + try { + callback(JSON.stringify(value)); + } catch (e) { + console.error("Couldn't convert value into a JSON string: ", value); + + callback(null, e); + } + } +} + +// Deserialize data we've inserted into a value column/field. We place +// special markers into our strings to mark them as encoded; this isn't +// as nice as a meta field, but it's the only sane thing we can do whilst +// keeping localStorage support intact. +// +// Oftentimes this will just deserialize JSON content, but if we have a +// special marker (SERIALIZED_MARKER, defined above), we will extract +// some kind of arraybuffer/binary data/typed array out of the string. +function deserialize(value) { + // If we haven't marked this string as being specially serialized (i.e. + // something other than serialized JSON), we can just return it and be + // done with it. + if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) { + return JSON.parse(value); + } + + // The following code deals with deserializing some kind of Blob or + // TypedArray. First we separate out the type of data we're dealing + // with from the data itself. + var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH); + var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH); + + var blobType; + // Backwards-compatible blob type serialization strategy. + // DBs created with older versions of localForage will simply not have the blob type. + if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) { + var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX); + blobType = matcher[1]; + serializedString = serializedString.substring(matcher[0].length); + } + var buffer = stringToBuffer(serializedString); + + // Return the right type based on the code/type set during + // serialization. + switch (type) { + case TYPE_ARRAYBUFFER: + return buffer; + case TYPE_BLOB: + return createBlob([buffer], { type: blobType }); + case TYPE_INT8ARRAY: + return new Int8Array(buffer); + case TYPE_UINT8ARRAY: + return new Uint8Array(buffer); + case TYPE_UINT8CLAMPEDARRAY: + return new Uint8ClampedArray(buffer); + case TYPE_INT16ARRAY: + return new Int16Array(buffer); + case TYPE_UINT16ARRAY: + return new Uint16Array(buffer); + case TYPE_INT32ARRAY: + return new Int32Array(buffer); + case TYPE_UINT32ARRAY: + return new Uint32Array(buffer); + case TYPE_FLOAT32ARRAY: + return new Float32Array(buffer); + case TYPE_FLOAT64ARRAY: + return new Float64Array(buffer); + default: + throw new Error('Unkown type: ' + type); + } +} + +var localforageSerializer = { + serialize: serialize, + deserialize: deserialize, + stringToBuffer: stringToBuffer, + bufferToString: bufferToString +}; + +/* + * Includes code from: + * + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + */ + +function createDbTable(t, dbInfo, callback, errorCallback) { + t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback); +} + +// Open the WebSQL database (automatically creates one if one didn't +// previously exist), using any options set in the config. +function _initStorage$1(options) { + var self = this; + var dbInfo = { + db: null + }; + + if (options) { + for (var i in options) { + dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i]; + } + } + + var dbInfoPromise = new Promise$1(function (resolve, reject) { + // Open the database; the openDatabase API will automatically + // create it for us if it doesn't exist. + try { + dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size); + } catch (e) { + return reject(e); + } + + // Create our key/value table if it doesn't exist. + dbInfo.db.transaction(function (t) { + createDbTable(t, dbInfo, function () { + self._dbInfo = dbInfo; + resolve(); + }, function (t, error) { + reject(error); + }); + }, reject); + }); + + dbInfo.serializer = localforageSerializer; + return dbInfoPromise; +} + +function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) { + t.executeSql(sqlStatement, args, callback, function (t, error) { + if (error.code === error.SYNTAX_ERR) { + t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name = ?", [dbInfo.storeName], function (t, results) { + if (!results.rows.length) { + // if the table is missing (was deleted) + // re-create it table and retry + createDbTable(t, dbInfo, function () { + t.executeSql(sqlStatement, args, callback, errorCallback); + }, errorCallback); + } else { + errorCallback(t, error); + } + }, errorCallback); + } else { + errorCallback(t, error); + } + }, errorCallback); +} + +function getItem$1(key, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) { + var result = results.rows.length ? results.rows.item(0).value : null; + + // Check to see if this is serialized content we need to + // unpack. + if (result) { + result = dbInfo.serializer.deserialize(result); + } + + resolve(result); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function iterate$1(iterator, callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) { + var rows = results.rows; + var length = rows.length; + + for (var i = 0; i < length; i++) { + var item = rows.item(i); + var result = item.value; + + // Check to see if this is serialized content + // we need to unpack. + if (result) { + result = dbInfo.serializer.deserialize(result); + } + + result = iterator(result, item.key, i + 1); + + // void(0) prevents problems with redefinition + // of `undefined`. + if (result !== void 0) { + resolve(result); + return; + } + } + + resolve(); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function _setItem(key, value, callback, retriesLeft) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + // The localStorage API doesn't return undefined values in an + // "expected" way, so undefined is always cast to null in all + // drivers. See: https://github.com/mozilla/localForage/pull/42 + if (value === undefined) { + value = null; + } + + // Save the original value to pass to the callback. + var originalValue = value; + + var dbInfo = self._dbInfo; + dbInfo.serializer.serialize(value, function (value, error) { + if (error) { + reject(error); + } else { + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () { + resolve(originalValue); + }, function (t, error) { + reject(error); + }); + }, function (sqlError) { + // The transaction failed; check + // to see if it's a quota error. + if (sqlError.code === sqlError.QUOTA_ERR) { + // We reject the callback outright for now, but + // it's worth trying to re-run the transaction. + // Even if the user accepts the prompt to use + // more storage on Safari, this error will + // be called. + // + // Try to re-run the transaction. + if (retriesLeft > 0) { + resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1])); + return; + } + reject(sqlError); + } + }); + } + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function setItem$1(key, value, callback) { + return _setItem.apply(this, [key, value, callback, 1]); +} + +function removeItem$1(key, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () { + resolve(); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +// Deletes every item in the table. +// TODO: Find out if this resets the AUTO_INCREMENT number. +function clear$1(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () { + resolve(); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +// Does a simple `COUNT(key)` to get the number of items stored in +// localForage. +function length$1(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + // Ahhh, SQL makes this one soooooo easy. + tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) { + var result = results.rows.item(0).c; + resolve(result); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +// Return the key located at key index X; essentially gets the key from a +// `WHERE id = ?`. This is the most efficient way I can think to implement +// this rarely-used (in my experience) part of the API, but it can seem +// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so +// the ID of each key will change every time it's updated. Perhaps a stored +// procedure for the `setItem()` SQL would solve this problem? +// TODO: Don't change ID on `setItem()`. +function key$1(n, callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) { + var result = results.rows.length ? results.rows.item(0).key : null; + resolve(result); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +function keys$1(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) { + var keys = []; + + for (var i = 0; i < results.rows.length; i++) { + keys.push(results.rows.item(i).key); + } + + resolve(keys); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); + + executeCallback(promise, callback); + return promise; +} + +// https://www.w3.org/TR/webdatabase/#databases +// > There is no way to enumerate or delete the databases available for an origin from this API. +function getAllStoreNames(db) { + return new Promise$1(function (resolve, reject) { + db.transaction(function (t) { + t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, results) { + var storeNames = []; + + for (var i = 0; i < results.rows.length; i++) { + storeNames.push(results.rows.item(i).name); + } + + resolve({ + db: db, + storeNames: storeNames + }); + }, function (t, error) { + reject(error); + }); + }, function (sqlError) { + reject(sqlError); + }); + }); +} + +function dropInstance$1(options, callback) { + callback = getCallback.apply(this, arguments); + + var currentConfig = this.config(); + options = typeof options !== 'function' && options || {}; + if (!options.name) { + options.name = options.name || currentConfig.name; + options.storeName = options.storeName || currentConfig.storeName; + } + + var self = this; + var promise; + if (!options.name) { + promise = Promise$1.reject('Invalid arguments'); + } else { + promise = new Promise$1(function (resolve) { + var db; + if (options.name === currentConfig.name) { + // use the db reference of the current instance + db = self._dbInfo.db; + } else { + db = openDatabase(options.name, '', '', 0); + } + + if (!options.storeName) { + // drop all database tables + resolve(getAllStoreNames(db)); + } else { + resolve({ + db: db, + storeNames: [options.storeName] + }); + } + }).then(function (operationInfo) { + return new Promise$1(function (resolve, reject) { + operationInfo.db.transaction(function (t) { + function dropTable(storeName) { + return new Promise$1(function (resolve, reject) { + t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () { + resolve(); + }, function (t, error) { + reject(error); + }); + }); + } + + var operations = []; + for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) { + operations.push(dropTable(operationInfo.storeNames[i])); + } + + Promise$1.all(operations).then(function () { + resolve(); + })["catch"](function (e) { + reject(e); + }); + }, function (sqlError) { + reject(sqlError); + }); + }); + }); + } + + executeCallback(promise, callback); + return promise; +} + +var webSQLStorage = { + _driver: 'webSQLStorage', + _initStorage: _initStorage$1, + _support: isWebSQLValid(), + iterate: iterate$1, + getItem: getItem$1, + setItem: setItem$1, + removeItem: removeItem$1, + clear: clear$1, + length: length$1, + key: key$1, + keys: keys$1, + dropInstance: dropInstance$1 +}; + +function isLocalStorageValid() { + try { + return typeof localStorage !== 'undefined' && 'setItem' in localStorage && + // in IE8 typeof localStorage.setItem === 'object' + !!localStorage.setItem; + } catch (e) { + return false; + } +} + +function _getKeyPrefix(options, defaultConfig) { + var keyPrefix = options.name + '/'; + + if (options.storeName !== defaultConfig.storeName) { + keyPrefix += options.storeName + '/'; + } + return keyPrefix; +} + +// Check if localStorage throws when saving an item +function checkIfLocalStorageThrows() { + var localStorageTestKey = '_localforage_support_test'; + + try { + localStorage.setItem(localStorageTestKey, true); + localStorage.removeItem(localStorageTestKey); + + return false; + } catch (e) { + return true; + } +} + +// Check if localStorage is usable and allows to save an item +// This method checks if localStorage is usable in Safari Private Browsing +// mode, or in any other case where the available quota for localStorage +// is 0 and there wasn't any saved items yet. +function _isLocalStorageUsable() { + return !checkIfLocalStorageThrows() || localStorage.length > 0; +} + +// Config the localStorage backend, using options set in the config. +function _initStorage$2(options) { + var self = this; + var dbInfo = {}; + if (options) { + for (var i in options) { + dbInfo[i] = options[i]; + } + } + + dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig); + + if (!_isLocalStorageUsable()) { + return Promise$1.reject(); + } + + self._dbInfo = dbInfo; + dbInfo.serializer = localforageSerializer; + + return Promise$1.resolve(); +} + +// Remove all keys from the datastore, effectively destroying all data in +// the app's key/value store! +function clear$2(callback) { + var self = this; + var promise = self.ready().then(function () { + var keyPrefix = self._dbInfo.keyPrefix; + + for (var i = localStorage.length - 1; i >= 0; i--) { + var key = localStorage.key(i); + + if (key.indexOf(keyPrefix) === 0) { + localStorage.removeItem(key); + } + } + }); + + executeCallback(promise, callback); + return promise; +} + +// Retrieve an item from the store. Unlike the original async_storage +// library in Gaia, we don't modify return values at all. If a key's value +// is `undefined`, we pass that value to the callback function. +function getItem$2(key, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var result = localStorage.getItem(dbInfo.keyPrefix + key); + + // If a result was found, parse it from the serialized + // string into a JS object. If result isn't truthy, the key + // is likely undefined and we'll pass it straight to the + // callback. + if (result) { + result = dbInfo.serializer.deserialize(result); + } + + return result; + }); + + executeCallback(promise, callback); + return promise; +} + +// Iterate over all items in the store. +function iterate$2(iterator, callback) { + var self = this; + + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var keyPrefix = dbInfo.keyPrefix; + var keyPrefixLength = keyPrefix.length; + var length = localStorage.length; + + // We use a dedicated iterator instead of the `i` variable below + // so other keys we fetch in localStorage aren't counted in + // the `iterationNumber` argument passed to the `iterate()` + // callback. + // + // See: github.com/mozilla/localForage/pull/435#discussion_r38061530 + var iterationNumber = 1; + + for (var i = 0; i < length; i++) { + var key = localStorage.key(i); + if (key.indexOf(keyPrefix) !== 0) { + continue; + } + var value = localStorage.getItem(key); + + // If a result was found, parse it from the serialized + // string into a JS object. If result isn't truthy, the + // key is likely undefined and we'll pass it straight + // to the iterator. + if (value) { + value = dbInfo.serializer.deserialize(value); + } + + value = iterator(value, key.substring(keyPrefixLength), iterationNumber++); + + if (value !== void 0) { + return value; + } + } + }); + + executeCallback(promise, callback); + return promise; +} + +// Same as localStorage's key() method, except takes a callback. +function key$2(n, callback) { + var self = this; + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var result; + try { + result = localStorage.key(n); + } catch (error) { + result = null; + } + + // Remove the prefix from the key, if a key is found. + if (result) { + result = result.substring(dbInfo.keyPrefix.length); + } + + return result; + }); + + executeCallback(promise, callback); + return promise; +} + +function keys$2(callback) { + var self = this; + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var length = localStorage.length; + var keys = []; + + for (var i = 0; i < length; i++) { + var itemKey = localStorage.key(i); + if (itemKey.indexOf(dbInfo.keyPrefix) === 0) { + keys.push(itemKey.substring(dbInfo.keyPrefix.length)); + } + } + + return keys; + }); + + executeCallback(promise, callback); + return promise; +} + +// Supply the number of keys in the datastore to the callback function. +function length$2(callback) { + var self = this; + var promise = self.keys().then(function (keys) { + return keys.length; + }); + + executeCallback(promise, callback); + return promise; +} + +// Remove an item from the store, nice and simple. +function removeItem$2(key, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + localStorage.removeItem(dbInfo.keyPrefix + key); + }); + + executeCallback(promise, callback); + return promise; +} + +// Set a key's value and run an optional callback once the value is set. +// Unlike Gaia's implementation, the callback function is passed the value, +// in case you want to operate on that value only after you're sure it +// saved, or something like that. +function setItem$2(key, value, callback) { + var self = this; + + key = normalizeKey(key); + + var promise = self.ready().then(function () { + // Convert undefined values to null. + // https://github.com/mozilla/localForage/pull/42 + if (value === undefined) { + value = null; + } + + // Save the original value to pass to the callback. + var originalValue = value; + + return new Promise$1(function (resolve, reject) { + var dbInfo = self._dbInfo; + dbInfo.serializer.serialize(value, function (value, error) { + if (error) { + reject(error); + } else { + try { + localStorage.setItem(dbInfo.keyPrefix + key, value); + resolve(originalValue); + } catch (e) { + // localStorage capacity exceeded. + // TODO: Make this a specific error/event. + if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') { + reject(e); + } + reject(e); + } + } + }); + }); + }); + + executeCallback(promise, callback); + return promise; +} + +function dropInstance$2(options, callback) { + callback = getCallback.apply(this, arguments); + + options = typeof options !== 'function' && options || {}; + if (!options.name) { + var currentConfig = this.config(); + options.name = options.name || currentConfig.name; + options.storeName = options.storeName || currentConfig.storeName; + } + + var self = this; + var promise; + if (!options.name) { + promise = Promise$1.reject('Invalid arguments'); + } else { + promise = new Promise$1(function (resolve) { + if (!options.storeName) { + resolve(options.name + '/'); + } else { + resolve(_getKeyPrefix(options, self._defaultConfig)); + } + }).then(function (keyPrefix) { + for (var i = localStorage.length - 1; i >= 0; i--) { + var key = localStorage.key(i); + + if (key.indexOf(keyPrefix) === 0) { + localStorage.removeItem(key); + } + } + }); + } + + executeCallback(promise, callback); + return promise; +} + +var localStorageWrapper = { + _driver: 'localStorageWrapper', + _initStorage: _initStorage$2, + _support: isLocalStorageValid(), + iterate: iterate$2, + getItem: getItem$2, + setItem: setItem$2, + removeItem: removeItem$2, + clear: clear$2, + length: length$2, + key: key$2, + keys: keys$2, + dropInstance: dropInstance$2 +}; + +var sameValue = function sameValue(x, y) { + return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y); +}; + +var includes = function includes(array, searchElement) { + var len = array.length; + var i = 0; + while (i < len) { + if (sameValue(array[i], searchElement)) { + return true; + } + i++; + } + + return false; +}; + +var isArray = Array.isArray || function (arg) { + return Object.prototype.toString.call(arg) === '[object Array]'; +}; + +// Drivers are stored here when `defineDriver()` is called. +// They are shared across all instances of localForage. +var DefinedDrivers = {}; + +var DriverSupport = {}; + +var DefaultDrivers = { + INDEXEDDB: asyncStorage, + WEBSQL: webSQLStorage, + LOCALSTORAGE: localStorageWrapper +}; + +var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver]; + +var OptionalDriverMethods = ['dropInstance']; + +var LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods); + +var DefaultConfig = { + description: '', + driver: DefaultDriverOrder.slice(), + name: 'localforage', + // Default DB size is _JUST UNDER_ 5MB, as it's the highest size + // we can use without a prompt. + size: 4980736, + storeName: 'keyvaluepairs', + version: 1.0 +}; + +function callWhenReady(localForageInstance, libraryMethod) { + localForageInstance[libraryMethod] = function () { + var _args = arguments; + return localForageInstance.ready().then(function () { + return localForageInstance[libraryMethod].apply(localForageInstance, _args); + }); + }; +} + +function extend() { + for (var i = 1; i < arguments.length; i++) { + var arg = arguments[i]; + + if (arg) { + for (var _key in arg) { + if (arg.hasOwnProperty(_key)) { + if (isArray(arg[_key])) { + arguments[0][_key] = arg[_key].slice(); + } else { + arguments[0][_key] = arg[_key]; + } + } + } + } + } + + return arguments[0]; +} + +var LocalForage = function () { + function LocalForage(options) { + _classCallCheck(this, LocalForage); + + for (var driverTypeKey in DefaultDrivers) { + if (DefaultDrivers.hasOwnProperty(driverTypeKey)) { + var driver = DefaultDrivers[driverTypeKey]; + var driverName = driver._driver; + this[driverTypeKey] = driverName; + + if (!DefinedDrivers[driverName]) { + // we don't need to wait for the promise, + // since the default drivers can be defined + // in a blocking manner + this.defineDriver(driver); + } + } + } + + this._defaultConfig = extend({}, DefaultConfig); + this._config = extend({}, this._defaultConfig, options); + this._driverSet = null; + this._initDriver = null; + this._ready = false; + this._dbInfo = null; + + this._wrapLibraryMethodsWithReady(); + this.setDriver(this._config.driver)["catch"](function () {}); + } + + // Set any config values for localForage; can be called anytime before + // the first API call (e.g. `getItem`, `setItem`). + // We loop through options so we don't overwrite existing config + // values. + + + LocalForage.prototype.config = function config(options) { + // If the options argument is an object, we use it to set values. + // Otherwise, we return either a specified config value or all + // config values. + if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') { + // If localforage is ready and fully initialized, we can't set + // any new configuration values. Instead, we return an error. + if (this._ready) { + return new Error("Can't call config() after localforage " + 'has been used.'); + } + + for (var i in options) { + if (i === 'storeName') { + options[i] = options[i].replace(/\W/g, '_'); + } + + if (i === 'version' && typeof options[i] !== 'number') { + return new Error('Database version must be a number.'); + } + + this._config[i] = options[i]; + } + + // after all config options are set and + // the driver option is used, try setting it + if ('driver' in options && options.driver) { + return this.setDriver(this._config.driver); + } + + return true; + } else if (typeof options === 'string') { + return this._config[options]; + } else { + return this._config; + } + }; + + // Used to define a custom driver, shared across all instances of + // localForage. + + + LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) { + var promise = new Promise$1(function (resolve, reject) { + try { + var driverName = driverObject._driver; + var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver'); + + // A driver name should be defined and not overlap with the + // library-defined, default drivers. + if (!driverObject._driver) { + reject(complianceError); + return; + } + + var driverMethods = LibraryMethods.concat('_initStorage'); + for (var i = 0, len = driverMethods.length; i < len; i++) { + var driverMethodName = driverMethods[i]; + + // when the property is there, + // it should be a method even when optional + var isRequired = !includes(OptionalDriverMethods, driverMethodName); + if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') { + reject(complianceError); + return; + } + } + + var configureMissingMethods = function configureMissingMethods() { + var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) { + return function () { + var error = new Error('Method ' + methodName + ' is not implemented by the current driver'); + var promise = Promise$1.reject(error); + executeCallback(promise, arguments[arguments.length - 1]); + return promise; + }; + }; + + for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) { + var optionalDriverMethod = OptionalDriverMethods[_i]; + if (!driverObject[optionalDriverMethod]) { + driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod); + } + } + }; + + configureMissingMethods(); + + var setDriverSupport = function setDriverSupport(support) { + if (DefinedDrivers[driverName]) { + console.info('Redefining LocalForage driver: ' + driverName); + } + DefinedDrivers[driverName] = driverObject; + DriverSupport[driverName] = support; + // don't use a then, so that we can define + // drivers that have simple _support methods + // in a blocking manner + resolve(); + }; + + if ('_support' in driverObject) { + if (driverObject._support && typeof driverObject._support === 'function') { + driverObject._support().then(setDriverSupport, reject); + } else { + setDriverSupport(!!driverObject._support); + } + } else { + setDriverSupport(true); + } + } catch (e) { + reject(e); + } + }); + + executeTwoCallbacks(promise, callback, errorCallback); + return promise; + }; + + LocalForage.prototype.driver = function driver() { + return this._driver || null; + }; + + LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) { + var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.')); + + executeTwoCallbacks(getDriverPromise, callback, errorCallback); + return getDriverPromise; + }; + + LocalForage.prototype.getSerializer = function getSerializer(callback) { + var serializerPromise = Promise$1.resolve(localforageSerializer); + executeTwoCallbacks(serializerPromise, callback); + return serializerPromise; + }; + + LocalForage.prototype.ready = function ready(callback) { + var self = this; + + var promise = self._driverSet.then(function () { + if (self._ready === null) { + self._ready = self._initDriver(); + } + + return self._ready; + }); + + executeTwoCallbacks(promise, callback, callback); + return promise; + }; + + LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) { + var self = this; + + if (!isArray(drivers)) { + drivers = [drivers]; + } + + var supportedDrivers = this._getSupportedDrivers(drivers); + + function setDriverToConfig() { + self._config.driver = self.driver(); + } + + function extendSelfWithDriver(driver) { + self._extend(driver); + setDriverToConfig(); + + self._ready = self._initStorage(self._config); + return self._ready; + } + + function initDriver(supportedDrivers) { + return function () { + var currentDriverIndex = 0; + + function driverPromiseLoop() { + while (currentDriverIndex < supportedDrivers.length) { + var driverName = supportedDrivers[currentDriverIndex]; + currentDriverIndex++; + + self._dbInfo = null; + self._ready = null; + + return self.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop); + } + + setDriverToConfig(); + var error = new Error('No available storage method found.'); + self._driverSet = Promise$1.reject(error); + return self._driverSet; + } + + return driverPromiseLoop(); + }; + } + + // There might be a driver initialization in progress + // so wait for it to finish in order to avoid a possible + // race condition to set _dbInfo + var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function () { + return Promise$1.resolve(); + }) : Promise$1.resolve(); + + this._driverSet = oldDriverSetDone.then(function () { + var driverName = supportedDrivers[0]; + self._dbInfo = null; + self._ready = null; + + return self.getDriver(driverName).then(function (driver) { + self._driver = driver._driver; + setDriverToConfig(); + self._wrapLibraryMethodsWithReady(); + self._initDriver = initDriver(supportedDrivers); + }); + })["catch"](function () { + setDriverToConfig(); + var error = new Error('No available storage method found.'); + self._driverSet = Promise$1.reject(error); + return self._driverSet; + }); + + executeTwoCallbacks(this._driverSet, callback, errorCallback); + return this._driverSet; + }; + + LocalForage.prototype.supports = function supports(driverName) { + return !!DriverSupport[driverName]; + }; + + LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) { + extend(this, libraryMethodsAndProperties); + }; + + LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) { + var supportedDrivers = []; + for (var i = 0, len = drivers.length; i < len; i++) { + var driverName = drivers[i]; + if (this.supports(driverName)) { + supportedDrivers.push(driverName); + } + } + return supportedDrivers; + }; + + LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() { + // Add a stub for each driver API method that delays the call to the + // corresponding driver method until localForage is ready. These stubs + // will be replaced by the driver methods as soon as the driver is + // loaded, so there is no performance impact. + for (var i = 0, len = LibraryMethods.length; i < len; i++) { + callWhenReady(this, LibraryMethods[i]); + } + }; + + LocalForage.prototype.createInstance = function createInstance(options) { + return new LocalForage(options); + }; + + return LocalForage; +}(); + +// The actual localForage object that we expose as a module or via a +// global. It's extended by pulling in one of our other libraries. + + +var localforage_js = new LocalForage(); + +module.exports = localforage_js; + +},{"3":3}]},{},[4])(4) +}); diff --git a/src/main/resources/gwt/material/design/incubator/client/storage/resources/js/localforage.min.js b/src/main/resources/gwt/material/design/incubator/client/storage/resources/js/localforage.min.js new file mode 100644 index 000000000..eb8753492 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/storage/resources/js/localforage.min.js @@ -0,0 +1,7 @@ +/*! + localForage -- Offline Storage, Improved + Version 1.7.3 + https://localforage.github.io/localForage + (c) 2013-2017 Mozilla, Apache License 2.0 +*/ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.versiona.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[b.storeName],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a Date: Fri, 5 Jul 2019 11:13:04 +0800 Subject: [PATCH 107/247] Iteration for 2.3-SNAPSHOT --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 3443dc244..900884876 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.2 + 2.3-SNAPSHOT gwt-material-addins gwt-lib Gwt Material Addins - 2.2 + 2.3-SNAPSHOT Extra Components of GWT Material Framework - 2.2 + 2.3-SNAPSHOT scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.2 + v2.3-SNAPSHOT From ad6822575002788f9eca5c3705087d743571fb03 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 8 Jul 2019 08:22:53 +0800 Subject: [PATCH 108/247] Dnd Cleanup --- .../design/addins/client/dnd/MaterialDnd.java | 108 ++++++++++++------ .../client/dnd/event/InteractCommonEvent.java | 95 +++++++++++++++ .../client/dnd/event/InteractDragEvent.java | 19 +++ .../client/dnd/event/InteractDropEvent.java | 33 ++++++ .../event/dispatch/DragEventDispatcher.java | 85 ++++++++++++++ .../event/dispatch/DropEventDispatcher.java | 59 ++++++++++ .../DefaultDragMoveEventListener.java | 32 ++++++ .../dnd/event/listener/DragEventListener.java | 8 ++ 8 files changed, 402 insertions(+), 37 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java create mode 100644 src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java diff --git a/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java b/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java index 1e35b1a0b..35d34fb9e 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java @@ -7,9 +7,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. @@ -25,13 +25,16 @@ import gwt.material.design.addins.client.base.constants.AddinsCssName; import gwt.material.design.addins.client.dnd.constants.DragEvents; import gwt.material.design.addins.client.dnd.constants.DropEvents; +import gwt.material.design.addins.client.dnd.event.InteractDragEvent; +import gwt.material.design.addins.client.dnd.event.dispatch.DragEventDispatcher; +import gwt.material.design.addins.client.dnd.event.dispatch.DropEventDispatcher; +import gwt.material.design.addins.client.dnd.event.listener.DefaultDragMoveEventListener; +import gwt.material.design.addins.client.dnd.event.listener.DragEventListener; import gwt.material.design.addins.client.dnd.js.JsDnd; import gwt.material.design.addins.client.dnd.js.JsDragOptions; import gwt.material.design.addins.client.dnd.js.JsDropOptions; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.MaterialWidget; -import gwt.material.design.client.events.*; -import gwt.material.design.jquery.client.api.Event; //@formatter:off @@ -74,27 +77,35 @@ public class MaterialDnd { private JsDropOptions dropOptions; private JsDragOptions dragOptions; private String ignoreFromClassName; + private DragEventListener dragMoveListener; + private DragEventDispatcher dragEventDispatcher; + private DropEventDispatcher dropEventDispatcher; - protected MaterialDnd(MaterialWidget target) { + public MaterialDnd(MaterialWidget target) { this.target = target; + this.dragEventDispatcher = new DragEventDispatcher(target); + this.dropEventDispatcher = new DropEventDispatcher(target); } - protected MaterialDnd draggable() { + public MaterialDnd draggable() { if (jsDnd == null) { jsDnd = JsDnd.interact(target.getElement()); // Events - jsDnd.off(DragEvents.DRAG_MOVE).on(DragEvents.DRAG_MOVE, event -> { - move(event); - DragMoveEvent.fire(this.target); + jsDnd.off(DragEvents.DRAG_START).on(DragEvents.DRAG_START, event -> { + dragEventDispatcher.fireDragStartEvent(); return true; }); - jsDnd.off(DragEvents.DRAG_START).on(DragEvents.DRAG_START, event -> { - DragStartEvent.fire(this.target); + jsDnd.off(DragEvents.DRAG_MOVE).on(DragEvents.DRAG_MOVE, (event) -> { + if (dragMoveListener == null) { + dragMoveListener = new DefaultDragMoveEventListener(); + } + dragMoveListener.register((InteractDragEvent) event); + dragEventDispatcher.fireDragMoveEvent(); return true; }); jsDnd.off(DragEvents.DRAG_END).on(DragEvents.DRAG_END, event -> { - DragEndEvent.fire(this.target); + dragEventDispatcher.fireDragEndEvent(); return true; }); } @@ -102,16 +113,6 @@ protected MaterialDnd draggable() { return this; } - public MaterialDnd draggable(JsDragOptions options) { - dragOptions = options; - if (target.isAttached()) { - draggable(); - } else { - target.registerHandler(target.addAttachHandler(event -> draggable(), true)); - } - return this; - } - public static MaterialDnd draggable(MaterialWidget target) { return draggable(target, JsDragOptions.create()); } @@ -126,23 +127,23 @@ protected MaterialDnd dropzone() { // Events jsDnd.off(DropEvents.DROP_ACTIVATE).on(DropEvents.DROP_ACTIVATE, event -> { - DropActivateEvent.fire(this.target); + dropEventDispatcher.fireDropActiveEvent(); return true; }); jsDnd.off(DragEvents.DRAG_ENTER).on(DragEvents.DRAG_ENTER, event -> { - DragEnterEvent.fire(this.target, event.getRelatedTarget()); + dragEventDispatcher.fireDragEnterEvent(event.getRelatedTarget()); return true; }); jsDnd.off(DragEvents.DRAG_LEAVE).on(DragEvents.DRAG_LEAVE, event -> { - DragLeaveEvent.fire(this.target, event.getRelatedTarget()); + dragEventDispatcher.fireDragLeaveEvent(event.getRelatedTarget()); return true; }); jsDnd.off(DropEvents.DROP).on(DropEvents.DROP, event -> { - DropEvent.fire(this.target, event.getRelatedTarget()); + dropEventDispatcher.fireDropEvent(event.getRelatedTarget()); return true; }); jsDnd.off(DropEvents.DROP_DEACTIVATE).on(DropEvents.DROP_DEACTIVATE, event -> { - DropDeactivateEvent.fire(this.target); + dropEventDispatcher.fireDropDeactivateEvent(); return true; }); } @@ -151,6 +152,36 @@ protected MaterialDnd dropzone() { return this; } + public void unload() { + unloadDragEvents(); + unloadDropEvents(); + } + + public void unloadDragEvents() { + jsDnd.off(DragEvents.DRAG_MOVE); + jsDnd.off(DragEvents.DRAG_START); + jsDnd.off(DragEvents.DRAG_END); + jsDnd.off(DropEvents.DROP_ACTIVATE); + jsDnd.off(DragEvents.DRAG_ENTER); + jsDnd.off(DragEvents.DRAG_LEAVE); + } + + public void unloadDropEvents() { + jsDnd.off(DropEvents.DROP_ACTIVATE); + jsDnd.off(DropEvents.DROP); + jsDnd.off(DropEvents.DROP_DEACTIVATE); + } + + public MaterialDnd draggable(JsDragOptions options) { + dragOptions = options; + if (target.isAttached()) { + draggable(); + } else { + target.registerHandler(target.addAttachHandler(event -> draggable(), true)); + } + return this; + } + public MaterialDnd dropzone(JsDropOptions options) { dropOptions = options; if (target.isAttached()) { @@ -212,20 +243,23 @@ public JsDropOptions getDropOptions() { return dropOptions; } + public void setDropOptions(JsDropOptions dropOptions) { + this.dropOptions = dropOptions; + } + public JsDragOptions getDragOptions() { return dragOptions; } - public static native void move(Event event) /*-{ - var target = event.target, - x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx, - y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; + public void setDragOptions(JsDragOptions dragOptions) { + this.dragOptions = dragOptions; + } - target.style.webkitTransform = - target.style.transform = - 'translate(' + x + 'px, ' + y + 'px)'; + public DragEventListener getDragMoveListener() { + return dragMoveListener; + } - target.setAttribute('data-x', x); - target.setAttribute('data-y', y); - }-*/; + public void setDragMoveListener(DragEventListener dragMoveListener) { + this.dragMoveListener = dragMoveListener; + } } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java new file mode 100644 index 000000000..e6ad2dea8 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java @@ -0,0 +1,95 @@ +package gwt.material.design.addins.client.dnd.event; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.jquery.client.api.Event; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.Date; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class InteractCommonEvent extends Event { + + public InteractCommonEvent(String type) { + super(type); + } + + /** + * The element that is being interacted with + */ + @JsProperty + public Element target; + + /** + * The Interactable that is being interacted with + */ + @JsProperty + public Object interactable; + + /** + * The Interaction that the event belongs to + */ + @JsProperty + public Object interaction; + + /** + * Page x coordinate of the starting event + */ + @JsProperty + public float x0; + + /** + * Page y coordinate of the starting event + */ + @JsProperty + public float y0; + + /** + * Client x coordinate of the starting event + */ + @JsProperty + public float clientX0; + + /** + * Client y coordinate of the starting event + */ + @JsProperty + public float clientY0; + + /** + * Change in coordinates of the mouse/touch + */ + @JsProperty + public float dx; + + /** + * Change in coordinates of the mouse/touch + */ + @JsProperty + public float dy; + + /** + * The Velocity of the pointer + */ + @JsProperty + public float velocityX; + + /** + * The Velocity of the pointer + */ + @JsProperty + public float velocityY; + + /** + * The speed of the pointer + */ + @JsProperty + public double speed; + + /** + * The time of creation of the event object + */ + @JsProperty + public Date timeStamp; +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java new file mode 100644 index 000000000..fbbd6105a --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java @@ -0,0 +1,19 @@ +package gwt.material.design.addins.client.dnd.event; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class InteractDragEvent extends InteractCommonEvent { + + public InteractDragEvent(String type) { + super(type); + } + + @JsProperty + public Object dragEnter; + + @JsProperty + public Object dragLeave; +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java new file mode 100644 index 000000000..48ff36aad --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java @@ -0,0 +1,33 @@ +package gwt.material.design.addins.client.dnd.event; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.Date; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class InteractDropEvent extends InteractCommonEvent { + + public InteractDropEvent(String type) { + super(type); + } + + @JsProperty + public Object dropzone; + + @JsProperty + public Object relatedTarget; + + @JsProperty + public Object draggable; + + @JsProperty + public InteractDragEvent dragEvent; + + @JsProperty + public Date timeStamp; + + @JsProperty + public String type; +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java new file mode 100644 index 000000000..3f844c11a --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java @@ -0,0 +1,85 @@ +package gwt.material.design.addins.client.dnd.event.dispatch; + +import com.google.gwt.event.shared.GwtEvent; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.client.events.*; +import gwt.material.design.jquery.client.api.JQueryElement; + +public class DragEventDispatcher { + + private final MaterialWidget target; + + public DragEventDispatcher(MaterialWidget target) { + this.target = target; + } + + public void fireDragStartEvent() { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DragStartEvent.TYPE; + } + + @Override + public void dispatch(DragStartEvent.DragStartHandler handler) { + handler.onDragStart(new DragStartEvent()); + } + }); + } + + public void fireDragMoveEvent() { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DragMoveEvent.TYPE; + } + + @Override + public void dispatch(DragMoveEvent.DragMoveHandler handler) { + handler.onDragMove(new DragMoveEvent()); + } + }); + } + + public void fireDragEndEvent() { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DragEndEvent.TYPE; + } + + @Override + public void dispatch(DragEndEvent.DragEndHandler handler) { + handler.onDragEnd(new DragEndEvent()); + } + }); + } + + public void fireDragEnterEvent(JQueryElement relatedTarget) { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DragEnterEvent.TYPE; + } + + @Override + protected void dispatch(DragEnterEvent.DragEnterHandler handler) { + handler.onDragEnter(new DragEnterEvent(relatedTarget)); + } + }); + } + + public void fireDragLeaveEvent(JQueryElement relatedTarget) { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DragLeaveEvent.TYPE; + } + + @Override + protected void dispatch(DragLeaveEvent.DragLeaveHandler handler) { + handler.onDragLeave(new DragLeaveEvent(relatedTarget)); + } + }); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java new file mode 100644 index 000000000..1ed120087 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java @@ -0,0 +1,59 @@ +package gwt.material.design.addins.client.dnd.event.dispatch; + +import com.google.gwt.event.shared.GwtEvent; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.client.events.DropActivateEvent; +import gwt.material.design.client.events.DropDeactivateEvent; +import gwt.material.design.client.events.DropEvent; +import gwt.material.design.jquery.client.api.JQueryElement; + +public class DropEventDispatcher { + + private final MaterialWidget target; + + public DropEventDispatcher(MaterialWidget target) { + this.target = target; + } + + public void fireDropActiveEvent() { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DropActivateEvent.TYPE; + } + + @Override + protected void dispatch(DropActivateEvent.DropActivateHandler handler) { + handler.onDropActivate(new DropActivateEvent()); + } + }); + } + + public void fireDropEvent(JQueryElement relatedTarget) { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DropEvent.TYPE; + } + + @Override + protected void dispatch(DropEvent.DropHandler handler) { + handler.onDrop(new DropEvent(relatedTarget)); + } + }); + } + + public void fireDropDeactivateEvent() { + target.fireEvent(new GwtEvent() { + @Override + public Type getAssociatedType() { + return DropDeactivateEvent.TYPE; + } + + @Override + protected void dispatch(DropDeactivateEvent.DropDeactivateHandler handler) { + handler.onDropDeactivate(new DropDeactivateEvent()); + } + }); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java new file mode 100644 index 000000000..e5462ff88 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java @@ -0,0 +1,32 @@ +package gwt.material.design.addins.client.dnd.event.listener; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.addins.client.dnd.event.InteractDragEvent; + +public class DefaultDragMoveEventListener implements DragEventListener { + + @Override + public void register(InteractDragEvent event) { + Element target = event.target; + + String dataX = target.getAttribute("data-x"); + String dataY = target.getAttribute("data-y"); + + float dx = parseAttributeToFloat(dataX, event.dx); + float dy = parseAttributeToFloat(dataY, event.dy); + + target.getStyle().setProperty("transform", "translate(" + dx + "px, " + dy + "px)"); + target.setAttribute("data-x", String.valueOf(dx)); + target.setAttribute("data-y", String.valueOf(dy)); + } + + protected float parseAttributeToFloat(String attribute, float dataValue) { + float value = 0; + try { + value = Float.parseFloat(attribute); + } catch (Exception e) { + + } + return value + dataValue; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java new file mode 100644 index 000000000..02b098d6b --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java @@ -0,0 +1,8 @@ +package gwt.material.design.addins.client.dnd.event.listener; + +import gwt.material.design.addins.client.dnd.event.InteractDragEvent; + +public interface DragEventListener { + + void register(InteractDragEvent event); +} From 50448f19caa93dde18d1f7002d0938b15c1fde0d Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 9 Jul 2019 08:52:50 +0800 Subject: [PATCH 109/247] Enhancements on OnScreenKeyboard --- .../keyboard/NumericScreenKeyboard.java | 4 +- .../client/keyboard/ScreenKeyboard.java | 31 ++------------- .../keyboard/binder/DefaultShiftBinder.java | 38 ------------------- .../client/keyboard/binder/KeyBinder.java | 28 -------------- .../client/keyboard/events/KeyPressEvent.java | 9 ++--- .../client/keyboard/js/KeyboardLayout.java | 30 ++++++++++++++- 6 files changed, 38 insertions(+), 102 deletions(-) delete mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java delete mode 100644 src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java index 4f9b639a4..862d04b23 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/NumericScreenKeyboard.java @@ -32,8 +32,8 @@ protected void load() { super.load(); KeyboardLayout layout = new KeyboardLayout(); - layout.defaultLayout = new String[]{"1 2 3", "4 5 6", "7 8 9", "{shift} 0 -", "{bksp}"}; - layout.shiftLayout = new String[]{"! / #", "$ % ^", "& * (", "{shift} ) +", "{bksp}"}; + layout.setDefaultLayout(new String[]{"1 2 3", "4 5 6", "7 8 9", "{shift} 0 -", "{bksp}"}); + layout.setShiftLayout(new String[]{"! / #", "$ % ^", "& * (", "{shift} ) +", "{bksp}"}); options.setLayout(layout); options.setTheme("hg-theme-default hg-layout-numeric numeric-theme"); updateOptions(options); diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java index bd8af53ff..c0bc4f7f9 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java @@ -7,9 +7,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,9 +24,6 @@ import com.google.gwt.event.shared.HandlerRegistration; import gwt.material.design.client.MaterialDesign; import gwt.material.design.client.base.MaterialWidget; -import gwt.material.design.incubator.client.keyboard.binder.DefaultShiftBinder; -import gwt.material.design.incubator.client.keyboard.binder.KeyBinder; -import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; import gwt.material.design.incubator.client.keyboard.events.*; import gwt.material.design.incubator.client.keyboard.js.Keyboard; import gwt.material.design.incubator.client.keyboard.js.KeyboardOptions; @@ -54,7 +51,6 @@ public class ScreenKeyboard extends MaterialWidget implements HasScreenKeyboardH private static final String SIMPLE_KEYBOARD_PROPERTY = "SimpleKeyboard"; protected Keyboard keyboard; protected KeyboardOptions options = new KeyboardOptions(); - protected KeyBinder shiftBinding = new DefaultShiftBinder(); public ScreenKeyboard() { super(Document.get().createDivElement(), "simple-keyboard"); @@ -69,7 +65,7 @@ protected void onLoad() { protected void load() { // Initial SimpleKeyboard Defaults - SimpleKeyboard simpleKeyboard = (SimpleKeyboard) JQuery.window().getPropertyObject(SIMPLE_KEYBOARD_PROPERTY); + SimpleKeyboard simpleKeyboard = (SimpleKeyboard) JQuery.window().getPropertyObject(SIMPLE_KEYBOARD_PROPERTY); JQuery.window().setPropertyObject(KEYBOARD_PROPERTY, simpleKeyboard._default); if (options != null) { @@ -78,14 +74,7 @@ protected void load() { options.beforeRender = () -> BeforeRenderEvent.fire(this); options.onRender = () -> RenderEvent.fire(this); options.onInit = () -> InitEvent.fire(this); - options.onKeyPress = button -> { - KeyboardButton keyboardButton = null; - if (button != null) { - keyboardButton = KeyboardButton.get(button); - shiftBinding.bind(this, keyboardButton); - } - KeyPressEvent.fire(this, keyboardButton); - }; + options.onKeyPress = button -> KeyPressEvent.fire(this, button); options.onChange = input -> ChangeEvent.fire(this, input); options.onChangeAll = input -> ChangeAllEvent.fire(this, input); @@ -198,18 +187,6 @@ public Keyboard getKeyboard() { return keyboard; } - public KeyBinder getShiftBinding() { - return shiftBinding; - } - - /** - * Set the default shift binding registration. - * @see DefaultShiftBinder - */ - public void setShiftBinding(KeyBinder shiftBinding) { - this.shiftBinding = shiftBinding; - } - public Element getKeyboardDOM() { return keyboard.keyboardDOM; } diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java deleted file mode 100644 index b833e01a4..000000000 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/DefaultShiftBinder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2019 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.keyboard.binder; - -import gwt.material.design.incubator.client.keyboard.ScreenKeyboard; -import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; -import gwt.material.design.incubator.client.keyboard.js.KeyboardOptions; - -public class DefaultShiftBinder implements KeyBinder { - - @Override - public void bind(ScreenKeyboard screenKeyboard, KeyboardButton button) { - if (button != null && (button.equals(KeyboardButton.SHIFT) || button.equals(KeyboardButton.LOCK))) { - String currentLayout = screenKeyboard.getOptions().getLayoutName(); - String shiftToggle = currentLayout.equals("default") ? "shift" : "default"; - KeyboardOptions options = screenKeyboard.getOptions(); - options.setLayoutName(shiftToggle); - screenKeyboard.updateOptions(options); - } - } -} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java b/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java deleted file mode 100644 index 88f5e5ef1..000000000 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/binder/KeyBinder.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2019 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.incubator.client.keyboard.binder; - -import gwt.material.design.incubator.client.keyboard.ScreenKeyboard; -import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; - -public interface KeyBinder { - - void bind(ScreenKeyboard keyboard, KeyboardButton button); -} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java b/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java index b1a55da78..f9a0583d2 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/events/KeyPressEvent.java @@ -22,7 +22,6 @@ import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; -import gwt.material.design.incubator.client.keyboard.constants.KeyboardButton; //@formatter:off @@ -35,9 +34,9 @@ public class KeyPressEvent extends GwtEvent { public static final Type TYPE = new Type<>(); - private KeyboardButton button; + private String button; - public KeyPressEvent(KeyboardButton button) { + public KeyPressEvent(String button) { this.button = button; } @@ -45,7 +44,7 @@ public static Type getType() { return TYPE; } - public static void fire(HasHandlers source, KeyboardButton message) { + public static void fire(HasHandlers source, String message) { source.fireEvent(new KeyPressEvent(message)); } @@ -59,7 +58,7 @@ protected void dispatch(KeyPressHandler handler) { handler.onKeyPress(this); } - public KeyboardButton getButton() { + public String getButton() { return button; } diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java index df03bad8a..0d2d394da 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/js/KeyboardLayout.java @@ -28,13 +28,39 @@ public class KeyboardLayout { @JsProperty(name = "default") - public String[] defaultLayout; + private String[] defaultLayout; @JsProperty(name = "shift") - public String[] shiftLayout; + private String[] shiftLayout; + + @JsProperty(name = "alt") + private String[] altLayout; + + @JsProperty(name = "smileys") + private String[] smileysLayout; @JsOverlay public final String[] getDefaultLayout() { return defaultLayout; } + + @JsOverlay + public final void setDefaultLayout(String[] defaultLayout) { + this.defaultLayout = defaultLayout; + } + + @JsOverlay + public final void setShiftLayout(String[] shiftLayout) { + this.shiftLayout = shiftLayout; + } + + @JsOverlay + public final void setAltLayout(String[] altLayout) { + this.altLayout = altLayout; + } + + @JsOverlay + public final void setSmileysLayout(String[] smileysLayout) { + this.smileysLayout = smileysLayout; + } } From f6ceee799b35ea322af34de2eb10895969ff60b3 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 23 Jul 2019 09:39:21 +0800 Subject: [PATCH 110/247] More enhancements on Dnd. --- .../design/addins/client/dnd/MaterialDnd.java | 6 +- .../client/dnd/event/InteractCommonEvent.java | 19 + .../client/dnd/event/InteractDragEvent.java | 19 + .../client/dnd/event/InteractDropEvent.java | 19 + .../event/dispatch/DragEventDispatcher.java | 19 + .../event/dispatch/DropEventDispatcher.java | 19 + .../DefaultDragMoveEventListener.java | 19 + .../dnd/event/listener/DragEventListener.java | 19 + .../addresslookup/js/options/LatLng.java | 13 +- .../client/google/geocoder/js/Geocoder.java | 32 + .../google/geocoder/js/GeocoderOption.java | 32 + .../client/keyboard/ScreenKeyboard.java | 4 +- .../client/dnd/resources/js/interact.js | 14237 ++++++++++------ .../client/dnd/resources/js/interact.min.js | 128 +- .../resources/css/content-placeholder.css | 1 + .../resources/css/content-placeholder.min.css | 2 +- 16 files changed, 9293 insertions(+), 5295 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/google/geocoder/js/Geocoder.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/geocoder/js/GeocoderOption.java diff --git a/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java b/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java index 35d34fb9e..2b2f22104 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/MaterialDnd.java @@ -7,9 +7,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. @@ -262,4 +262,4 @@ public DragEventListener getDragMoveListener() { public void setDragMoveListener(DragEventListener dragMoveListener) { this.dragMoveListener = dragMoveListener; } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java index e6ad2dea8..1b1c8045e 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractCommonEvent.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event; import com.google.gwt.dom.client.Element; diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java index fbbd6105a..26d41e62d 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDragEvent.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event; import jsinterop.annotations.JsPackage; diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java index 48ff36aad..9018c03b8 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/InteractDropEvent.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event; import jsinterop.annotations.JsPackage; diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java index 3f844c11a..8bed6700e 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DragEventDispatcher.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event.dispatch; import com.google.gwt.event.shared.GwtEvent; diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java index 1ed120087..272a8b28e 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/dispatch/DropEventDispatcher.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event.dispatch; import com.google.gwt.event.shared.GwtEvent; diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java index e5462ff88..972fb5776 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DefaultDragMoveEventListener.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event.listener; import com.google.gwt.dom.client.Element; diff --git a/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java index 02b098d6b..5ea8f603e 100644 --- a/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java +++ b/src/main/java/gwt/material/design/addins/client/dnd/event/listener/DragEventListener.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.dnd.event.listener; import gwt.material.design.addins.client.dnd.event.InteractDragEvent; diff --git a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/js/options/LatLng.java b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/js/options/LatLng.java index 59928d5e7..557e1bba2 100644 --- a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/js/options/LatLng.java +++ b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/js/options/LatLng.java @@ -21,6 +21,7 @@ import jsinterop.annotations.JsMethod; import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; /** @@ -46,6 +47,14 @@ @JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) public class LatLng { + @JsProperty + public double lat; + + @JsProperty + public double lng; + + public LatLng() {} + public LatLng(double lattitude, double longitude) { } @@ -59,13 +68,13 @@ public LatLng(double lattitude, double longitude) { * Returns the latitude in degrees. */ @JsMethod - public native Double lat(); + public native double lat(); /** * Returns the longitude in degrees. */ @JsMethod - public native Double lng(); + public native double lng(); /** * Converts to JSON representation. This function is intended to be used via JSON.stringify. diff --git a/src/main/java/gwt/material/design/incubator/client/google/geocoder/js/Geocoder.java b/src/main/java/gwt/material/design/incubator/client/google/geocoder/js/Geocoder.java new file mode 100644 index 000000000..f1fa35ac3 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/geocoder/js/Geocoder.java @@ -0,0 +1,32 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.geocoder.js; + +import gwt.material.design.incubator.client.google.addresslookup.js.options.PlaceResult; +import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, namespace = "google.maps", name = "Geocoder") +public class Geocoder { + + @JsMethod + public native void geocode(GeocoderOption option, Functions.Func2 result); +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/geocoder/js/GeocoderOption.java b/src/main/java/gwt/material/design/incubator/client/google/geocoder/js/GeocoderOption.java new file mode 100644 index 000000000..037240024 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/geocoder/js/GeocoderOption.java @@ -0,0 +1,32 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.geocoder.js; + +import gwt.material.design.incubator.client.google.addresslookup.js.options.LatLng; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class GeocoderOption { + + @JsProperty + public LatLng location; +} diff --git a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java index c0bc4f7f9..c7d1d17b9 100644 --- a/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java +++ b/src/main/java/gwt/material/design/incubator/client/keyboard/ScreenKeyboard.java @@ -7,9 +7,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. diff --git a/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.js b/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.js index 555715327..140b4665c 100644 --- a/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.js +++ b/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.js @@ -1,5976 +1,9887 @@ /** - * interact.js v1.2.6 + * interact.js 1.5.3 * - * Copyright (c) 2012-2015 Taye Adeyemi - * Open source under the MIT License. + * Copyright (c) 2012-2019 Taye Adeyemi + * Released under the MIT License. * https://raw.github.com/taye/interact.js/master/LICENSE */ -(function (realWindow) { - 'use strict'; - - // return early if there's no window to work with (eg. Node.js) - if (!realWindow) { return; } - - var // get wrapped window if using Shadow DOM polyfill - window = (function () { - // create a TextNode - var el = realWindow.document.createTextNode(''); - - // check if it's wrapped by a polyfill - if (el.ownerDocument !== realWindow.document - && typeof realWindow.wrap === 'function' - && realWindow.wrap(el) === el) { - // return wrapped window - return realWindow.wrap(realWindow); - } - - // no Shadow DOM polyfil or native implementation - return realWindow; - }()), - - document = window.document, - DocumentFragment = window.DocumentFragment || blank, - SVGElement = window.SVGElement || blank, - SVGSVGElement = window.SVGSVGElement || blank, - SVGElementInstance = window.SVGElementInstance || blank, - HTMLElement = window.HTMLElement || window.Element, - - PointerEvent = (window.PointerEvent || window.MSPointerEvent), - pEventTypes, - - hypot = Math.hypot || function (x, y) { return Math.sqrt(x * x + y * y); }, - - tmpXY = {}, // reduce object creation in getXY() - - documents = [], // all documents being listened to - - interactables = [], // all set interactables - interactions = [], // all interactions - - dynamicDrop = false, - - // { - // type: { - // selectors: ['selector', ...], - // contexts : [document, ...], - // listeners: [[listener, useCapture], ...] - // } - // } - delegatedEvents = {}, - - defaultOptions = { - base: { - accept : null, - actionChecker : null, - styleCursor : true, - preventDefault: 'auto', - origin : { x: 0, y: 0 }, - deltaSource : 'page', - allowFrom : null, - ignoreFrom : null, - _context : document, - dropChecker : null - }, - - drag: { - enabled: false, - manualStart: true, - max: Infinity, - maxPerElement: 1, - - snap: null, - restrict: null, - inertia: null, - autoScroll: null, - - axis: 'xy' - }, - - drop: { - enabled: false, - accept: null, - overlap: 'pointer' - }, - - resize: { - enabled: false, - manualStart: false, - max: Infinity, - maxPerElement: 1, - - snap: null, - restrict: null, - inertia: null, - autoScroll: null, - - square: false, - preserveAspectRatio: false, - axis: 'xy', - - // use default margin - margin: NaN, - - // object with props left, right, top, bottom which are - // true/false values to resize when the pointer is over that edge, - // CSS selectors to match the handles for each direction - // or the Elements for each handle - edges: null, - - // a value of 'none' will limit the resize rect to a minimum of 0x0 - // 'negate' will alow the rect to have negative width/height - // 'reposition' will keep the width/height positive by swapping - // the top and bottom edges and/or swapping the left and right edges - invert: 'none' - }, - - gesture: { - manualStart: false, - enabled: false, - max: Infinity, - maxPerElement: 1, - - restrict: null - }, - - perAction: { - manualStart: false, - max: Infinity, - maxPerElement: 1, - - snap: { - enabled : false, - endOnly : false, - range : Infinity, - targets : null, - offsets : null, - - relativePoints: null - }, - - restrict: { - enabled: false, - endOnly: false - }, - - autoScroll: { - enabled : false, - container : null, // the item that is scrolled (Window or HTMLElement) - margin : 60, - speed : 300 // the scroll speed in pixels per second - }, - - inertia: { - enabled : false, - resistance : 10, // the lambda in exponential decay - minSpeed : 100, // target speed must be above this for inertia to start - endSpeed : 10, // the speed at which inertia is slow enough to stop - allowResume : true, // allow resuming an action in inertia phase - zeroResumeDelta : true, // if an action is resumed after launch, set dx/dy to 0 - smoothEndDuration: 300 // animate to snap/restrict endOnly if there's no inertia - } - }, - - _holdDuration: 600 - }, - - // Things related to autoScroll - autoScroll = { - interaction: null, - i: null, // the handle returned by window.setInterval - x: 0, y: 0, // Direction each pulse is to scroll in - - // scroll the window by the values in scroll.x/y - scroll: function () { - var options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll, - container = options.container || getWindow(autoScroll.interaction.element), - now = new Date().getTime(), - // change in time in seconds - dtx = (now - autoScroll.prevTimeX) / 1000, - dty = (now - autoScroll.prevTimeY) / 1000, - vx, vy, sx, sy; - - // displacement - if (options.velocity) { - vx = options.velocity.x; - vy = options.velocity.y; - } - else { - vx = vy = options.speed - } - - sx = vx * dtx; - sy = vy * dty; - - if (sx >= 1 || sy >= 1) { - if (isWindow(container)) { - container.scrollBy(autoScroll.x * sx, autoScroll.y * sy); - } - else if (container) { - container.scrollLeft += autoScroll.x * sx; - container.scrollTop += autoScroll.y * sy; - } - - if (sx >=1) autoScroll.prevTimeX = now; - if (sy >= 1) autoScroll.prevTimeY = now; - } - - if (autoScroll.isScrolling) { - cancelFrame(autoScroll.i); - autoScroll.i = reqFrame(autoScroll.scroll); - } - }, - - isScrolling: false, - prevTimeX: 0, - prevTimeY: 0, - - start: function (interaction) { - autoScroll.isScrolling = true; - cancelFrame(autoScroll.i); - - autoScroll.interaction = interaction; - autoScroll.prevTimeX = new Date().getTime(); - autoScroll.prevTimeY = new Date().getTime(); - autoScroll.i = reqFrame(autoScroll.scroll); - }, - - stop: function () { - autoScroll.isScrolling = false; - cancelFrame(autoScroll.i); - } - }, - - // Does the browser support touch input? - supportsTouch = (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch), - - // Does the browser support PointerEvents - supportsPointerEvent = !!PointerEvent, - - // Less Precision with touch input - margin = supportsTouch || supportsPointerEvent? 20: 10, - - pointerMoveTolerance = 1, - - // for ignoring browser's simulated mouse events - prevTouchTime = 0, - - // Allow this many interactions to happen simultaneously - maxInteractions = Infinity, - - // Check if is IE9 or older - actionCursors = (document.all && !window.atob) ? { - drag : 'move', - resizex : 'e-resize', - resizey : 's-resize', - resizexy: 'se-resize', - - resizetop : 'n-resize', - resizeleft : 'w-resize', - resizebottom : 's-resize', - resizeright : 'e-resize', - resizetopleft : 'se-resize', - resizebottomright: 'se-resize', - resizetopright : 'ne-resize', - resizebottomleft : 'ne-resize', - - gesture : '' - } : { - drag : 'move', - resizex : 'ew-resize', - resizey : 'ns-resize', - resizexy: 'nwse-resize', - - resizetop : 'ns-resize', - resizeleft : 'ew-resize', - resizebottom : 'ns-resize', - resizeright : 'ew-resize', - resizetopleft : 'nwse-resize', - resizebottomright: 'nwse-resize', - resizetopright : 'nesw-resize', - resizebottomleft : 'nesw-resize', - - gesture : '' - }, +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.interact = f()}})(function(){var define,module,exports; +var createModuleFactory = function createModuleFactory(t){var e;return function(r){return e||t(e={exports:{},parent:r},e.exports),e.exports}}; +var _$scope_24 = createModuleFactory(function (module, exports) { +"use strict"; - actionIsEnabled = { - drag : true, - resize : true, - gesture: true - }, +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* common-shake removed: exports.createScope = */ void createScope; +/* common-shake removed: exports.initScope = */ void initScope; +exports.Scope = exports.ActionName = void 0; - // because Webkit and Opera still use 'mousewheel' event type - wheelEvent = 'onmousewheel' in document? 'mousewheel': 'wheel', - - eventTypes = [ - 'dragstart', - 'dragmove', - 'draginertiastart', - 'dragend', - 'dragenter', - 'dragleave', - 'dropactivate', - 'dropdeactivate', - 'dropmove', - 'drop', - 'resizestart', - 'resizemove', - 'resizeinertiastart', - 'resizeend', - 'gesturestart', - 'gesturemove', - 'gestureinertiastart', - 'gestureend', - - 'down', - 'move', - 'up', - 'cancel', - 'tap', - 'doubletap', - 'hold' - ], - - globalEvents = {}, - - // Opera Mobile must be handled differently - isOperaMobile = navigator.appName == 'Opera' && - supportsTouch && - navigator.userAgent.match('Presto'), - - // scrolling doesn't change the result of getClientRects on iOS 7 - isIOS7 = (/iP(hone|od|ad)/.test(navigator.platform) - && /OS 7[^\d]/.test(navigator.appVersion)), - - // prefix matchesSelector - prefixedMatchesSelector = 'matches' in Element.prototype? - 'matches': 'webkitMatchesSelector' in Element.prototype? - 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype? - 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype? - 'oMatchesSelector': 'msMatchesSelector', - - // will be polyfill function if browser is IE8 - ie8MatchesSelector, - - // native requestAnimationFrame or polyfill - reqFrame = realWindow.requestAnimationFrame, - cancelFrame = realWindow.cancelAnimationFrame, - - // Events wrapper - events = (function () { - var useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window), - addEvent = useAttachEvent? 'attachEvent': 'addEventListener', - removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener', - on = useAttachEvent? 'on': '', - - elements = [], - targets = [], - attachedListeners = []; - - function add (element, type, listener, useCapture) { - var elementIndex = indexOf(elements, element), - target = targets[elementIndex]; - - if (!target) { - target = { - events: {}, - typeCount: 0 - }; - - elementIndex = elements.push(element) - 1; - targets.push(target); - - attachedListeners.push((useAttachEvent ? { - supplied: [], - wrapped : [], - useCount: [] - } : null)); - } - - if (!target.events[type]) { - target.events[type] = []; - target.typeCount++; - } - - if (!contains(target.events[type], listener)) { - var ret; - - if (useAttachEvent) { - var listeners = attachedListeners[elementIndex], - listenerIndex = indexOf(listeners.supplied, listener); - - var wrapped = listeners.wrapped[listenerIndex] || function (event) { - if (!event.immediatePropagationStopped) { - event.target = event.srcElement; - event.currentTarget = element; - - event.preventDefault = event.preventDefault || preventDef; - event.stopPropagation = event.stopPropagation || stopProp; - event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp; - - if (/mouse|click/.test(event.type)) { - event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft; - event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop; - } - - listener(event); - } - }; - - ret = element[addEvent](on + type, wrapped, Boolean(useCapture)); - - if (listenerIndex === -1) { - listeners.supplied.push(listener); - listeners.wrapped.push(wrapped); - listeners.useCount.push(1); - } - else { - listeners.useCount[listenerIndex]++; - } - } - else { - ret = element[addEvent](type, listener, useCapture || false); - } - target.events[type].push(listener); - - return ret; - } - } +var utils = _interopRequireWildcard(_$utils_56); - function remove (element, type, listener, useCapture) { - var i, - elementIndex = indexOf(elements, element), - target = targets[elementIndex], - listeners, - listenerIndex, - wrapped = listener; - - if (!target || !target.events) { - return; - } - - if (useAttachEvent) { - listeners = attachedListeners[elementIndex]; - listenerIndex = indexOf(listeners.supplied, listener); - wrapped = listeners.wrapped[listenerIndex]; - } - - if (type === 'all') { - for (type in target.events) { - if (target.events.hasOwnProperty(type)) { - remove(element, type, 'all'); - } - } - return; - } - - if (target.events[type]) { - var len = target.events[type].length; - - if (listener === 'all') { - for (i = 0; i < len; i++) { - remove(element, type, target.events[type][i], Boolean(useCapture)); - } - return; - } else { - for (i = 0; i < len; i++) { - if (target.events[type][i] === listener) { - element[removeEvent](on + type, wrapped, useCapture || false); - target.events[type].splice(i, 1); - - if (useAttachEvent && listeners) { - listeners.useCount[listenerIndex]--; - if (listeners.useCount[listenerIndex] === 0) { - listeners.supplied.splice(listenerIndex, 1); - listeners.wrapped.splice(listenerIndex, 1); - listeners.useCount.splice(listenerIndex, 1); - } - } - - break; - } - } - } - - if (target.events[type] && target.events[type].length === 0) { - target.events[type] = null; - target.typeCount--; - } - } - - if (!target.typeCount) { - targets.splice(elementIndex, 1); - elements.splice(elementIndex, 1); - attachedListeners.splice(elementIndex, 1); - } - } +var _domObjects = _interopRequireDefault(_$domObjects_50); - function preventDef () { - this.returnValue = false; - } +var _defaultOptions = _interopRequireDefault(_$defaultOptions_20); - function stopProp () { - this.cancelBubble = true; - } +var _Eventable = _interopRequireDefault(_$Eventable_14); - function stopImmProp () { - this.cancelBubble = true; - this.immediatePropagationStopped = true; - } +var _Interactable = _interopRequireDefault(_$Interactable_16); - return { - add: add, - remove: remove, - useAttachEvent: useAttachEvent, +var _InteractableSet = _interopRequireDefault(_$InteractableSet_17); - _elements: elements, - _targets: targets, - _attachedListeners: attachedListeners - }; - }()); +var _InteractEvent = _interopRequireDefault(_$InteractEvent_15); - function blank () {} +var _interactions = _interopRequireDefault(_$interactions_23({})); - function isElement (o) { - if (!o || (typeof o !== 'object')) { return false; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - var _window = getWindow(o) || window; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - return (/object|function/.test(typeof _window.Element) - ? o instanceof _window.Element //DOM2 - : o.nodeType === 1 && typeof o.nodeName === "string"); - } - function isWindow (thing) { return thing === window || !!(thing && thing.Window) && (thing instanceof thing.Window); } - function isDocFrag (thing) { return !!thing && thing instanceof DocumentFragment; } - function isArray (thing) { - return isObject(thing) - && (typeof thing.length !== undefined) - && isFunction(thing.splice); - } - function isObject (thing) { return !!thing && (typeof thing === 'object'); } - function isFunction (thing) { return typeof thing === 'function'; } - function isNumber (thing) { return typeof thing === 'number' ; } - function isBool (thing) { return typeof thing === 'boolean' ; } - function isString (thing) { return typeof thing === 'string' ; } +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - function trySelector (value) { - if (!isString(value)) { return false; } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - // an exception will be raised if it is invalid - document.querySelector(value); - return true; - } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - function extend (dest, source) { - for (var prop in source) { - dest[prop] = source[prop]; - } - return dest; - } +function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } - var prefixedPropREs = { - webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/ - }; +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } - function pointerExtend (dest, source) { - for (var prop in source) { - var deprecated = false; +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - // skip deprecated prefixed properties - for (var vendor in prefixedPropREs) { - if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { - deprecated = true; - break; - } - } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - if (!deprecated) { - dest[prop] = source[prop]; - } - } - return dest; - } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - function copyCoords (dest, src) { - dest.page = dest.page || {}; - dest.page.x = src.page.x; - dest.page.y = src.page.y; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - dest.client = dest.client || {}; - dest.client.x = src.client.x; - dest.client.y = src.client.y; +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - dest.timeStamp = src.timeStamp; - } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - function setEventXY (targetObj, pointers, interaction) { - var pointer = (pointers.length > 1 - ? pointerAverage(pointers) - : pointers[0]); +var win = utils.win, + browser = utils.browser, + raf = utils.raf, + Signals = utils.Signals, + events = utils.events; +var ActionName; +exports.ActionName = ActionName; - getPageXY(pointer, tmpXY, interaction); - targetObj.page.x = tmpXY.x; - targetObj.page.y = tmpXY.y; +(function (ActionName) {})(ActionName || (exports.ActionName = ActionName = {})); - getClientXY(pointer, tmpXY, interaction); - targetObj.client.x = tmpXY.x; - targetObj.client.y = tmpXY.y; +function createScope() { + return new Scope(); +} - targetObj.timeStamp = new Date().getTime(); - } +var Scope = +/*#__PURE__*/ +function () { + function Scope() { + var _this = this; - function setEventDeltas (targetObj, prev, cur) { - targetObj.page.x = cur.page.x - prev.page.x; - targetObj.page.y = cur.page.y - prev.page.y; - targetObj.client.x = cur.client.x - prev.client.x; - targetObj.client.y = cur.client.y - prev.client.y; - targetObj.timeStamp = new Date().getTime() - prev.timeStamp; + _classCallCheck(this, Scope); - // set pointer velocity - var dt = Math.max(targetObj.timeStamp / 1000, 0.001); - targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt; - targetObj.page.vx = targetObj.page.x / dt; - targetObj.page.vy = targetObj.page.y / dt; + this.id = "__interact_scope_".concat(Math.floor(Math.random() * 100)); + this.signals = new Signals(); + this.browser = browser; + this.events = events; + this.utils = utils; + this.defaults = utils.clone(_defaultOptions["default"]); + this.Eventable = _Eventable["default"]; + this.actions = { + names: [], + methodDict: {}, + eventTypes: [] + }; + this.InteractEvent = _InteractEvent["default"]; + this.interactables = new _InteractableSet["default"](this); // all documents being listened to - targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt; - targetObj.client.vx = targetObj.client.x / dt; - targetObj.client.vy = targetObj.client.y / dt; - } + this.documents = []; + this._plugins = []; + this._pluginMap = {}; - function isNativePointer (pointer) { - return (pointer instanceof window.Event - || (supportsTouch && window.Touch && pointer instanceof window.Touch)); - } + this.onWindowUnload = function (event) { + return _this.removeDocument(event.target); + }; - // Get specified X/Y coords for mouse or event.touches[0] - function getXY (type, pointer, xy) { - xy = xy || {}; - type = type || 'page'; + var scope = this; - xy.x = pointer[type + 'X']; - xy.y = pointer[type + 'Y']; + this.Interactable = + /*#__PURE__*/ + function (_InteractableBase) { + _inherits(Interactable, _InteractableBase); - return xy; - } + function Interactable() { + _classCallCheck(this, Interactable); - function getPageXY (pointer, page) { - page = page || {}; + return _possibleConstructorReturn(this, _getPrototypeOf(Interactable).apply(this, arguments)); + } - // Opera Mobile handles the viewport and scrolling oddly - if (isOperaMobile && isNativePointer(pointer)) { - getXY('screen', pointer, page); + _createClass(Interactable, [{ + key: "set", + value: function set(options) { + _get(_getPrototypeOf(Interactable.prototype), "set", this).call(this, options); - page.x += window.scrollX; - page.y += window.scrollY; + scope.interactables.signals.fire('set', { + options: options, + interactable: this + }); + return this; } - else { - getXY('page', pointer, page); + }, { + key: "unset", + value: function unset() { + _get(_getPrototypeOf(Interactable.prototype), "unset", this).call(this); + + for (var i = scope.interactions.list.length - 1; i >= 0; i--) { + var interaction = scope.interactions.list[i]; + + if (interaction.interactable === this) { + interaction.stop(); + scope.interactions.signals.fire('destroy', { + interaction: interaction + }); + interaction.destroy(); + + if (scope.interactions.list.length > 2) { + scope.interactions.list.splice(i, 1); + } + } + } + + scope.interactables.signals.fire('unset', { + interactable: this + }); } + }, { + key: "_defaults", + get: function get() { + return scope.defaults; + } + }]); + + return Interactable; + }(_Interactable["default"]); + } - return page; + _createClass(Scope, [{ + key: "init", + value: function init(window) { + return initScope(this, window); } + }, { + key: "pluginIsInstalled", + value: function pluginIsInstalled(plugin) { + return this._pluginMap[plugin.id] || this._plugins.indexOf(plugin) !== -1; + } + }, { + key: "usePlugin", + value: function usePlugin(plugin, options) { + if (this.pluginIsInstalled(plugin)) { + return this; + } - function getClientXY (pointer, client) { - client = client || {}; + if (plugin.id) { + this._pluginMap[plugin.id] = plugin; + } - if (isOperaMobile && isNativePointer(pointer)) { - // Opera Mobile handles the viewport and scrolling oddly - getXY('screen', pointer, client); - } - else { - getXY('client', pointer, client); - } + plugin.install(this, options); - return client; - } + this._plugins.push(plugin); - function getScrollXY (win) { - win = win || window; - return { - x: win.scrollX || win.document.documentElement.scrollLeft, - y: win.scrollY || win.document.documentElement.scrollTop - }; + return this; } - - function getPointerId (pointer) { - return isNumber(pointer.pointerId)? pointer.pointerId : pointer.identifier; + }, { + key: "addDocument", + value: function addDocument(doc, options) { + // do nothing if document is already known + if (this.getDocIndex(doc) !== -1) { + return false; + } + + var window = win.getWindow(doc); + options = options ? utils.extend({}, options) : {}; + this.documents.push({ + doc: doc, + options: options + }); + events.documents.push(doc); // don't add an unload event for the main document + // so that the page may be cached in browser history + + if (doc !== this.document) { + events.add(window, 'unload', this.onWindowUnload); + } + + this.signals.fire('add-document', { + doc: doc, + window: window, + scope: this, + options: options + }); + } + }, { + key: "removeDocument", + value: function removeDocument(doc) { + var index = this.getDocIndex(doc); + var window = win.getWindow(doc); + var options = this.documents[index].options; + events.remove(window, 'unload', this.onWindowUnload); + this.documents.splice(index, 1); + events.documents.splice(index, 1); + this.signals.fire('remove-document', { + doc: doc, + window: window, + scope: this, + options: options + }); } + }, { + key: "getDocIndex", + value: function getDocIndex(doc) { + for (var i = 0; i < this.documents.length; i++) { + if (this.documents[i].doc === doc) { + return i; + } + } - function getActualElement (element) { - return (element instanceof SVGElementInstance - ? element.correspondingUseElement - : element); + return -1; + } + }, { + key: "getDocOptions", + value: function getDocOptions(doc) { + var docIndex = this.getDocIndex(doc); + return docIndex === -1 ? null : this.documents[docIndex].options; } + }, { + key: "now", + value: function now() { + return (this.window.Date || Date).now(); + } + }]); - function getWindow (node) { - if (isWindow(node)) { - return node; - } + return Scope; +}(); - var rootNode = (node.ownerDocument || node); +exports.Scope = Scope; - return rootNode.defaultView || rootNode.parentWindow || window; - } +function initScope(scope, window) { + win.init(window); - function getElementClientRect (element) { - var clientRect = (element instanceof SVGElement - ? element.getBoundingClientRect() - : element.getClientRects()[0]); + _domObjects["default"].init(window); - return clientRect && { - left : clientRect.left, - right : clientRect.right, - top : clientRect.top, - bottom: clientRect.bottom, - width : clientRect.width || clientRect.right - clientRect.left, - height: clientRect.height || clientRect.bottom - clientRect.top - }; - } + browser.init(window); + raf.init(window); + events.init(window); + scope.usePlugin(_interactions["default"]); + scope.document = window.document; + scope.window = window; + return scope; +} - function getElementRect (element) { - var clientRect = getElementClientRect(element); +}); +var _$interactions_23 = createModuleFactory(function (module, exports) { +"use strict"; - if (!isIOS7 && clientRect) { - var scroll = getScrollXY(getWindow(element)); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; - clientRect.left += scroll.x; - clientRect.right += scroll.x; - clientRect.top += scroll.y; - clientRect.bottom += scroll.y; - } +var _browser = _interopRequireDefault(_$browser_48); - return clientRect; - } +var _domObjects = _interopRequireDefault(_$domObjects_50); - function getTouchPair (event) { - var touches = []; +/* removed: var _$domUtils_51 = require("@interactjs/utils/domUtils"); */; - // array of touches is supplied - if (isArray(event)) { - touches[0] = event[0]; - touches[1] = event[1]; - } - // an event - else { - if (event.type === 'touchend') { - if (event.touches.length === 1) { - touches[0] = event.touches[0]; - touches[1] = event.changedTouches[0]; - } - else if (event.touches.length === 0) { - touches[0] = event.changedTouches[0]; - touches[1] = event.changedTouches[1]; - } - } - else { - touches[0] = event.touches[0]; - touches[1] = event.touches[1]; - } - } +var _events = _interopRequireDefault(_$events_52); - return touches; - } +var _pointerUtils = _interopRequireDefault(_$pointerUtils_61); - function pointerAverage (pointers) { - var average = { - pageX : 0, - pageY : 0, - clientX: 0, - clientY: 0, - screenX: 0, - screenY: 0 - }; - var prop; +var _Signals = _interopRequireDefault(_$Signals_46); - for (var i = 0; i < pointers.length; i++) { - for (prop in average) { - average[prop] += pointers[i][prop]; - } - } - for (prop in average) { - average[prop] /= pointers.length; - } +var _Interaction = _interopRequireDefault(_$Interaction_18({})); - return average; - } +var _interactionFinder = _interopRequireDefault(_$interactionFinder_22); - function touchBBox (event) { - if (!event.length && !(event.touches && event.touches.length > 1)) { - return; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - var touches = getTouchPair(event), - minX = Math.min(touches[0].pageX, touches[1].pageX), - minY = Math.min(touches[0].pageY, touches[1].pageY), - maxX = Math.max(touches[0].pageX, touches[1].pageX), - maxY = Math.max(touches[0].pageY, touches[1].pageY); - - return { - x: minX, - y: minY, - left: minX, - top: minY, - width: maxX - minX, - height: maxY - minY - }; - } +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - function touchDistance (event, deltaSource) { - deltaSource = deltaSource || defaultOptions.deltaSource; +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - var sourceX = deltaSource + 'X', - sourceY = deltaSource + 'Y', - touches = getTouchPair(event); +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - var dx = touches[0][sourceX] - touches[1][sourceX], - dy = touches[0][sourceY] - touches[1][sourceY]; +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - return hypot(dx, dy); - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function touchAngle (event, prevAngle, deltaSource) { - deltaSource = deltaSource || defaultOptions.deltaSource; +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - var sourceX = deltaSource + 'X', - sourceY = deltaSource + 'Y', - touches = getTouchPair(event), - dx = touches[0][sourceX] - touches[1][sourceX], - dy = touches[0][sourceY] - touches[1][sourceY], - angle = 180 * Math.atan(dy / dx) / Math.PI; +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - if (isNumber(prevAngle)) { - var dr = angle - prevAngle, - drClamped = dr % 360; +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - if (drClamped > 315) { - angle -= 360 + (angle / 360)|0 * 360; - } - else if (drClamped > 135) { - angle -= 180 + (angle / 360)|0 * 360; - } - else if (drClamped < -315) { - angle += 360 + (angle / 360)|0 * 360; - } - else if (drClamped < -135) { - angle += 180 + (angle / 360)|0 * 360; - } - } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - return angle; - } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - function getOriginXY (interactable, element) { - var origin = interactable - ? interactable.options.origin - : defaultOptions.origin; +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - if (origin === 'parent') { - origin = parentElement(element); - } - else if (origin === 'self') { - origin = interactable.getRect(element); - } - else if (trySelector(origin)) { - origin = closest(element, origin) || { x: 0, y: 0 }; - } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - if (isFunction(origin)) { - origin = origin(interactable && element); - } +var methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur']; - if (isElement(origin)) { - origin = getElementRect(origin); - } +function install(scope) { + var signals = new _Signals["default"](); + var listeners = {}; - origin.x = ('x' in origin)? origin.x : origin.left; - origin.y = ('y' in origin)? origin.y : origin.top; + for (var _i = 0; _i < methodNames.length; _i++) { + var method = methodNames[_i]; + listeners[method] = doOnInteractions(method, scope); + } - return origin; - } + var pEventTypes = _browser["default"].pEventTypes; + var docEvents; - // http://stackoverflow.com/a/5634528/2280888 - function _getQBezierValue(t, p1, p2, p3) { - var iT = 1 - t; - return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; - } + if (_domObjects["default"].PointerEvent) { + docEvents = [{ + type: pEventTypes.down, + listener: releasePointersOnRemovedEls + }, { + type: pEventTypes.down, + listener: listeners.pointerDown + }, { + type: pEventTypes.move, + listener: listeners.pointerMove + }, { + type: pEventTypes.up, + listener: listeners.pointerUp + }, { + type: pEventTypes.cancel, + listener: listeners.pointerUp + }]; + } else { + docEvents = [{ + type: 'mousedown', + listener: listeners.pointerDown + }, { + type: 'mousemove', + listener: listeners.pointerMove + }, { + type: 'mouseup', + listener: listeners.pointerUp + }, { + type: 'touchstart', + listener: releasePointersOnRemovedEls + }, { + type: 'touchstart', + listener: listeners.pointerDown + }, { + type: 'touchmove', + listener: listeners.pointerMove + }, { + type: 'touchend', + listener: listeners.pointerUp + }, { + type: 'touchcancel', + listener: listeners.pointerUp + }]; + } - function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { - return { - x: _getQBezierValue(position, startX, cpX, endX), - y: _getQBezierValue(position, startY, cpY, endY) - }; + docEvents.push({ + type: 'blur', + listener: function listener(event) { + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref; + + _ref = scope.interactions.list[_i2]; + var interaction = _ref; + interaction.documentBlur(event); + } } + }); + scope.signals.on('add-document', onDocSignal); + scope.signals.on('remove-document', onDocSignal); // for ignoring browser's simulated mouse events - // http://gizma.com/easing/ - function easeOutQuad (t, b, c, d) { - t /= d; - return -c * t*(t-2) + b; - } + scope.prevTouchTime = 0; - function nodeContains (parent, child) { - while (child) { - if (child === parent) { - return true; - } + scope.Interaction = + /*#__PURE__*/ + function (_InteractionBase) { + _inherits(Interaction, _InteractionBase); - child = child.parentNode; - } + function Interaction() { + _classCallCheck(this, Interaction); - return false; + return _possibleConstructorReturn(this, _getPrototypeOf(Interaction).apply(this, arguments)); } - function closest (child, selector) { - var parent = parentElement(child); - - while (isElement(parent)) { - if (matchesSelector(parent, selector)) { return parent; } - - parent = parentElement(parent); + _createClass(Interaction, [{ + key: "_now", + value: function _now() { + return scope.now(); + } + }, { + key: "pointerMoveTolerance", + get: function get() { + return scope.interactions.pointerMoveTolerance; + }, + set: function set(value) { + scope.interactions.pointerMoveTolerance = value; + } + }]); + + return Interaction; + }(_Interaction["default"]); + + scope.interactions = { + signals: signals, + // all active and idle interactions + list: [], + "new": function _new(options) { + options.signals = signals; + var interaction = new scope.Interaction(options); + scope.interactions.list.push(interaction); + return interaction; + }, + listeners: listeners, + docEvents: docEvents, + pointerMoveTolerance: 1 + }; + + function releasePointersOnRemovedEls() { + // for all inactive touch interactions with pointers down + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref2; + + _ref2 = scope.interactions.list[_i3]; + var interaction = _ref2; + + if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) { + continue; + } // if a pointer is down on an element that is no longer in the DOM tree + + + var _loop = function _loop() { + _ref3 = interaction.pointers[_i4]; + var pointer = _ref3; + + if (!scope.documents.some(function (_ref4) { + var doc = _ref4.doc; + return (0, _$domUtils_51.nodeContains)(doc, pointer.downTarget); + })) { + // remove the pointer from the interaction + interaction.removePointer(pointer.pointer, pointer.event); } + }; - return null; + for (var _i4 = 0; _i4 < interaction.pointers.length; _i4++) { + var _ref3; + + _loop(); + } } + } +} - function parentElement (node) { - var parent = node.parentNode; +function doOnInteractions(method, scope) { + return function (event) { + var interactions = scope.interactions.list; - if (isDocFrag(parent)) { - // skip past #shado-root fragments - while ((parent = parent.host) && isDocFrag(parent)) {} + var pointerType = _pointerUtils["default"].getPointerType(event); - return parent; - } + var _pointerUtils$getEven = _pointerUtils["default"].getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 2), + eventTarget = _pointerUtils$getEven2[0], + curEventTarget = _pointerUtils$getEven2[1]; - return parent; - } + var matches = []; // [ [pointer, interaction], ...] - function inContext (interactable, element) { - return interactable._context === element.ownerDocument - || nodeContains(interactable._context, element); - } + if (/^touch/.test(event.type)) { + scope.prevTouchTime = scope.now(); - function testIgnore (interactable, interactableElement, element) { - var ignoreFrom = interactable.options.ignoreFrom; + for (var _i5 = 0; _i5 < event.changedTouches.length; _i5++) { + var _ref5; - if (!ignoreFrom || !isElement(element)) { return false; } + _ref5 = event.changedTouches[_i5]; + var changedTouch = _ref5; + var pointer = changedTouch; - if (isString(ignoreFrom)) { - return matchesUpTo(element, ignoreFrom, interactableElement); - } - else if (isElement(ignoreFrom)) { - return nodeContains(ignoreFrom, element); - } + var pointerId = _pointerUtils["default"].getPointerId(pointer); - return false; - } + var searchDetails = { + pointer: pointer, + pointerId: pointerId, + pointerType: pointerType, + eventType: event.type, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + scope: scope + }; + var interaction = getInteraction(searchDetails); + matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]); + } + } else { + var invalidPointer = false; + + if (!_browser["default"].supportsPointerEvent && /mouse/.test(event.type)) { + // ignore mouse events while touch interactions are active + for (var i = 0; i < interactions.length && !invalidPointer; i++) { + invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown; + } // try to ignore mouse events that are simulated by the browser + // after a touch event + + + invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated + event.timeStamp === 0; + } + + if (!invalidPointer) { + var _searchDetails = { + pointer: event, + pointerId: _pointerUtils["default"].getPointerId(event), + pointerType: pointerType, + eventType: event.type, + curEventTarget: curEventTarget, + eventTarget: eventTarget, + scope: scope + }; - function testAllow (interactable, interactableElement, element) { - var allowFrom = interactable.options.allowFrom; + var _interaction = getInteraction(_searchDetails); - if (!allowFrom) { return true; } + matches.push([_searchDetails.pointer, _searchDetails.eventTarget, _searchDetails.curEventTarget, _interaction]); + } + } // eslint-disable-next-line no-shadow - if (!isElement(element)) { return false; } - if (isString(allowFrom)) { - return matchesUpTo(element, allowFrom, interactableElement); - } - else if (isElement(allowFrom)) { - return nodeContains(allowFrom, element); - } + for (var _i6 = 0; _i6 < matches.length; _i6++) { + var _matches$_i = _slicedToArray(matches[_i6], 4), + _pointer = _matches$_i[0], + _eventTarget = _matches$_i[1], + _curEventTarget = _matches$_i[2], + _interaction2 = _matches$_i[3]; - return false; + _interaction2[method](_pointer, event, _eventTarget, _curEventTarget); } + }; +} + +function getInteraction(searchDetails) { + var pointerType = searchDetails.pointerType, + scope = searchDetails.scope; + + var foundInteraction = _interactionFinder["default"].search(searchDetails); + + var signalArg = { + interaction: foundInteraction, + searchDetails: searchDetails + }; + scope.interactions.signals.fire('find', signalArg); + return signalArg.interaction || scope.interactions["new"]({ + pointerType: pointerType + }); +} + +function onDocSignal(_ref6, signalName) { + var doc = _ref6.doc, + scope = _ref6.scope, + options = _ref6.options; + var docEvents = scope.interactions.docEvents; + var eventMethod = signalName.indexOf('add') === 0 ? _events["default"].add : _events["default"].remove; + + if (scope.browser.isIOS && !options.events) { + options.events = { + passive: false + }; + } // delegate event listener - function checkAxis (axis, interactable) { - if (!interactable) { return false; } - var thisAxis = interactable.options.drag.axis; + for (var eventType in _events["default"].delegatedEvents) { + eventMethod(doc, eventType, _events["default"].delegateListener); + eventMethod(doc, eventType, _events["default"].delegateUseCapture, true); + } - return (axis === 'xy' || thisAxis === 'xy' || thisAxis === axis); - } + var eventOptions = options && options.events; + + for (var _i7 = 0; _i7 < docEvents.length; _i7++) { + var _ref7; + + _ref7 = docEvents[_i7]; + var _ref8 = _ref7, + type = _ref8.type, + listener = _ref8.listener; + eventMethod(doc, type, listener, eventOptions); + } +} + +var _default = { + id: 'core/interactions', + install: install, + onDocSignal: onDocSignal, + doOnInteractions: doOnInteractions, + methodNames: methodNames +}; +exports["default"] = _default; - function checkSnap (interactable, action) { - var options = interactable.options; +}); +var _$Interaction_18 = createModuleFactory(function (module, exports) { +"use strict"; - if (/^resize/.test(action)) { - action = 'resize'; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "PointerInfo", { + enumerable: true, + get: function get() { + return _PointerInfo["default"]; + } +}); +exports["default"] = exports.Interaction = exports._ProxyMethods = exports._ProxyValues = void 0; + +var utils = _interopRequireWildcard(_$utils_56); + +var _InteractEvent = _interopRequireWildcard(_$InteractEvent_15); + +var _PointerInfo = _interopRequireDefault(_$PointerInfo_19); + +var _scope = _$scope_24({}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _ProxyValues; + +exports._ProxyValues = _ProxyValues; + +(function (_ProxyValues) { + _ProxyValues["interactable"] = ""; + _ProxyValues["element"] = ""; + _ProxyValues["prepared"] = ""; + _ProxyValues["pointerIsDown"] = ""; + _ProxyValues["pointerWasMoved"] = ""; + _ProxyValues["_proxy"] = ""; +})(_ProxyValues || (exports._ProxyValues = _ProxyValues = {})); + +var _ProxyMethods; + +exports._ProxyMethods = _ProxyMethods; + +(function (_ProxyMethods) { + _ProxyMethods["start"] = ""; + _ProxyMethods["move"] = ""; + _ProxyMethods["end"] = ""; + _ProxyMethods["stop"] = ""; + _ProxyMethods["interacting"] = ""; +})(_ProxyMethods || (exports._ProxyMethods = _ProxyMethods = {})); + +var Interaction = +/*#__PURE__*/ +function () { + /** */ + function Interaction(_ref) { + var _this = this; + + var pointerType = _ref.pointerType, + signals = _ref.signals; + + _classCallCheck(this, Interaction); + + // current interactable being interacted with + this.interactable = null; // the target element of the interactable + + this.element = null; // action that's ready to be fired on next move event + + this.prepared = { + name: null, + axis: null, + edges: null + }; // keep track of added pointers + + this.pointers = []; // pointerdown/mousedown/touchstart event + + this.downEvent = null; + this.downPointer = {}; + this._latestPointer = { + pointer: null, + event: null, + eventTarget: null + }; // previous action event + + this.prevEvent = null; + this.pointerIsDown = false; + this.pointerWasMoved = false; + this._interacting = false; + this._ending = false; + this._stopped = true; + this._proxy = null; + this.simulation = null; + /** + * @alias Interaction.prototype.move + */ + + this.doMove = utils.warnOnce(function (signalArg) { + this.move(signalArg); + }, 'The interaction.doMove() method has been renamed to interaction.move()'); + this.coords = { + // Starting InteractEvent pointer coordinates + start: utils.pointer.newCoords(), + // Previous native pointer move event coordinates + prev: utils.pointer.newCoords(), + // current native pointer move event coordinates + cur: utils.pointer.newCoords(), + // Change in coordinates and time of the pointer + delta: utils.pointer.newCoords(), + // pointer velocity + velocity: utils.pointer.newCoords() + }; + this._signals = signals; + this.pointerType = pointerType; + var that = this; + this._proxy = {}; + + var _loop = function _loop(key) { + Object.defineProperty(_this._proxy, key, { + get: function get() { + return that[key]; } + }); + }; - return options[action].snap && options[action].snap.enabled; + for (var key in _ProxyValues) { + _loop(key); } - function checkRestrict (interactable, action) { - var options = interactable.options; - - if (/^resize/.test(action)) { - action = 'resize'; + var _loop2 = function _loop2(key) { + Object.defineProperty(_this._proxy, key, { + value: function value() { + return that[key].apply(that, arguments); } + }); + }; - return options[action].restrict && options[action].restrict.enabled; + for (var key in _ProxyMethods) { + _loop2(key); } - function checkAutoScroll (interactable, action) { - var options = interactable.options; + this._signals.fire('new', { + interaction: this + }); + } + + _createClass(Interaction, [{ + key: "pointerDown", + value: function pointerDown(pointer, event, eventTarget) { + var pointerIndex = this.updatePointer(pointer, event, eventTarget, true); + + this._signals.fire('down', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + pointerIndex: pointerIndex, + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable({ + * // disable the default drag start by down->move + * manualStart: true + * }) + * // start dragging after the user holds the pointer down + * .on('hold', function (event) { + * var interaction = event.interaction + * + * if (!interaction.interacting()) { + * interaction.start({ name: 'drag' }, + * event.interactable, + * event.currentTarget) + * } + * }) + * ``` + * + * Start an action with the given Interactable and Element as tartgets. The + * action must be enabled for the target Interactable and an appropriate + * number of pointers must be held down - 1 for drag/resize, 2 for gesture. + * + * Use it with `interactable.able({ manualStart: false })` to always + * [start actions manually](https://github.com/taye/interact.js/issues/114) + * + * @param {object} action The action to be performed - drag, resize, etc. + * @param {Interactable} target The Interactable to target + * @param {Element} element The DOM Element to target + * @return {object} interact + */ + + }, { + key: "start", + value: function start(action, interactable, element) { + if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === _scope.ActionName.Gesture ? 2 : 1) || !interactable.options[action.name].enabled) { + return false; + } + + utils.copyAction(this.prepared, action); + this.interactable = interactable; + this.element = element; + this.rect = interactable.getRect(element); + this.edges = this.prepared.edges; + this._stopped = false; + this._interacting = this._doPhase({ + interaction: this, + event: this.downEvent, + phase: _InteractEvent.EventPhase.Start + }) && !this._stopped; + return this._interacting; + } + }, { + key: "pointerMove", + value: function pointerMove(pointer, event, eventTarget) { + if (!this.simulation && !(this.modifiers && this.modifiers.endPrevented)) { + this.updatePointer(pointer, event, eventTarget, false); + utils.pointer.setCoords(this.coords.cur, this.pointers.map(function (p) { + return p.pointer; + }), this._now()); + } + + var duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y; + var dx; + var dy; // register movement greater than pointerMoveTolerance + + if (this.pointerIsDown && !this.pointerWasMoved) { + dx = this.coords.cur.client.x - this.coords.start.client.x; + dy = this.coords.cur.client.y - this.coords.start.client.y; + this.pointerWasMoved = utils.hypot(dx, dy) > this.pointerMoveTolerance; + } + + var signalArg = { + pointer: pointer, + pointerIndex: this.getPointerIndex(pointer), + event: event, + eventTarget: eventTarget, + dx: dx, + dy: dy, + duplicate: duplicateMove, + interaction: this + }; + + if (!duplicateMove) { + // set pointer coordinate, time changes and velocity + utils.pointer.setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur); + utils.pointer.setCoordVelocity(this.coords.velocity, this.coords.delta); + } + + this._signals.fire('move', signalArg); + + if (!duplicateMove) { + // if interacting, fire an 'action-move' signal etc + if (this.interacting()) { + this.move(signalArg); + } - if (/^resize/.test(action)) { - action = 'resize'; + if (this.pointerWasMoved) { + utils.pointer.copyCoords(this.coords.prev, this.coords.cur); } + } + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('dragmove', function (event) { + * if (someCondition) { + * // change the snap settings + * event.interactable.draggable({ snap: { targets: [] }}) + * // fire another move event with re-calculated snap + * event.interaction.move() + * } + * }) + * ``` + * + * Force a move of the current action at the same coordinates. Useful if + * snap/restrict has been changed and you want a movement with the new + * settings. + */ + + }, { + key: "move", + value: function move(signalArg) { + signalArg = utils.extend({ + pointer: this._latestPointer.pointer, + event: this._latestPointer.event, + eventTarget: this._latestPointer.eventTarget, + interaction: this + }, signalArg || {}); + signalArg.phase = _InteractEvent.EventPhase.Move; + + this._doPhase(signalArg); + } // End interact move events and stop auto-scroll unless simulation is running + + }, { + key: "pointerUp", + value: function pointerUp(pointer, event, eventTarget, curEventTarget) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + pointerIndex = this.updatePointer(pointer, event, eventTarget, false); + } + + this._signals.fire(/cancel$/i.test(event.type) ? 'cancel' : 'up', { + pointer: pointer, + pointerIndex: pointerIndex, + event: event, + eventTarget: eventTarget, + curEventTarget: curEventTarget, + interaction: this + }); + + if (!this.simulation) { + this.end(event); + } + + this.pointerIsDown = false; + this.removePointer(pointer, event); + } + }, { + key: "documentBlur", + value: function documentBlur(event) { + this.end(event); + + this._signals.fire('blur', { + event: event, + interaction: this + }); + } + /** + * ```js + * interact(target) + * .draggable(true) + * .on('move', function (event) { + * if (event.pageX > 1000) { + * // end the current action + * event.interaction.end() + * // stop all further listeners from being called + * event.stopImmediatePropagation() + * } + * }) + * ``` + * + * @param {PointerEvent} [event] + */ + + }, { + key: "end", + value: function end(event) { + this._ending = true; + event = event || this._latestPointer.event; + var endPhaseResult; + + if (this.interacting()) { + endPhaseResult = this._doPhase({ + event: event, + interaction: this, + phase: _InteractEvent.EventPhase.End + }); + } - return options[action].autoScroll && options[action].autoScroll.enabled; + this._ending = false; + + if (endPhaseResult === true) { + this.stop(); + } + } + }, { + key: "currentAction", + value: function currentAction() { + return this._interacting ? this.prepared.name : null; + } + }, { + key: "interacting", + value: function interacting() { + return this._interacting; + } + /** */ + + }, { + key: "stop", + value: function stop() { + this._signals.fire('stop', { + interaction: this + }); + + this.interactable = this.element = null; + this._interacting = false; + this._stopped = true; + this.prepared.name = this.prevEvent = null; + } + }, { + key: "getPointerIndex", + value: function getPointerIndex(pointer) { + var pointerId = utils.pointer.getPointerId(pointer); // mouse and pen interactions may have only one pointer + + return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : utils.arr.findIndex(this.pointers, function (curPointer) { + return curPointer.id === pointerId; + }); + } + }, { + key: "getPointerInfo", + value: function getPointerInfo(pointer) { + return this.pointers[this.getPointerIndex(pointer)]; } + }, { + key: "updatePointer", + value: function updatePointer(pointer, event, eventTarget, down) { + var id = utils.pointer.getPointerId(pointer); + var pointerIndex = this.getPointerIndex(pointer); + var pointerInfo = this.pointers[pointerIndex]; + down = down === false ? false : down || /(down|start)$/i.test(event.type); + + if (!pointerInfo) { + pointerInfo = new _PointerInfo["default"](id, pointer, event, null, null); + pointerIndex = this.pointers.length; + this.pointers.push(pointerInfo); + } else { + pointerInfo.pointer = pointer; + } + + if (down) { + this.pointerIsDown = true; + + if (!this.interacting()) { + utils.pointer.setCoords(this.coords.start, this.pointers.map(function (p) { + return p.pointer; + }), this._now()); + utils.pointer.copyCoords(this.coords.cur, this.coords.start); + utils.pointer.copyCoords(this.coords.prev, this.coords.start); + utils.pointer.pointerExtend(this.downPointer, pointer); + this.downEvent = event; + pointerInfo.downTime = this.coords.cur.timeStamp; + pointerInfo.downTarget = eventTarget; + this.pointerWasMoved = false; + } + } - function withinInteractionLimit (interactable, element, action) { - var options = interactable.options, - maxActions = options[action.name].max, - maxPerElement = options[action.name].maxPerElement, - activeInteractions = 0, - targetCount = 0, - targetElementCount = 0; + this._updateLatestPointer(pointer, event, eventTarget); - for (var i = 0, len = interactions.length; i < len; i++) { - var interaction = interactions[i], - otherAction = interaction.prepared.name, - active = interaction.interacting(); + this._signals.fire('update-pointer', { + pointer: pointer, + event: event, + eventTarget: eventTarget, + down: down, + pointerInfo: pointerInfo, + pointerIndex: pointerIndex, + interaction: this + }); - if (!active) { continue; } + return pointerIndex; + } + }, { + key: "removePointer", + value: function removePointer(pointer, event) { + var pointerIndex = this.getPointerIndex(pointer); + + if (pointerIndex === -1) { + return; + } + + var pointerInfo = this.pointers[pointerIndex]; + + this._signals.fire('remove-pointer', { + pointer: pointer, + event: event, + pointerIndex: pointerIndex, + pointerInfo: pointerInfo, + interaction: this + }); + + this.pointers.splice(pointerIndex, 1); + } + }, { + key: "_updateLatestPointer", + value: function _updateLatestPointer(pointer, event, eventTarget) { + this._latestPointer.pointer = pointer; + this._latestPointer.event = event; + this._latestPointer.eventTarget = eventTarget; + } + }, { + key: "destroy", + value: function destroy() { + this._latestPointer.pointer = null; + this._latestPointer.event = null; + this._latestPointer.eventTarget = null; + } + }, { + key: "_createPreparedEvent", + value: function _createPreparedEvent(event, phase, preEnd, type) { + var actionName = this.prepared.name; + return new _InteractEvent["default"](this, event, actionName, phase, this.element, null, preEnd, type); + } + }, { + key: "_fireEvent", + value: function _fireEvent(iEvent) { + this.interactable.fire(iEvent); + + if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) { + this.prevEvent = iEvent; + } + } + }, { + key: "_doPhase", + value: function _doPhase(signalArg) { + var event = signalArg.event, + phase = signalArg.phase, + preEnd = signalArg.preEnd, + type = signalArg.type; - activeInteractions++; + var beforeResult = this._signals.fire("before-action-".concat(phase), signalArg); - if (activeInteractions >= maxInteractions) { - return false; - } + if (beforeResult === false) { + return false; + } - if (interaction.target !== interactable) { continue; } + var iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type); - targetCount += (otherAction === action.name)|0; + var rect = this.rect; - if (targetCount >= maxActions) { - return false; - } + if (rect) { + // update the rect modifications + var edges = this.edges || this.prepared.edges || { + left: true, + right: true, + top: true, + bottom: true + }; - if (interaction.element === element) { - targetElementCount++; + if (edges.top) { + rect.top += iEvent.delta.y; + } - if (otherAction !== action.name || targetElementCount >= maxPerElement) { - return false; - } - } + if (edges.bottom) { + rect.bottom += iEvent.delta.y; } - return maxInteractions > 0; - } + if (edges.left) { + rect.left += iEvent.delta.x; + } - // Test for the element that's "above" all other qualifiers - function indexOfDeepestElement (elements) { - var dropzone, - deepestZone = elements[0], - index = deepestZone? 0: -1, - parent, - deepestZoneParents = [], - dropzoneParents = [], - child, - i, - n; + if (edges.right) { + rect.right += iEvent.delta.x; + } - for (i = 1; i < elements.length; i++) { - dropzone = elements[i]; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + } - // an element might belong to multiple selector dropzones - if (!dropzone || dropzone === deepestZone) { - continue; - } + this._signals.fire("action-".concat(phase), signalArg); - if (!deepestZone) { - deepestZone = dropzone; - index = i; - continue; - } + this._fireEvent(iEvent); - // check if the deepest or current are document.documentElement or document.rootElement - // - if the current dropzone is, do nothing and continue - if (dropzone.parentNode === dropzone.ownerDocument) { - continue; - } - // - if deepest is, update with the current dropzone and continue to next - else if (deepestZone.parentNode === dropzone.ownerDocument) { - deepestZone = dropzone; - index = i; - continue; - } + this._signals.fire("after-action-".concat(phase), signalArg); - if (!deepestZoneParents.length) { - parent = deepestZone; - while (parent.parentNode && parent.parentNode !== parent.ownerDocument) { - deepestZoneParents.unshift(parent); - parent = parent.parentNode; - } - } + return true; + } + }, { + key: "_now", + value: function _now() { + return Date.now(); + } + }, { + key: "pointerMoveTolerance", + get: function get() { + return 1; + } + }]); + + return Interaction; +}(); + +exports.Interaction = Interaction; +var _default = Interaction; +exports["default"] = _default; + +}); +var _$arr_47 = {}; +"use strict"; + +Object.defineProperty(_$arr_47, "__esModule", { + value: true +}); +_$arr_47.contains = contains; +_$arr_47.remove = remove; +_$arr_47.merge = merge; +_$arr_47.from = from; +_$arr_47.findIndex = findIndex; +_$arr_47.find = find; + +function contains(array, target) { + return array.indexOf(target) !== -1; +} + +function remove(array, target) { + return array.splice(array.indexOf(target), 1); +} + +function merge(target, source) { + for (var _i = 0; _i < source.length; _i++) { + var _ref; + + _ref = source[_i]; + var item = _ref; + target.push(item); + } + + return target; +} + +function from(source) { + return merge([], source); +} + +function findIndex(array, func) { + for (var i = 0; i < array.length; i++) { + if (func(array[i], i, array)) { + return i; + } + } + + return -1; +} + +function find(array, func) { + return array[findIndex(array, func)]; +} + +var _$domObjects_50 = {}; +"use strict"; + +Object.defineProperty(_$domObjects_50, "__esModule", { + value: true +}); +_$domObjects_50["default"] = void 0; +var domObjects = { + init: init, + document: null, + DocumentFragment: null, + SVGElement: null, + SVGSVGElement: null, + // eslint-disable-next-line no-undef + SVGElementInstance: null, + Element: null, + HTMLElement: null, + Event: null, + Touch: null, + PointerEvent: null +}; + +function blank() {} + +var _default = domObjects; +_$domObjects_50["default"] = _default; + +function init(window) { + var win = window; + domObjects.document = win.document; + domObjects.DocumentFragment = win.DocumentFragment || blank; + domObjects.SVGElement = win.SVGElement || blank; + domObjects.SVGSVGElement = win.SVGSVGElement || blank; + domObjects.SVGElementInstance = win.SVGElementInstance || blank; + domObjects.Element = win.Element || blank; + domObjects.HTMLElement = win.HTMLElement || domObjects.Element; + domObjects.Event = win.Event; + domObjects.Touch = win.Touch || blank; + domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent; +} + +var _$isWindow_58 = {}; +"use strict"; + +Object.defineProperty(_$isWindow_58, "__esModule", { + value: true +}); +_$isWindow_58["default"] = void 0; + +var ___default_58 = function _default(thing) { + return !!(thing && thing.Window) && thing instanceof thing.Window; +}; + +_$isWindow_58["default"] = ___default_58; + +var _$window_66 = {}; +"use strict"; - // if this element is an svg element and the current deepest is - // an HTMLElement - if (deepestZone instanceof HTMLElement - && dropzone instanceof SVGElement - && !(dropzone instanceof SVGSVGElement)) { +Object.defineProperty(_$window_66, "__esModule", { + value: true +}); +_$window_66.init = __init_66; +_$window_66.getWindow = getWindow; +_$window_66["default"] = void 0; - if (dropzone === deepestZone.parentNode) { - continue; - } +var _isWindow = _interopRequireDefault(_$isWindow_58); - parent = dropzone.ownerSVGElement; - } - else { - parent = dropzone; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - dropzoneParents = []; +var win = { + realWindow: undefined, + window: undefined, + getWindow: getWindow, + init: __init_66 +}; - while (parent.parentNode !== parent.ownerDocument) { - dropzoneParents.unshift(parent); - parent = parent.parentNode; - } +function __init_66(window) { + // get wrapped window if using Shadow DOM polyfill + win.realWindow = window; // create a TextNode - n = 0; + var el = window.document.createTextNode(''); // check if it's wrapped by a polyfill - // get (position of last common ancestor) + 1 - while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { - n++; - } + if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) { + // use wrapped window + window = window.wrap(window); + } - var parents = [ - dropzoneParents[n - 1], - dropzoneParents[n], - deepestZoneParents[n] - ]; + win.window = window; +} - child = parents[0].lastChild; +if (typeof window === 'undefined') { + win.window = undefined; + win.realWindow = undefined; +} else { + __init_66(window); +} - while (child) { - if (child === parents[1]) { - deepestZone = dropzone; - index = i; - deepestZoneParents = []; +function getWindow(node) { + if ((0, _isWindow["default"])(node)) { + return node; + } - break; - } - else if (child === parents[2]) { - break; - } + var rootNode = node.ownerDocument || node; + return rootNode.defaultView || win.window; +} - child = child.previousSibling; - } - } +win.init = __init_66; +var ___default_66 = win; +_$window_66["default"] = ___default_66; - return index; - } +var _$is_57 = {}; +"use strict"; - function Interaction () { - this.target = null; // current interactable being interacted with - this.element = null; // the target element of the interactable - this.dropTarget = null; // the dropzone a drag target might be dropped into - this.dropElement = null; // the element at the time of checking - this.prevDropTarget = null; // the dropzone that was recently dragged away from - this.prevDropElement = null; // the element at the time of checking +Object.defineProperty(_$is_57, "__esModule", { + value: true +}); +_$is_57.array = _$is_57.plainObject = _$is_57.element = _$is_57.string = _$is_57.bool = _$is_57.number = _$is_57.func = _$is_57.object = _$is_57.docFrag = _$is_57.window = void 0; - this.prepared = { // action that's ready to be fired on next move event - name : null, - axis : null, - edges: null - }; +var ___isWindow_57 = ___interopRequireDefault_57(_$isWindow_58); - this.matches = []; // all selectors that are matched by target element - this.matchElements = []; // corresponding elements +var _window2 = ___interopRequireDefault_57(_$window_66); - this.inertiaStatus = { - active : false, - smoothEnd : false, - ending : false, +function ___interopRequireDefault_57(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - startEvent: null, - upCoords: {}, +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - xe: 0, ye: 0, - sx: 0, sy: 0, +var __window_57 = function window(thing) { + return thing === _window2["default"].window || (0, ___isWindow_57["default"])(thing); +}; - t0: 0, - vx0: 0, vys: 0, - duration: 0, +_$is_57.window = __window_57; - resumeDx: 0, - resumeDy: 0, +var docFrag = function docFrag(thing) { + return object(thing) && thing.nodeType === 11; +}; - lambda_v0: 0, - one_ve_v0: 0, - i : null - }; +_$is_57.docFrag = docFrag; - if (isFunction(Function.prototype.bind)) { - this.boundInertiaFrame = this.inertiaFrame.bind(this); - this.boundSmoothEndFrame = this.smoothEndFrame.bind(this); - } - else { - var that = this; +var object = function object(thing) { + return !!thing && _typeof(thing) === 'object'; +}; - this.boundInertiaFrame = function () { return that.inertiaFrame(); }; - this.boundSmoothEndFrame = function () { return that.smoothEndFrame(); }; - } +_$is_57.object = object; - this.activeDrops = { - dropzones: [], // the dropzones that are mentioned below - elements : [], // elements of dropzones that accept the target draggable - rects : [] // the rects of the elements mentioned above - }; +var func = function func(thing) { + return typeof thing === 'function'; +}; - // keep track of added pointers - this.pointers = []; - this.pointerIds = []; - this.downTargets = []; - this.downTimes = []; - this.holdTimers = []; - - // Previous native pointer move event coordinates - this.prevCoords = { - page : { x: 0, y: 0 }, - client : { x: 0, y: 0 }, - timeStamp: 0 - }; - // current native pointer move event coordinates - this.curCoords = { - page : { x: 0, y: 0 }, - client : { x: 0, y: 0 }, - timeStamp: 0 - }; +_$is_57.func = func; - // Starting InteractEvent pointer coordinates - this.startCoords = { - page : { x: 0, y: 0 }, - client : { x: 0, y: 0 }, - timeStamp: 0 - }; +var number = function number(thing) { + return typeof thing === 'number'; +}; - // Change in coordinates and time of the pointer - this.pointerDelta = { - page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 }, - client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 }, - timeStamp: 0 - }; +_$is_57.number = number; - this.downEvent = null; // pointerdown/mousedown/touchstart event - this.downPointer = {}; +var bool = function bool(thing) { + return typeof thing === 'boolean'; +}; - this._eventTarget = null; - this._curEventTarget = null; +_$is_57.bool = bool; - this.prevEvent = null; // previous action event - this.tapTime = 0; // time of the most recent tap event - this.prevTap = null; +var string = function string(thing) { + return typeof thing === 'string'; +}; - this.startOffset = { left: 0, right: 0, top: 0, bottom: 0 }; - this.restrictOffset = { left: 0, right: 0, top: 0, bottom: 0 }; - this.snapOffsets = []; +_$is_57.string = string; - this.gesture = { - start: { x: 0, y: 0 }, +var element = function element(thing) { + if (!thing || _typeof(thing) !== 'object') { + return false; + } - startDistance: 0, // distance between two touches of touchStart - prevDistance : 0, - distance : 0, + var _window = _window2["default"].getWindow(thing) || _window2["default"].window; - scale: 1, // gesture.distance / gesture.startDistance + return /object|function/.test(_typeof(_window.Element)) ? thing instanceof _window.Element // DOM2 + : thing.nodeType === 1 && typeof thing.nodeName === 'string'; +}; - startAngle: 0, // angle of line joining two touches - prevAngle : 0 // angle of the previous gesture event - }; +_$is_57.element = element; - this.snapStatus = { - x : 0, y : 0, - dx : 0, dy : 0, - realX : 0, realY : 0, - snappedX: 0, snappedY: 0, - targets : [], - locked : false, - changed : false - }; +var plainObject = function plainObject(thing) { + return object(thing) && !!thing.constructor && /function Object\b/.test(thing.constructor.toString()); +}; - this.restrictStatus = { - dx : 0, dy : 0, - restrictedX: 0, restrictedY: 0, - snap : null, - restricted : false, - changed : false - }; +_$is_57.plainObject = plainObject; - this.restrictStatus.snap = this.snapStatus; +var array = function array(thing) { + return object(thing) && typeof thing.length !== 'undefined' && func(thing.splice); +}; - this.pointerIsDown = false; - this.pointerWasMoved = false; - this.gesturing = false; - this.dragging = false; - this.resizing = false; - this.resizeAxes = 'xy'; +_$is_57.array = array; - this.mouse = false; +var _$browser_48 = {}; +"use strict"; - interactions.push(this); - } +Object.defineProperty(_$browser_48, "__esModule", { + value: true +}); +_$browser_48["default"] = void 0; - Interaction.prototype = { - getPageXY : function (pointer, xy) { return getPageXY(pointer, xy, this); }, - getClientXY: function (pointer, xy) { return getClientXY(pointer, xy, this); }, - setEventXY : function (target, ptr) { return setEventXY(target, ptr, this); }, +var _domObjects = ___interopRequireDefault_48(_$domObjects_50); - pointerOver: function (pointer, event, eventTarget) { - if (this.prepared.name || !this.mouse) { return; } +var is = _interopRequireWildcard(_$is_57); - var curMatches = [], - curMatchElements = [], - prevTargetElement = this.element; +var _window = ___interopRequireDefault_48(_$window_66); - this.addPointer(pointer); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - if (this.target - && (testIgnore(this.target, this.element, eventTarget) - || !testAllow(this.target, this.element, eventTarget))) { - // if the eventTarget should be ignored or shouldn't be allowed - // clear the previous target - this.target = null; - this.element = null; - this.matches = []; - this.matchElements = []; - } +function ___interopRequireDefault_48(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - var elementInteractable = interactables.get(eventTarget), - elementAction = (elementInteractable - && !testIgnore(elementInteractable, eventTarget, eventTarget) - && testAllow(elementInteractable, eventTarget, eventTarget) - && validateAction( - elementInteractable.getAction(pointer, event, this, eventTarget), - elementInteractable)); +var browser = { + init: __init_48, + supportsTouch: null, + supportsPointerEvent: null, + isIOS7: null, + isIOS: null, + isIe9: null, + isOperaMobile: null, + prefixedMatchesSelector: null, + pEventTypes: null, + wheelEvent: null +}; - if (elementAction && !withinInteractionLimit(elementInteractable, eventTarget, elementAction)) { - elementAction = null; - } +function __init_48(window) { + var Element = _domObjects["default"].Element; + var navigator = _window["default"].window.navigator; // Does the browser support touch input? - function pushCurMatches (interactable, selector) { - if (interactable - && inContext(interactable, eventTarget) - && !testIgnore(interactable, eventTarget, eventTarget) - && testAllow(interactable, eventTarget, eventTarget) - && matchesSelector(eventTarget, selector)) { + browser.supportsTouch = 'ontouchstart' in window || is.func(window.DocumentTouch) && _domObjects["default"].document instanceof window.DocumentTouch; // Does the browser support PointerEvents - curMatches.push(interactable); - curMatchElements.push(eventTarget); - } - } + browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!_domObjects["default"].PointerEvent; + browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7 - if (elementAction) { - this.target = elementInteractable; - this.element = eventTarget; - this.matches = []; - this.matchElements = []; - } - else { - interactables.forEachSelector(pushCurMatches); - - if (this.validateSelector(pointer, event, curMatches, curMatchElements)) { - this.matches = curMatches; - this.matchElements = curMatchElements; - - this.pointerHover(pointer, event, this.matches, this.matchElements); - events.add(eventTarget, - PointerEvent? pEventTypes.move : 'mousemove', - listeners.pointerHover); - } - else if (this.target) { - if (nodeContains(prevTargetElement, eventTarget)) { - this.pointerHover(pointer, event, this.matches, this.matchElements); - events.add(this.element, - PointerEvent? pEventTypes.move : 'mousemove', - listeners.pointerHover); - } - else { - this.target = null; - this.element = null; - this.matches = []; - this.matchElements = []; - } - } - } - }, + browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\d]/.test(navigator.appVersion); + browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently - // Check what action would be performed on pointerMove target if a mouse - // button were pressed and change the cursor accordingly - pointerHover: function (pointer, event, eventTarget, curEventTarget, matches, matchElements) { - var target = this.target; - - if (!this.prepared.name && this.mouse) { - - var action; - - // update pointer coords for defaultActionChecker to use - this.setEventXY(this.curCoords, [pointer]); - - if (matches) { - action = this.validateSelector(pointer, event, matches, matchElements); - } - else if (target) { - action = validateAction(target.getAction(this.pointers[0], event, this, this.element), this.target); - } - - if (target && target.options.styleCursor) { - if (action) { - target._doc.documentElement.style.cursor = getActionCursor(action); - } - else { - target._doc.documentElement.style.cursor = ''; - } - } - } - else if (this.prepared.name) { - this.checkAndPreventDefault(event, target, this.element); - } - }, + browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector - pointerOut: function (pointer, event, eventTarget) { - if (this.prepared.name) { return; } + browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector'; + browser.pEventTypes = browser.supportsPointerEvent ? _domObjects["default"].PointerEvent === window.MSPointerEvent ? { + up: 'MSPointerUp', + down: 'MSPointerDown', + over: 'mouseover', + out: 'mouseout', + move: 'MSPointerMove', + cancel: 'MSPointerCancel' + } : { + up: 'pointerup', + down: 'pointerdown', + over: 'pointerover', + out: 'pointerout', + move: 'pointermove', + cancel: 'pointercancel' + } : null; // because Webkit and Opera still use 'mousewheel' event type - // Remove temporary event listeners for selector Interactables - if (!interactables.get(eventTarget)) { - events.remove(eventTarget, - PointerEvent? pEventTypes.move : 'mousemove', - listeners.pointerHover); - } + browser.wheelEvent = 'onmousewheel' in _domObjects["default"].document ? 'mousewheel' : 'wheel'; +} - if (this.target && this.target.options.styleCursor && !this.interacting()) { - this.target._doc.documentElement.style.cursor = ''; - } - }, +var ___default_48 = browser; +_$browser_48["default"] = ___default_48; - selectorDown: function (pointer, event, eventTarget, curEventTarget) { - var that = this, - // copy event to be used in timeout for IE8 - eventCopy = events.useAttachEvent? extend({}, event) : event, - element = eventTarget, - pointerIndex = this.addPointer(pointer), - action; - - this.holdTimers[pointerIndex] = setTimeout(function () { - that.pointerHold(events.useAttachEvent? eventCopy : pointer, eventCopy, eventTarget, curEventTarget); - }, defaultOptions._holdDuration); - - this.pointerIsDown = true; - - // Check if the down event hits the current inertia target - if (this.inertiaStatus.active && this.target.selector) { - // climb up the DOM tree from the event target - while (isElement(element)) { - - // if this element is the current inertia target element - if (element === this.element - // and the prospective action is the same as the ongoing one - && validateAction(this.target.getAction(pointer, event, this, this.element), this.target).name === this.prepared.name) { - - // stop inertia so that the next move will be a normal one - cancelFrame(this.inertiaStatus.i); - this.inertiaStatus.active = false; - - this.collectEventTargets(pointer, event, eventTarget, 'down'); - return; - } - element = parentElement(element); - } - } +var _$domUtils_51 = {}; +"use strict"; - // do nothing if interacting - if (this.interacting()) { - this.collectEventTargets(pointer, event, eventTarget, 'down'); - return; - } +Object.defineProperty(_$domUtils_51, "__esModule", { + value: true +}); +_$domUtils_51.nodeContains = nodeContains; +_$domUtils_51.closest = closest; +_$domUtils_51.parentNode = parentNode; +_$domUtils_51.matchesSelector = matchesSelector; +_$domUtils_51.indexOfDeepestElement = indexOfDeepestElement; +_$domUtils_51.matchesUpTo = matchesUpTo; +_$domUtils_51.getActualElement = getActualElement; +_$domUtils_51.getScrollXY = getScrollXY; +_$domUtils_51.getElementClientRect = getElementClientRect; +_$domUtils_51.getElementRect = getElementRect; +_$domUtils_51.getPath = getPath; +_$domUtils_51.trySelector = trySelector; - function pushMatches (interactable, selector, context) { - var elements = ie8MatchesSelector - ? context.querySelectorAll(selector) - : undefined; +var _browser = ___interopRequireDefault_51(_$browser_48); - if (inContext(interactable, element) - && !testIgnore(interactable, element, eventTarget) - && testAllow(interactable, element, eventTarget) - && matchesSelector(element, selector, elements)) { +var ___domObjects_51 = ___interopRequireDefault_51(_$domObjects_50); - that.matches.push(interactable); - that.matchElements.push(element); - } - } +var __is_51 = ___interopRequireWildcard_51(_$is_57); - // update pointer coords for defaultActionChecker to use - this.setEventXY(this.curCoords, [pointer]); - this.downEvent = event; +var ___window_51 = ___interopRequireDefault_51(_$window_66); + +function ___interopRequireWildcard_51(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - while (isElement(element) && !action) { - this.matches = []; - this.matchElements = []; +function ___interopRequireDefault_51(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function nodeContains(parent, child) { + while (child) { + if (child === parent) { + return true; + } - interactables.forEachSelector(pushMatches); + child = child.parentNode; + } - action = this.validateSelector(pointer, event, this.matches, this.matchElements); - element = parentElement(element); - } + return false; +} - if (action) { - this.prepared.name = action.name; - this.prepared.axis = action.axis; - this.prepared.edges = action.edges; +function closest(element, selector) { + while (__is_51.element(element)) { + if (matchesSelector(element, selector)) { + return element; + } - this.collectEventTargets(pointer, event, eventTarget, 'down'); + element = parentNode(element); + } - return this.pointerDown(pointer, event, eventTarget, curEventTarget, action); - } - else { - // do these now since pointerDown isn't being called from here - this.downTimes[pointerIndex] = new Date().getTime(); - this.downTargets[pointerIndex] = eventTarget; - pointerExtend(this.downPointer, pointer); + return null; +} - copyCoords(this.prevCoords, this.curCoords); - this.pointerWasMoved = false; - } +function parentNode(node) { + var parent = node.parentNode; - this.collectEventTargets(pointer, event, eventTarget, 'down'); - }, + if (__is_51.docFrag(parent)) { + // skip past #shado-root fragments + // tslint:disable-next-line + while ((parent = parent.host) && __is_51.docFrag(parent)) { + continue; + } - // Determine action to be performed on next pointerMove and add appropriate - // style and event Listeners - pointerDown: function (pointer, event, eventTarget, curEventTarget, forceAction) { - if (!forceAction && !this.inertiaStatus.active && this.pointerWasMoved && this.prepared.name) { - this.checkAndPreventDefault(event, this.target, this.element); + return parent; + } - return; - } + return parent; +} - this.pointerIsDown = true; - this.downEvent = event; +function matchesSelector(element, selector) { + // remove /deep/ from selectors if shadowDOM polyfill is used + if (___window_51["default"].window !== ___window_51["default"].realWindow) { + selector = selector.replace(/\/deep\//g, ' '); + } - var pointerIndex = this.addPointer(pointer), - action; + return element[_browser["default"].prefixedMatchesSelector](selector); +} - // If it is the second touch of a multi-touch gesture, keep the - // target the same and get a new action if a target was set by the - // first touch - if (this.pointerIds.length > 1 && this.target._element === this.element) { - var newAction = validateAction(forceAction || this.target.getAction(pointer, event, this, this.element), this.target); +var getParent = function getParent(el) { + return el.parentNode ? el.parentNode : el.host; +}; // Test for the element that's "above" all other qualifiers - if (withinInteractionLimit(this.target, this.element, newAction)) { - action = newAction; - } - this.prepared.name = null; - } - // Otherwise, set the target if there is no action prepared - else if (!this.prepared.name) { - var interactable = interactables.get(curEventTarget); - - if (interactable - && !testIgnore(interactable, curEventTarget, eventTarget) - && testAllow(interactable, curEventTarget, eventTarget) - && (action = validateAction(forceAction || interactable.getAction(pointer, event, this, curEventTarget), interactable, eventTarget)) - && withinInteractionLimit(interactable, curEventTarget, action)) { - this.target = interactable; - this.element = curEventTarget; - } - } +function indexOfDeepestElement(elements) { + var deepestZoneParents = []; + var dropzoneParents = []; + var dropzone; + var deepestZone = elements[0]; + var index = deepestZone ? 0 : -1; + var parent; + var child; + var i; + var n; - var target = this.target, - options = target && target.options; + for (i = 1; i < elements.length; i++) { + dropzone = elements[i]; // an element might belong to multiple selector dropzones - if (target && (forceAction || !this.prepared.name)) { - action = action || validateAction(forceAction || target.getAction(pointer, event, this, curEventTarget), target, this.element); + if (!dropzone || dropzone === deepestZone) { + continue; + } - this.setEventXY(this.startCoords, this.pointers); + if (!deepestZone) { + deepestZone = dropzone; + index = i; + continue; + } // check if the deepest or current are document.documentElement or document.rootElement + // - if the current dropzone is, do nothing and continue + + + if (dropzone.parentNode === dropzone.ownerDocument) { + continue; + } // - if deepest is, update with the current dropzone and continue to next + else if (deepestZone.parentNode === dropzone.ownerDocument) { + deepestZone = dropzone; + index = i; + continue; + } + + if (!deepestZoneParents.length) { + parent = deepestZone; + + while (getParent(parent) && getParent(parent) !== parent.ownerDocument) { + deepestZoneParents.unshift(parent); + parent = getParent(parent); + } + } // if this element is an svg element and the current deepest is + // an HTMLElement + + + if (deepestZone instanceof ___domObjects_51["default"].HTMLElement && dropzone instanceof ___domObjects_51["default"].SVGElement && !(dropzone instanceof ___domObjects_51["default"].SVGSVGElement)) { + if (dropzone === deepestZone.parentNode) { + continue; + } + + parent = dropzone.ownerSVGElement; + } else { + parent = dropzone; + } - if (!action) { return; } + dropzoneParents = []; - if (options.styleCursor) { - target._doc.documentElement.style.cursor = getActionCursor(action); - } + while (parent.parentNode !== parent.ownerDocument) { + dropzoneParents.unshift(parent); + parent = getParent(parent); + } - this.resizeAxes = action.name === 'resize'? action.axis : null; + n = 0; // get (position of last common ancestor) + 1 - if (action === 'gesture' && this.pointerIds.length < 2) { - action = null; - } + while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) { + n++; + } - this.prepared.name = action.name; - this.prepared.axis = action.axis; - this.prepared.edges = action.edges; + var parents = [dropzoneParents[n - 1], dropzoneParents[n], deepestZoneParents[n]]; + child = parents[0].lastChild; - this.snapStatus.snappedX = this.snapStatus.snappedY = - this.restrictStatus.restrictedX = this.restrictStatus.restrictedY = NaN; + while (child) { + if (child === parents[1]) { + deepestZone = dropzone; + index = i; + deepestZoneParents = []; + break; + } else if (child === parents[2]) { + break; + } - this.downTimes[pointerIndex] = new Date().getTime(); - this.downTargets[pointerIndex] = eventTarget; - pointerExtend(this.downPointer, pointer); + child = child.previousSibling; + } + } - copyCoords(this.prevCoords, this.startCoords); - this.pointerWasMoved = false; + return index; +} - this.checkAndPreventDefault(event, target, this.element); - } - // if inertia is active try to resume action - else if (this.inertiaStatus.active - && curEventTarget === this.element - && validateAction(target.getAction(pointer, event, this, this.element), target).name === this.prepared.name) { +function matchesUpTo(element, selector, limit) { + while (__is_51.element(element)) { + if (matchesSelector(element, selector)) { + return true; + } - cancelFrame(this.inertiaStatus.i); - this.inertiaStatus.active = false; + element = parentNode(element); - this.checkAndPreventDefault(event, target, this.element); - } - }, + if (element === limit) { + return matchesSelector(element, selector); + } + } - setModifications: function (coords, preEnd) { - var target = this.target, - shouldMove = true, - shouldSnap = checkSnap(target, this.prepared.name) && (!target.options[this.prepared.name].snap.endOnly || preEnd), - shouldRestrict = checkRestrict(target, this.prepared.name) && (!target.options[this.prepared.name].restrict.endOnly || preEnd); + return false; +} - if (shouldSnap ) { this.setSnapping (coords); } else { this.snapStatus .locked = false; } - if (shouldRestrict) { this.setRestriction(coords); } else { this.restrictStatus.restricted = false; } +function getActualElement(element) { + return element instanceof ___domObjects_51["default"].SVGElementInstance ? element.correspondingUseElement : element; +} - if (shouldSnap && this.snapStatus.locked && !this.snapStatus.changed) { - shouldMove = shouldRestrict && this.restrictStatus.restricted && this.restrictStatus.changed; - } - else if (shouldRestrict && this.restrictStatus.restricted && !this.restrictStatus.changed) { - shouldMove = false; - } +function getScrollXY(relevantWindow) { + relevantWindow = relevantWindow || ___window_51["default"].window; + return { + x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft, + y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop + }; +} - return shouldMove; - }, +function getElementClientRect(element) { + var clientRect = element instanceof ___domObjects_51["default"].SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0]; + return clientRect && { + left: clientRect.left, + right: clientRect.right, + top: clientRect.top, + bottom: clientRect.bottom, + width: clientRect.width || clientRect.right - clientRect.left, + height: clientRect.height || clientRect.bottom - clientRect.top + }; +} - setStartOffsets: function (action, interactable, element) { - var rect = interactable.getRect(element), - origin = getOriginXY(interactable, element), - snap = interactable.options[this.prepared.name].snap, - restrict = interactable.options[this.prepared.name].restrict, - width, height; +function getElementRect(element) { + var clientRect = getElementClientRect(element); - if (rect) { - this.startOffset.left = this.startCoords.page.x - rect.left; - this.startOffset.top = this.startCoords.page.y - rect.top; + if (!_browser["default"].isIOS7 && clientRect) { + var scroll = getScrollXY(___window_51["default"].getWindow(element)); + clientRect.left += scroll.x; + clientRect.right += scroll.x; + clientRect.top += scroll.y; + clientRect.bottom += scroll.y; + } - this.startOffset.right = rect.right - this.startCoords.page.x; - this.startOffset.bottom = rect.bottom - this.startCoords.page.y; + return clientRect; +} - if ('width' in rect) { width = rect.width; } - else { width = rect.right - rect.left; } - if ('height' in rect) { height = rect.height; } - else { height = rect.bottom - rect.top; } - } - else { - this.startOffset.left = this.startOffset.top = this.startOffset.right = this.startOffset.bottom = 0; - } +function getPath(node) { + var path = []; - this.snapOffsets.splice(0); + while (node) { + path.push(node); + node = parentNode(node); + } - var snapOffset = snap && snap.offset === 'startCoords' - ? { - x: this.startCoords.page.x - origin.x, - y: this.startCoords.page.y - origin.y - } - : snap && snap.offset || { x: 0, y: 0 }; - - if (rect && snap && snap.relativePoints && snap.relativePoints.length) { - for (var i = 0; i < snap.relativePoints.length; i++) { - this.snapOffsets.push({ - x: this.startOffset.left - (width * snap.relativePoints[i].x) + snapOffset.x, - y: this.startOffset.top - (height * snap.relativePoints[i].y) + snapOffset.y - }); - } - } - else { - this.snapOffsets.push(snapOffset); - } + return path; +} - if (rect && restrict.elementRect) { - this.restrictOffset.left = this.startOffset.left - (width * restrict.elementRect.left); - this.restrictOffset.top = this.startOffset.top - (height * restrict.elementRect.top); +function trySelector(value) { + if (!__is_51.string(value)) { + return false; + } // an exception will be raised if it is invalid - this.restrictOffset.right = this.startOffset.right - (width * (1 - restrict.elementRect.right)); - this.restrictOffset.bottom = this.startOffset.bottom - (height * (1 - restrict.elementRect.bottom)); - } - else { - this.restrictOffset.left = this.restrictOffset.top = this.restrictOffset.right = this.restrictOffset.bottom = 0; - } - }, - /*\ - * Interaction.start - [ method ] - * - * Start an action with the given Interactable and Element as tartgets. The - * action must be enabled for the target Interactable and an appropriate number - * of pointers must be held down – 1 for drag/resize, 2 for gesture. - * - * Use it with `interactable.able({ manualStart: false })` to always - * [start actions manually](https://github.com/taye/interact.js/issues/114) - * - - action (object) The action to be performed - drag, resize, etc. - - interactable (Interactable) The Interactable to target - - element (Element) The DOM Element to target - = (object) interact - ** - | interact(target) - | .draggable({ - | // disable the default drag start by down->move - | manualStart: true - | }) - | // start dragging after the user holds the pointer down - | .on('hold', function (event) { - | var interaction = event.interaction; - | - | if (!interaction.interacting()) { - | interaction.start({ name: 'drag' }, - | event.interactable, - | event.currentTarget); - | } - | }); - \*/ - start: function (action, interactable, element) { - if (this.interacting() - || !this.pointerIsDown - || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) { - return; - } + ___domObjects_51["default"].document.querySelector(value); - // if this interaction had been removed after stopping - // add it back - if (indexOf(interactions, this) === -1) { - interactions.push(this); - } + return true; +} - // set the startCoords if there was no prepared action - if (!this.prepared.name) { - this.setEventXY(this.startCoords); - } +var _$clone_49 = {}; +"use strict"; - this.prepared.name = action.name; - this.prepared.axis = action.axis; - this.prepared.edges = action.edges; - this.target = interactable; - this.element = element; +Object.defineProperty(_$clone_49, "__esModule", { + value: true +}); +_$clone_49["default"] = clone; - this.setStartOffsets(action.name, interactable, element); - this.setModifications(this.startCoords.page); +var arr = ___interopRequireWildcard_49(_$arr_47); - this.prevEvent = this[this.prepared.name + 'Start'](this.downEvent); - }, +var __is_49 = ___interopRequireWildcard_49(_$is_57); - pointerMove: function (pointer, event, eventTarget, curEventTarget, preEnd) { - if (this.inertiaStatus.active) { - var pageUp = this.inertiaStatus.upCoords.page; - var clientUp = this.inertiaStatus.upCoords.client; +function ___interopRequireWildcard_49(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - var inertiaPosition = { - pageX : pageUp.x + this.inertiaStatus.sx, - pageY : pageUp.y + this.inertiaStatus.sy, - clientX: clientUp.x + this.inertiaStatus.sx, - clientY: clientUp.y + this.inertiaStatus.sy - }; +function clone(source) { + var dest = {}; - this.setEventXY(this.curCoords, [inertiaPosition]); - } - else { - this.recordPointer(pointer); - this.setEventXY(this.curCoords, this.pointers); - } + for (var prop in source) { + var value = source[prop]; - var duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x - && this.curCoords.page.y === this.prevCoords.page.y - && this.curCoords.client.x === this.prevCoords.client.x - && this.curCoords.client.y === this.prevCoords.client.y); + if (__is_49.plainObject(value)) { + dest[prop] = clone(value); + } else if (__is_49.array(value)) { + dest[prop] = arr.from(value); + } else { + dest[prop] = value; + } + } - var dx, dy, - pointerIndex = this.mouse? 0 : indexOf(this.pointerIds, getPointerId(pointer)); + return dest; +} - // register movement greater than pointerMoveTolerance - if (this.pointerIsDown && !this.pointerWasMoved) { - dx = this.curCoords.client.x - this.startCoords.client.x; - dy = this.curCoords.client.y - this.startCoords.client.y; +var _$pointerExtend_60 = {}; +"use strict"; - this.pointerWasMoved = hypot(dx, dy) > pointerMoveTolerance; - } +Object.defineProperty(_$pointerExtend_60, "__esModule", { + value: true +}); +_$pointerExtend_60["default"] = void 0; - if (!duplicateMove && (!this.pointerIsDown || this.pointerWasMoved)) { - if (this.pointerIsDown) { - clearTimeout(this.holdTimers[pointerIndex]); - } +function pointerExtend(dest, source) { + for (var prop in source) { + var prefixedPropREs = pointerExtend.prefixedPropREs; + var deprecated = false; // skip deprecated prefixed properties - this.collectEventTargets(pointer, event, eventTarget, 'move'); - } + for (var vendor in prefixedPropREs) { + if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) { + deprecated = true; + break; + } + } - if (!this.pointerIsDown) { return; } + if (!deprecated && typeof source[prop] !== 'function') { + dest[prop] = source[prop]; + } + } + + return dest; +} + +pointerExtend.prefixedPropREs = { + webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/ +}; +var ___default_60 = pointerExtend; +_$pointerExtend_60["default"] = ___default_60; + +var _$hypot_55 = {}; +"use strict"; + +Object.defineProperty(_$hypot_55, "__esModule", { + value: true +}); +_$hypot_55["default"] = void 0; + +var ___default_55 = function _default(x, y) { + return Math.sqrt(x * x + y * y); +}; + +_$hypot_55["default"] = ___default_55; + +var _$pointerUtils_61 = {}; +"use strict"; + +Object.defineProperty(_$pointerUtils_61, "__esModule", { + value: true +}); +_$pointerUtils_61["default"] = void 0; + +var ___browser_61 = ___interopRequireDefault_61(_$browser_48); + +var ___domObjects_61 = ___interopRequireDefault_61(_$domObjects_50); + +var domUtils = ___interopRequireWildcard_61(_$domUtils_51); + +var _hypot = ___interopRequireDefault_61(_$hypot_55); + +var __is_61 = ___interopRequireWildcard_61(_$is_57); + +var _pointerExtend = ___interopRequireDefault_61(_$pointerExtend_60); + +function ___interopRequireWildcard_61(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_61(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var pointerUtils = { + copyCoords: function copyCoords(dest, src) { + dest.page = dest.page || {}; + dest.page.x = src.page.x; + dest.page.y = src.page.y; + dest.client = dest.client || {}; + dest.client.x = src.client.x; + dest.client.y = src.client.y; + dest.timeStamp = src.timeStamp; + }, + setCoordDeltas: function setCoordDeltas(targetObj, prev, cur) { + targetObj.page.x = cur.page.x - prev.page.x; + targetObj.page.y = cur.page.y - prev.page.y; + targetObj.client.x = cur.client.x - prev.client.x; + targetObj.client.y = cur.client.y - prev.client.y; + targetObj.timeStamp = cur.timeStamp - prev.timeStamp; + }, + setCoordVelocity: function setCoordVelocity(targetObj, delta) { + var dt = Math.max(delta.timeStamp / 1000, 0.001); + targetObj.page.x = delta.page.x / dt; + targetObj.page.y = delta.page.y / dt; + targetObj.client.x = delta.client.x / dt; + targetObj.client.y = delta.client.y / dt; + targetObj.timeStamp = dt; + }, + isNativePointer: function isNativePointer(pointer) { + return pointer instanceof ___domObjects_61["default"].Event || pointer instanceof ___domObjects_61["default"].Touch; + }, + // Get specified X/Y coords for mouse or event.touches[0] + getXY: function getXY(type, pointer, xy) { + xy = xy || {}; + type = type || 'page'; + xy.x = pointer[type + 'X']; + xy.y = pointer[type + 'Y']; + return xy; + }, + getPageXY: function getPageXY(pointer, page) { + page = page || { + x: 0, + y: 0 + }; // Opera Mobile handles the viewport and scrolling oddly + + if (___browser_61["default"].isOperaMobile && pointerUtils.isNativePointer(pointer)) { + pointerUtils.getXY('screen', pointer, page); + page.x += window.scrollX; + page.y += window.scrollY; + } else { + pointerUtils.getXY('page', pointer, page); + } - if (duplicateMove && this.pointerWasMoved && !preEnd) { - this.checkAndPreventDefault(event, this.target, this.element); - return; - } + return page; + }, + getClientXY: function getClientXY(pointer, client) { + client = client || {}; - // set pointer coordinate, time changes and speeds - setEventDeltas(this.pointerDelta, this.prevCoords, this.curCoords); - - if (!this.prepared.name) { return; } - - if (this.pointerWasMoved - // ignore movement while inertia is active - && (!this.inertiaStatus.active || (pointer instanceof InteractEvent && /inertiastart/.test(pointer.type)))) { - - // if just starting an action, calculate the pointer speed now - if (!this.interacting()) { - setEventDeltas(this.pointerDelta, this.prevCoords, this.curCoords); - - // check if a drag is in the correct axis - if (this.prepared.name === 'drag') { - var absX = Math.abs(dx), - absY = Math.abs(dy), - targetAxis = this.target.options.drag.axis, - axis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy'); - - // if the movement isn't in the axis of the interactable - if (axis !== 'xy' && targetAxis !== 'xy' && targetAxis !== axis) { - // cancel the prepared action - this.prepared.name = null; - - // then try to get a drag from another ineractable - - var element = eventTarget; - - // check element interactables - while (isElement(element)) { - var elementInteractable = interactables.get(element); - - if (elementInteractable - && elementInteractable !== this.target - && !elementInteractable.options.drag.manualStart - && elementInteractable.getAction(this.downPointer, this.downEvent, this, element).name === 'drag' - && checkAxis(axis, elementInteractable)) { - - this.prepared.name = 'drag'; - this.target = elementInteractable; - this.element = element; - break; - } - - element = parentElement(element); - } - - // if there's no drag from element interactables, - // check the selector interactables - if (!this.prepared.name) { - var thisInteraction = this; - - var getDraggable = function (interactable, selector, context) { - var elements = ie8MatchesSelector - ? context.querySelectorAll(selector) - : undefined; - - if (interactable === thisInteraction.target) { return; } - - if (inContext(interactable, eventTarget) - && !interactable.options.drag.manualStart - && !testIgnore(interactable, element, eventTarget) - && testAllow(interactable, element, eventTarget) - && matchesSelector(element, selector, elements) - && interactable.getAction(thisInteraction.downPointer, thisInteraction.downEvent, thisInteraction, element).name === 'drag' - && checkAxis(axis, interactable) - && withinInteractionLimit(interactable, element, 'drag')) { - - return interactable; - } - }; - - element = eventTarget; - - while (isElement(element)) { - var selectorInteractable = interactables.forEachSelector(getDraggable); - - if (selectorInteractable) { - this.prepared.name = 'drag'; - this.target = selectorInteractable; - this.element = element; - break; - } - - element = parentElement(element); - } - } - } - } - } - - var starting = !!this.prepared.name && !this.interacting(); - - if (starting - && (this.target.options[this.prepared.name].manualStart - || !withinInteractionLimit(this.target, this.element, this.prepared))) { - this.stop(event); - return; - } - - if (this.prepared.name && this.target) { - if (starting) { - this.start(this.prepared, this.target, this.element); - } - - var shouldMove = this.setModifications(this.curCoords.page, preEnd); - - // move if snapping or restriction doesn't prevent it - if (shouldMove || starting) { - this.prevEvent = this[this.prepared.name + 'Move'](event); - } - - this.checkAndPreventDefault(event, this.target, this.element); - } - } + if (___browser_61["default"].isOperaMobile && pointerUtils.isNativePointer(pointer)) { + // Opera Mobile handles the viewport and scrolling oddly + pointerUtils.getXY('screen', pointer, client); + } else { + pointerUtils.getXY('client', pointer, client); + } - copyCoords(this.prevCoords, this.curCoords); + return client; + }, + getPointerId: function getPointerId(pointer) { + return __is_61.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier; + }, + setCoords: function setCoords(targetObj, pointers, timeStamp) { + var pointer = pointers.length > 1 ? pointerUtils.pointerAverage(pointers) : pointers[0]; + var tmpXY = {}; + pointerUtils.getPageXY(pointer, tmpXY); + targetObj.page.x = tmpXY.x; + targetObj.page.y = tmpXY.y; + pointerUtils.getClientXY(pointer, tmpXY); + targetObj.client.x = tmpXY.x; + targetObj.client.y = tmpXY.y; + targetObj.timeStamp = timeStamp; + }, + pointerExtend: _pointerExtend["default"], + getTouchPair: function getTouchPair(event) { + var touches = []; // array of touches is supplied + + if (__is_61.array(event)) { + touches[0] = event[0]; + touches[1] = event[1]; + } // an event + else { + if (event.type === 'touchend') { + if (event.touches.length === 1) { + touches[0] = event.touches[0]; + touches[1] = event.changedTouches[0]; + } else if (event.touches.length === 0) { + touches[0] = event.changedTouches[0]; + touches[1] = event.changedTouches[1]; + } + } else { + touches[0] = event.touches[0]; + touches[1] = event.touches[1]; + } + } + + return touches; + }, + pointerAverage: function pointerAverage(pointers) { + var average = { + pageX: 0, + pageY: 0, + clientX: 0, + clientY: 0, + screenX: 0, + screenY: 0 + }; - if (this.dragging || this.resizing) { - this.autoScrollMove(pointer); - } - }, + for (var _i = 0; _i < pointers.length; _i++) { + var _ref; - dragStart: function (event) { - var dragEvent = new InteractEvent(this, event, 'drag', 'start', this.element); + _ref = pointers[_i]; + var pointer = _ref; - this.dragging = true; - this.target.fire(dragEvent); + for (var _prop in average) { + average[_prop] += pointer[_prop]; + } + } - // reset active dropzones - this.activeDrops.dropzones = []; - this.activeDrops.elements = []; - this.activeDrops.rects = []; + for (var prop in average) { + average[prop] /= pointers.length; + } - if (!this.dynamicDrop) { - this.setActiveDrops(this.element); - } + return average; + }, + touchBBox: function touchBBox(event) { + if (!event.length && !(event.touches && event.touches.length > 1)) { + return null; + } - var dropEvents = this.getDropEvents(event, dragEvent); + var touches = pointerUtils.getTouchPair(event); + var minX = Math.min(touches[0].pageX, touches[1].pageX); + var minY = Math.min(touches[0].pageY, touches[1].pageY); + var maxX = Math.max(touches[0].pageX, touches[1].pageX); + var maxY = Math.max(touches[0].pageY, touches[1].pageY); + return { + x: minX, + y: minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY, + width: maxX - minX, + height: maxY - minY + }; + }, + touchDistance: function touchDistance(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = pointerUtils.getTouchPair(event); + var dx = touches[0][sourceX] - touches[1][sourceX]; + var dy = touches[0][sourceY] - touches[1][sourceY]; + return (0, _hypot["default"])(dx, dy); + }, + touchAngle: function touchAngle(event, deltaSource) { + var sourceX = deltaSource + 'X'; + var sourceY = deltaSource + 'Y'; + var touches = pointerUtils.getTouchPair(event); + var dx = touches[1][sourceX] - touches[0][sourceX]; + var dy = touches[1][sourceY] - touches[0][sourceY]; + var angle = 180 * Math.atan2(dy, dx) / Math.PI; + return angle; + }, + getPointerType: function getPointerType(pointer) { + return __is_61.string(pointer.pointerType) ? pointer.pointerType : __is_61.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof ___domObjects_61["default"].Touch ? 'touch' : 'mouse'; + }, + // [ event.target, event.currentTarget ] + getEventTargets: function getEventTargets(event) { + var path = __is_61.func(event.composedPath) ? event.composedPath() : event.path; + return [domUtils.getActualElement(path ? path[0] : event.target), domUtils.getActualElement(event.currentTarget)]; + }, + newCoords: function newCoords() { + return { + page: { + x: 0, + y: 0 + }, + client: { + x: 0, + y: 0 + }, + timeStamp: 0 + }; + }, + coordsToEvent: function coordsToEvent(coords) { + var event = { + coords: coords, - if (dropEvents.activate) { - this.fireActiveDrops(dropEvents.activate); - } + get page() { + return this.coords.page; + }, - return dragEvent; - }, + get client() { + return this.coords.client; + }, - dragMove: function (event) { - var target = this.target, - dragEvent = new InteractEvent(this, event, 'drag', 'move', this.element), - draggableElement = this.element, - drop = this.getDrop(dragEvent, event, draggableElement); + get timeStamp() { + return this.coords.timeStamp; + }, - this.dropTarget = drop.dropzone; - this.dropElement = drop.element; + get pageX() { + return this.coords.page.x; + }, - var dropEvents = this.getDropEvents(event, dragEvent); + get pageY() { + return this.coords.page.y; + }, - target.fire(dragEvent); + get clientX() { + return this.coords.client.x; + }, - if (dropEvents.leave) { this.prevDropTarget.fire(dropEvents.leave); } - if (dropEvents.enter) { this.dropTarget.fire(dropEvents.enter); } - if (dropEvents.move ) { this.dropTarget.fire(dropEvents.move ); } + get clientY() { + return this.coords.client.y; + }, - this.prevDropTarget = this.dropTarget; - this.prevDropElement = this.dropElement; + get pointerId() { + return this.coords.pointerId; + }, - return dragEvent; - }, + get target() { + return this.coords.target; + }, - resizeStart: function (event) { - var resizeEvent = new InteractEvent(this, event, 'resize', 'start', this.element); - - if (this.prepared.edges) { - var startRect = this.target.getRect(this.element); - - /* - * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge - * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make - * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend - * on the active edges and the edge being interacted with. - */ - if (this.target.options.resize.square || this.target.options.resize.preserveAspectRatio) { - var linkedEdges = extend({}, this.prepared.edges); - - linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom); - linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right ); - linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top ); - linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left ); - - this.prepared._linkedEdges = linkedEdges; - } - else { - this.prepared._linkedEdges = null; - } - - // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize - if (this.target.options.resize.preserveAspectRatio) { - this.resizeStartAspectRatio = startRect.width / startRect.height; - } - - this.resizeRects = { - start : startRect, - current : extend({}, startRect), - restricted: extend({}, startRect), - previous : extend({}, startRect), - delta : { - left: 0, right : 0, width : 0, - top : 0, bottom: 0, height: 0 - } - }; - - resizeEvent.rect = this.resizeRects.restricted; - resizeEvent.deltaRect = this.resizeRects.delta; - } + get type() { + return this.coords.type; + }, - this.target.fire(resizeEvent); + get pointerType() { + return this.coords.pointerType; + }, - this.resizing = true; + get buttons() { + return this.coords.buttons; + } - return resizeEvent; - }, + }; + return event; + } +}; +var ___default_61 = pointerUtils; +_$pointerUtils_61["default"] = ___default_61; - resizeMove: function (event) { - var resizeEvent = new InteractEvent(this, event, 'resize', 'move', this.element); - - var edges = this.prepared.edges, - invert = this.target.options.resize.invert, - invertible = invert === 'reposition' || invert === 'negate'; - - if (edges) { - var dx = resizeEvent.dx, - dy = resizeEvent.dy, - - start = this.resizeRects.start, - current = this.resizeRects.current, - restricted = this.resizeRects.restricted, - delta = this.resizeRects.delta, - previous = extend(this.resizeRects.previous, restricted), - - originalEdges = edges; - - // `resize.preserveAspectRatio` takes precedence over `resize.square` - if (this.target.options.resize.preserveAspectRatio) { - var resizeStartAspectRatio = this.resizeStartAspectRatio; - - edges = this.prepared._linkedEdges; - - if ((originalEdges.left && originalEdges.bottom) - || (originalEdges.right && originalEdges.top)) { - dy = -dx / resizeStartAspectRatio; - } - else if (originalEdges.left || originalEdges.right) { dy = dx / resizeStartAspectRatio; } - else if (originalEdges.top || originalEdges.bottom) { dx = dy * resizeStartAspectRatio; } - } - else if (this.target.options.resize.square) { - edges = this.prepared._linkedEdges; - - if ((originalEdges.left && originalEdges.bottom) - || (originalEdges.right && originalEdges.top)) { - dy = -dx; - } - else if (originalEdges.left || originalEdges.right) { dy = dx; } - else if (originalEdges.top || originalEdges.bottom) { dx = dy; } - } - - // update the 'current' rect without modifications - if (edges.top ) { current.top += dy; } - if (edges.bottom) { current.bottom += dy; } - if (edges.left ) { current.left += dx; } - if (edges.right ) { current.right += dx; } - - if (invertible) { - // if invertible, copy the current rect - extend(restricted, current); - - if (invert === 'reposition') { - // swap edge values if necessary to keep width/height positive - var swap; - - if (restricted.top > restricted.bottom) { - swap = restricted.top; - - restricted.top = restricted.bottom; - restricted.bottom = swap; - } - if (restricted.left > restricted.right) { - swap = restricted.left; - - restricted.left = restricted.right; - restricted.right = swap; - } - } - } - else { - // if not invertible, restrict to minimum of 0x0 rect - restricted.top = Math.min(current.top, start.bottom); - restricted.bottom = Math.max(current.bottom, start.top); - restricted.left = Math.min(current.left, start.right); - restricted.right = Math.max(current.right, start.left); - } - - restricted.width = restricted.right - restricted.left; - restricted.height = restricted.bottom - restricted.top ; - - for (var edge in restricted) { - delta[edge] = restricted[edge] - previous[edge]; - } - - resizeEvent.edges = this.prepared.edges; - resizeEvent.rect = restricted; - resizeEvent.deltaRect = delta; - } +var _$events_52 = {}; +"use strict"; - this.target.fire(resizeEvent); +Object.defineProperty(_$events_52, "__esModule", { + value: true +}); +_$events_52["default"] = _$events_52.FakeEvent = void 0; - return resizeEvent; - }, +/* removed: var _$arr_47 = require("./arr"); */; - gestureStart: function (event) { - var gestureEvent = new InteractEvent(this, event, 'gesture', 'start', this.element); +var __domUtils_52 = ___interopRequireWildcard_52(_$domUtils_51); - gestureEvent.ds = 0; +var __is_52 = ___interopRequireWildcard_52(_$is_57); - this.gesture.startDistance = this.gesture.prevDistance = gestureEvent.distance; - this.gesture.startAngle = this.gesture.prevAngle = gestureEvent.angle; - this.gesture.scale = 1; +var ___pointerExtend_52 = ___interopRequireDefault_52(_$pointerExtend_60); - this.gesturing = true; +var _pointerUtils = ___interopRequireDefault_52(_$pointerUtils_61); - this.target.fire(gestureEvent); +function ___interopRequireDefault_52(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - return gestureEvent; - }, +function ___interopRequireWildcard_52(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - gestureMove: function (event) { - if (!this.pointerIds.length) { - return this.prevEvent; - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var gestureEvent; +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - gestureEvent = new InteractEvent(this, event, 'gesture', 'move', this.element); - gestureEvent.ds = gestureEvent.scale - this.gesture.scale; +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - this.target.fire(gestureEvent); +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - this.gesture.prevAngle = gestureEvent.angle; - this.gesture.prevDistance = gestureEvent.distance; +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - if (gestureEvent.scale !== Infinity && - gestureEvent.scale !== null && - gestureEvent.scale !== undefined && - !isNaN(gestureEvent.scale)) { +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - this.gesture.scale = gestureEvent.scale; - } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - return gestureEvent; - }, +var elements = []; +var targets = []; +var delegatedEvents = {}; +var documents = []; - pointerHold: function (pointer, event, eventTarget) { - this.collectEventTargets(pointer, event, eventTarget, 'hold'); - }, +function add(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; - pointerUp: function (pointer, event, eventTarget, curEventTarget) { - var pointerIndex = this.mouse? 0 : indexOf(this.pointerIds, getPointerId(pointer)); + if (!target) { + target = { + events: {}, + typeCount: 0 + }; + elementIndex = elements.push(element) - 1; + targets.push(target); + } + + if (!target.events[type]) { + target.events[type] = []; + target.typeCount++; + } + + if (!(0, _$arr_47.contains)(target.events[type], listener)) { + element.addEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].push(listener); + } +} + +function __remove_52(element, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var elementIndex = elements.indexOf(element); + var target = targets[elementIndex]; + + if (!target || !target.events) { + return; + } + + if (type === 'all') { + for (type in target.events) { + if (target.events.hasOwnProperty(type)) { + __remove_52(element, type, 'all'); + } + } - clearTimeout(this.holdTimers[pointerIndex]); + return; + } - this.collectEventTargets(pointer, event, eventTarget, 'up' ); - this.collectEventTargets(pointer, event, eventTarget, 'tap'); + if (target.events[type]) { + var len = target.events[type].length; - this.pointerEnd(pointer, event, eventTarget, curEventTarget); + if (listener === 'all') { + for (var i = 0; i < len; i++) { + __remove_52(element, type, target.events[type][i], options); + } - this.removePointer(pointer); - }, + return; + } else { + for (var _i = 0; _i < len; _i++) { + if (target.events[type][_i] === listener) { + element.removeEventListener(type, listener, events.supportsOptions ? options : !!options.capture); + target.events[type].splice(_i, 1); + break; + } + } + } - pointerCancel: function (pointer, event, eventTarget, curEventTarget) { - var pointerIndex = this.mouse? 0 : indexOf(this.pointerIds, getPointerId(pointer)); + if (target.events[type] && target.events[type].length === 0) { + target.events[type] = null; + target.typeCount--; + } + } + + if (!target.typeCount) { + targets.splice(elementIndex, 1); + elements.splice(elementIndex, 1); + } +} + +function addDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + + if (!delegatedEvents[type]) { + delegatedEvents[type] = { + contexts: [], + listeners: [], + selectors: [] + }; // add delegate listener functions + + for (var _i2 = 0; _i2 < documents.length; _i2++) { + var doc = documents[_i2]; + add(doc, type, delegateListener); + add(doc, type, delegateUseCapture, true); + } + } - clearTimeout(this.holdTimers[pointerIndex]); + var delegated = delegatedEvents[type]; + var index; - this.collectEventTargets(pointer, event, eventTarget, 'cancel'); - this.pointerEnd(pointer, event, eventTarget, curEventTarget); + for (index = delegated.selectors.length - 1; index >= 0; index--) { + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + break; + } + } - this.removePointer(pointer); - }, + if (index === -1) { + index = delegated.selectors.length; + delegated.selectors.push(selector); + delegated.contexts.push(context); + delegated.listeners.push([]); + } // keep listener and capture and passive flags - // http://www.quirksmode.org/dom/events/click.html - // >Events leading to dblclick - // - // IE8 doesn't fire down event before dblclick. - // This workaround tries to fire a tap and doubletap after dblclick - ie8Dblclick: function (pointer, event, eventTarget) { - if (this.prevTap - && event.clientX === this.prevTap.clientX - && event.clientY === this.prevTap.clientY - && eventTarget === this.prevTap.target) { - - this.downTargets[0] = eventTarget; - this.downTimes[0] = new Date().getTime(); - this.collectEventTargets(pointer, event, eventTarget, 'tap'); - } - }, - // End interact move events and stop auto-scroll unless inertia is enabled - pointerEnd: function (pointer, event, eventTarget, curEventTarget) { - var endEvent, - target = this.target, - options = target && target.options, - inertiaOptions = options && this.prepared.name && options[this.prepared.name].inertia, - inertiaStatus = this.inertiaStatus; - - if (this.interacting()) { - - if (inertiaStatus.active && !inertiaStatus.ending) { return; } - - var pointerSpeed, - now = new Date().getTime(), - inertiaPossible = false, - inertia = false, - smoothEnd = false, - endSnap = checkSnap(target, this.prepared.name) && options[this.prepared.name].snap.endOnly, - endRestrict = checkRestrict(target, this.prepared.name) && options[this.prepared.name].restrict.endOnly, - dx = 0, - dy = 0, - startEvent; - - if (this.dragging) { - if (options.drag.axis === 'x' ) { pointerSpeed = Math.abs(this.pointerDelta.client.vx); } - else if (options.drag.axis === 'y' ) { pointerSpeed = Math.abs(this.pointerDelta.client.vy); } - else /*options.drag.axis === 'xy'*/{ pointerSpeed = this.pointerDelta.client.speed; } - } - else { - pointerSpeed = this.pointerDelta.client.speed; - } - - // check if inertia should be started - inertiaPossible = (inertiaOptions && inertiaOptions.enabled - && this.prepared.name !== 'gesture' - && event !== inertiaStatus.startEvent); - - inertia = (inertiaPossible - && (now - this.curCoords.timeStamp) < 50 - && pointerSpeed > inertiaOptions.minSpeed - && pointerSpeed > inertiaOptions.endSpeed); - - if (inertiaPossible && !inertia && (endSnap || endRestrict)) { - - var snapRestrict = {}; - - snapRestrict.snap = snapRestrict.restrict = snapRestrict; - - if (endSnap) { - this.setSnapping(this.curCoords.page, snapRestrict); - if (snapRestrict.locked) { - dx += snapRestrict.dx; - dy += snapRestrict.dy; - } - } - - if (endRestrict) { - this.setRestriction(this.curCoords.page, snapRestrict); - if (snapRestrict.restricted) { - dx += snapRestrict.dx; - dy += snapRestrict.dy; - } - } - - if (dx || dy) { - smoothEnd = true; - } - } - - if (inertia || smoothEnd) { - copyCoords(inertiaStatus.upCoords, this.curCoords); - - this.pointers[0] = inertiaStatus.startEvent = startEvent = - new InteractEvent(this, event, this.prepared.name, 'inertiastart', this.element); - - inertiaStatus.t0 = now; - - target.fire(inertiaStatus.startEvent); - - if (inertia) { - inertiaStatus.vx0 = this.pointerDelta.client.vx; - inertiaStatus.vy0 = this.pointerDelta.client.vy; - inertiaStatus.v0 = pointerSpeed; - - this.calcInertia(inertiaStatus); - - var page = extend({}, this.curCoords.page), - origin = getOriginXY(target, this.element), - statusObject; - - page.x = page.x + inertiaStatus.xe - origin.x; - page.y = page.y + inertiaStatus.ye - origin.y; - - statusObject = { - useStatusXY: true, - x: page.x, - y: page.y, - dx: 0, - dy: 0, - snap: null - }; - - statusObject.snap = statusObject; - - dx = dy = 0; - - if (endSnap) { - var snap = this.setSnapping(this.curCoords.page, statusObject); - - if (snap.locked) { - dx += snap.dx; - dy += snap.dy; - } - } - - if (endRestrict) { - var restrict = this.setRestriction(this.curCoords.page, statusObject); - - if (restrict.restricted) { - dx += restrict.dx; - dy += restrict.dy; - } - } - - inertiaStatus.modifiedXe += dx; - inertiaStatus.modifiedYe += dy; - - inertiaStatus.i = reqFrame(this.boundInertiaFrame); - } - else { - inertiaStatus.smoothEnd = true; - inertiaStatus.xe = dx; - inertiaStatus.ye = dy; + delegated.listeners[index].push([listener, !!options.capture, options.passive]); +} - inertiaStatus.sx = inertiaStatus.sy = 0; +function removeDelegate(selector, context, type, listener, optionalArg) { + var options = getOptions(optionalArg); + var delegated = delegatedEvents[type]; + var matchFound = false; + var index; - inertiaStatus.i = reqFrame(this.boundSmoothEndFrame); - } + if (!delegated) { + return; + } // count from last index of delegated to 0 - inertiaStatus.active = true; - return; - } - if (endSnap || endRestrict) { - // fire a move event at the snapped coordinates - this.pointerMove(pointer, event, eventTarget, curEventTarget, true); - } - } + for (index = delegated.selectors.length - 1; index >= 0; index--) { + // look for matching selector and context Node + if (delegated.selectors[index] === selector && delegated.contexts[index] === context) { + var listeners = delegated.listeners[index]; // each item of the listeners array is an array: [function, capture, passive] - if (this.dragging) { - endEvent = new InteractEvent(this, event, 'drag', 'end', this.element); + for (var i = listeners.length - 1; i >= 0; i--) { + var _listeners$i = _slicedToArray(listeners[i], 3), + fn = _listeners$i[0], + capture = _listeners$i[1], + passive = _listeners$i[2]; // check if the listener functions and capture and passive flags match - var draggableElement = this.element, - drop = this.getDrop(endEvent, event, draggableElement); - this.dropTarget = drop.dropzone; - this.dropElement = drop.element; + if (fn === listener && capture === !!options.capture && passive === options.passive) { + // remove the listener from the array of listeners + listeners.splice(i, 1); // if all listeners for this interactable have been removed + // remove the interactable from the delegated arrays - var dropEvents = this.getDropEvents(event, endEvent); + if (!listeners.length) { + delegated.selectors.splice(index, 1); + delegated.contexts.splice(index, 1); + delegated.listeners.splice(index, 1); // remove delegate function from context - if (dropEvents.leave) { this.prevDropTarget.fire(dropEvents.leave); } - if (dropEvents.enter) { this.dropTarget.fire(dropEvents.enter); } - if (dropEvents.drop ) { this.dropTarget.fire(dropEvents.drop ); } - if (dropEvents.deactivate) { - this.fireActiveDrops(dropEvents.deactivate); - } + __remove_52(context, type, delegateListener); + __remove_52(context, type, delegateUseCapture, true); // remove the arrays if they are empty - target.fire(endEvent); - } - else if (this.resizing) { - endEvent = new InteractEvent(this, event, 'resize', 'end', this.element); - target.fire(endEvent); - } - else if (this.gesturing) { - endEvent = new InteractEvent(this, event, 'gesture', 'end', this.element); - target.fire(endEvent); + if (!delegated.selectors.length) { + delegatedEvents[type] = null; } + } // only remove one listener - this.stop(event); - }, - collectDrops: function (element) { - var drops = [], - elements = [], - i; + matchFound = true; + break; + } + } - element = element || this.element; + if (matchFound) { + break; + } + } + } +} // bound to the interactable context when a DOM event +// listener is added to a selector interactable - // collect all dropzones and their elements which qualify for a drop - for (i = 0; i < interactables.length; i++) { - if (!interactables[i].options.drop.enabled) { continue; } - var current = interactables[i], - accept = current.options.drop.accept; +function delegateListener(event, optionalArg) { + var options = getOptions(optionalArg); + var fakeEvent = new FakeEvent(event); + var delegated = delegatedEvents[event.type]; - // test the draggable element against the dropzone's accept setting - if ((isElement(accept) && accept !== element) - || (isString(accept) - && !matchesSelector(element, accept))) { + var _pointerUtils$getEven = _pointerUtils["default"].getEventTargets(event), + _pointerUtils$getEven2 = _slicedToArray(_pointerUtils$getEven, 1), + eventTarget = _pointerUtils$getEven2[0]; - continue; - } + var element = eventTarget; // climb up document tree looking for selector matches - // query for new elements if necessary - var dropElements = current.selector? current._context.querySelectorAll(current.selector) : [current._element]; + while (__is_52.element(element)) { + for (var i = 0; i < delegated.selectors.length; i++) { + var selector = delegated.selectors[i]; + var context = delegated.contexts[i]; - for (var j = 0, len = dropElements.length; j < len; j++) { - var currentElement = dropElements[j]; + if (__domUtils_52.matchesSelector(element, selector) && __domUtils_52.nodeContains(context, eventTarget) && __domUtils_52.nodeContains(context, element)) { + var listeners = delegated.listeners[i]; + fakeEvent.currentTarget = element; - if (currentElement === element) { - continue; - } + for (var _i3 = 0; _i3 < listeners.length; _i3++) { + var _ref; - drops.push(current); - elements.push(currentElement); - } - } + _ref = listeners[_i3]; - return { - dropzones: drops, - elements: elements - }; - }, + var _ref2 = _ref, + _ref3 = _slicedToArray(_ref2, 3), + fn = _ref3[0], + capture = _ref3[1], + passive = _ref3[2]; - fireActiveDrops: function (event) { - var i, - current, - currentElement, - prevElement; - - // loop through all active dropzones and trigger event - for (i = 0; i < this.activeDrops.dropzones.length; i++) { - current = this.activeDrops.dropzones[i]; - currentElement = this.activeDrops.elements [i]; - - // prevent trigger of duplicate events on same element - if (currentElement !== prevElement) { - // set current element as event target - event.target = currentElement; - current.fire(event); - } - prevElement = currentElement; - } - }, + if (capture === !!options.capture && passive === options.passive) { + fn(fakeEvent); + } + } + } + } - // Collect a new set of possible drops and save them in activeDrops. - // setActiveDrops should always be called when a drag has just started or a - // drag event happens while dynamicDrop is true - setActiveDrops: function (dragElement) { - // get dropzones and their elements that could receive the draggable - var possibleDrops = this.collectDrops(dragElement, true); + element = __domUtils_52.parentNode(element); + } +} - this.activeDrops.dropzones = possibleDrops.dropzones; - this.activeDrops.elements = possibleDrops.elements; - this.activeDrops.rects = []; +function delegateUseCapture(event) { + return delegateListener.call(this, event, true); +} - for (var i = 0; i < this.activeDrops.dropzones.length; i++) { - this.activeDrops.rects[i] = this.activeDrops.dropzones[i].getRect(this.activeDrops.elements[i]); - } - }, +function getOptions(param) { + return __is_52.object(param) ? param : { + capture: param + }; +} - getDrop: function (dragEvent, event, dragElement) { - var validDrops = []; +var FakeEvent = +/*#__PURE__*/ +function () { + function FakeEvent(originalEvent) { + _classCallCheck(this, FakeEvent); - if (dynamicDrop) { - this.setActiveDrops(dragElement); - } + this.originalEvent = originalEvent; // duplicate the event so that currentTarget can be changed - // collect all dropzones and their elements which qualify for a drop - for (var j = 0; j < this.activeDrops.dropzones.length; j++) { - var current = this.activeDrops.dropzones[j], - currentElement = this.activeDrops.elements [j], - rect = this.activeDrops.rects [j]; + (0, ___pointerExtend_52["default"])(this, originalEvent); + } - validDrops.push(current.dropCheck(dragEvent, event, this.target, dragElement, currentElement, rect) - ? currentElement - : null); - } + _createClass(FakeEvent, [{ + key: "preventOriginalDefault", + value: function preventOriginalDefault() { + this.originalEvent.preventDefault(); + } + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.originalEvent.stopPropagation(); + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.originalEvent.stopImmediatePropagation(); + } + }]); + + return FakeEvent; +}(); + +_$events_52.FakeEvent = FakeEvent; +var events = { + add: add, + remove: __remove_52, + addDelegate: addDelegate, + removeDelegate: removeDelegate, + delegateListener: delegateListener, + delegateUseCapture: delegateUseCapture, + delegatedEvents: delegatedEvents, + documents: documents, + supportsOptions: false, + supportsPassive: false, + _elements: elements, + _targets: targets, + init: function init(window) { + window.document.createElement('div').addEventListener('test', null, { + get capture() { + return events.supportsOptions = true; + }, + + get passive() { + return events.supportsPassive = true; + } + + }); + } +}; +var ___default_52 = events; +_$events_52["default"] = ___default_52; + +var _$extend_53 = {}; +"use strict"; + +Object.defineProperty(_$extend_53, "__esModule", { + value: true +}); +_$extend_53["default"] = extend; + +function extend(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + + return dest; +} + +var _$rect_63 = {}; +"use strict"; + +Object.defineProperty(_$rect_63, "__esModule", { + value: true +}); +_$rect_63.getStringOptionResult = getStringOptionResult; +_$rect_63.resolveRectLike = resolveRectLike; +_$rect_63.rectToXY = rectToXY; +_$rect_63.xywhToTlbr = xywhToTlbr; +_$rect_63.tlbrToXywh = tlbrToXywh; +_$rect_63["default"] = void 0; + +/* removed: var _$domUtils_51 = require("./domUtils"); */; + +var _extend = ___interopRequireDefault_63(_$extend_53); + +var __is_63 = ___interopRequireWildcard_63(_$is_57); + +function ___interopRequireWildcard_63(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_63(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +function getStringOptionResult(value, interactable, element) { + if (value === 'parent') { + return (0, _$domUtils_51.parentNode)(element); + } + + if (value === 'self') { + return interactable.getRect(element); + } + + return (0, _$domUtils_51.closest)(element, value); +} + +function resolveRectLike(value, interactable, element, functionArgs) { + if (__is_63.string(value)) { + value = getStringOptionResult(value, interactable, element); + } else if (__is_63.func(value)) { + value = value.apply(void 0, _toConsumableArray(functionArgs)); + } + + if (__is_63.element(value)) { + value = (0, _$domUtils_51.getElementRect)(value); + } + + return value; +} + +function rectToXY(rect) { + return rect && { + x: 'x' in rect ? rect.x : rect.left, + y: 'y' in rect ? rect.y : rect.top + }; +} + +function xywhToTlbr(rect) { + if (rect && !('left' in rect && 'top' in rect)) { + rect = (0, _extend["default"])({}, rect); + rect.left = rect.x || 0; + rect.top = rect.y || 0; + rect.right = rect.right || rect.left + rect.width; + rect.bottom = rect.bottom || rect.top + rect.height; + } + + return rect; +} + +function tlbrToXywh(rect) { + if (rect && !('x' in rect && 'y' in rect)) { + rect = (0, _extend["default"])({}, rect); + rect.x = rect.left || 0; + rect.y = rect.top || 0; + rect.width = rect.width || rect.right - rect.x; + rect.height = rect.height || rect.bottom - rect.y; + } + + return rect; +} + +var ___default_63 = { + getStringOptionResult: getStringOptionResult, + resolveRectLike: resolveRectLike, + rectToXY: rectToXY, + xywhToTlbr: xywhToTlbr, + tlbrToXywh: tlbrToXywh +}; +_$rect_63["default"] = ___default_63; - // get the most appropriate dropzone based on DOM depth and order - var dropIndex = indexOfDeepestElement(validDrops), - dropzone = this.activeDrops.dropzones[dropIndex] || null, - element = this.activeDrops.elements [dropIndex] || null; +var _$getOriginXY_54 = {}; +"use strict"; + +Object.defineProperty(_$getOriginXY_54, "__esModule", { + value: true +}); +_$getOriginXY_54["default"] = ___default_54; + +/* removed: var _$rect_63 = require("./rect"); */; + +function ___default_54(target, element, action) { + var actionOptions = target.options[action]; + var actionOrigin = actionOptions && actionOptions.origin; + var origin = actionOrigin || target.options.origin; + var originRect = (0, _$rect_63.resolveRectLike)(origin, target, element, [target && element]); + return (0, _$rect_63.rectToXY)(originRect) || { + x: 0, + y: 0 + }; +} + +var _$normalizeListeners_59 = {}; +"use strict"; + +Object.defineProperty(_$normalizeListeners_59, "__esModule", { + value: true +}); +_$normalizeListeners_59["default"] = normalize; + +var ___extend_59 = ___interopRequireDefault_59(_$extend_53); + +var __is_59 = ___interopRequireWildcard_59(_$is_57); + +function ___interopRequireWildcard_59(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_59(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function normalize(type, listeners, result) { + result = result || {}; + + if (__is_59.string(type) && type.search(' ') !== -1) { + type = split(type); + } + + if (__is_59.array(type)) { + return type.reduce(function (acc, t) { + return (0, ___extend_59["default"])(acc, normalize(t, listeners, result)); + }, result); + } // ({ type: fn }) -> ('', { type: fn }) + + + if (__is_59.object(type)) { + listeners = type; + type = ''; + } + + if (__is_59.func(listeners)) { + result[type] = result[type] || []; + result[type].push(listeners); + } else if (__is_59.array(listeners)) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; + + _ref = listeners[_i]; + var l = _ref; + normalize(type, l, result); + } + } else if (__is_59.object(listeners)) { + for (var prefix in listeners) { + var combinedTypes = split(prefix).map(function (p) { + return "".concat(type).concat(p); + }); + normalize(combinedTypes, listeners[prefix], result); + } + } - return { - dropzone: dropzone, - element: element - }; - }, + return result; +} - getDropEvents: function (pointerEvent, dragEvent) { - var dropEvents = { - enter : null, - leave : null, - activate : null, - deactivate: null, - move : null, - drop : null - }; - - if (this.dropElement !== this.prevDropElement) { - // if there was a prevDropTarget, create a dragleave event - if (this.prevDropTarget) { - dropEvents.leave = { - target : this.prevDropElement, - dropzone : this.prevDropTarget, - relatedTarget: dragEvent.target, - draggable : dragEvent.interactable, - dragEvent : dragEvent, - interaction : this, - timeStamp : dragEvent.timeStamp, - type : 'dragleave' - }; - - dragEvent.dragLeave = this.prevDropElement; - dragEvent.prevDropzone = this.prevDropTarget; - } - // if the dropTarget is not null, create a dragenter event - if (this.dropTarget) { - dropEvents.enter = { - target : this.dropElement, - dropzone : this.dropTarget, - relatedTarget: dragEvent.target, - draggable : dragEvent.interactable, - dragEvent : dragEvent, - interaction : this, - timeStamp : dragEvent.timeStamp, - type : 'dragenter' - }; - - dragEvent.dragEnter = this.dropElement; - dragEvent.dropzone = this.dropTarget; - } - } +function split(type) { + return type.trim().split(/ +/); +} - if (dragEvent.type === 'dragend' && this.dropTarget) { - dropEvents.drop = { - target : this.dropElement, - dropzone : this.dropTarget, - relatedTarget: dragEvent.target, - draggable : dragEvent.interactable, - dragEvent : dragEvent, - interaction : this, - timeStamp : dragEvent.timeStamp, - type : 'drop' - }; - - dragEvent.dropzone = this.dropTarget; - } - if (dragEvent.type === 'dragstart') { - dropEvents.activate = { - target : null, - dropzone : null, - relatedTarget: dragEvent.target, - draggable : dragEvent.interactable, - dragEvent : dragEvent, - interaction : this, - timeStamp : dragEvent.timeStamp, - type : 'dropactivate' - }; - } - if (dragEvent.type === 'dragend') { - dropEvents.deactivate = { - target : null, - dropzone : null, - relatedTarget: dragEvent.target, - draggable : dragEvent.interactable, - dragEvent : dragEvent, - interaction : this, - timeStamp : dragEvent.timeStamp, - type : 'dropdeactivate' - }; - } - if (dragEvent.type === 'dragmove' && this.dropTarget) { - dropEvents.move = { - target : this.dropElement, - dropzone : this.dropTarget, - relatedTarget: dragEvent.target, - draggable : dragEvent.interactable, - dragEvent : dragEvent, - interaction : this, - dragmove : dragEvent, - timeStamp : dragEvent.timeStamp, - type : 'dropmove' - }; - dragEvent.dropzone = this.dropTarget; - } +var _$raf_62 = {}; +"use strict"; - return dropEvents; - }, +Object.defineProperty(_$raf_62, "__esModule", { + value: true +}); +_$raf_62["default"] = void 0; +var lastTime = 0; - currentAction: function () { - return (this.dragging && 'drag') || (this.resizing && 'resize') || (this.gesturing && 'gesture') || null; - }, +var _request; - interacting: function () { - return this.dragging || this.resizing || this.gesturing; - }, +var _cancel; - clearTargets: function () { - this.target = this.element = null; +function __init_62(window) { + _request = window.requestAnimationFrame; + _cancel = window.cancelAnimationFrame; - this.dropTarget = this.dropElement = this.prevDropTarget = this.prevDropElement = null; - }, + if (!_request) { + var vendors = ['ms', 'moz', 'webkit', 'o']; - stop: function (event) { - if (this.interacting()) { - autoScroll.stop(); - this.matches = []; - this.matchElements = []; + for (var _i = 0; _i < vendors.length; _i++) { + var vendor = vendors[_i]; + _request = window["".concat(vendor, "RequestAnimationFrame")]; + _cancel = window["".concat(vendor, "CancelAnimationFrame")] || window["".concat(vendor, "CancelRequestAnimationFrame")]; + } + } + + if (!_request) { + _request = function request(callback) { + var currTime = Date.now(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line standard/no-callback-literal + + var token = setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return token; + }; - var target = this.target; + _cancel = function cancel(token) { + return clearTimeout(token); + }; + } +} + +var ___default_62 = { + request: function request(callback) { + return _request(callback); + }, + cancel: function cancel(token) { + return _cancel(token); + }, + init: __init_62 +}; +_$raf_62["default"] = ___default_62; + +var _$Signals_46 = {}; +"use strict"; + +Object.defineProperty(_$Signals_46, "__esModule", { + value: true +}); +_$Signals_46["default"] = void 0; + +function ___classCallCheck_46(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_46(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_46(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_46(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_46(Constructor, staticProps); return Constructor; } + +var Signals = +/*#__PURE__*/ +function () { + function Signals() { + ___classCallCheck_46(this, Signals); + + this.listeners = {}; + } + + ___createClass_46(Signals, [{ + key: "on", + value: function on(name, listener) { + if (!this.listeners[name]) { + this.listeners[name] = [listener]; + return; + } + + this.listeners[name].push(listener); + } + }, { + key: "off", + value: function off(name, listener) { + if (!this.listeners[name]) { + return; + } + + var index = this.listeners[name].indexOf(listener); + + if (index !== -1) { + this.listeners[name].splice(index, 1); + } + } + }, { + key: "fire", + value: function fire(name, arg) { + var targetListeners = this.listeners[name]; - if (target.options.styleCursor) { - target._doc.documentElement.style.cursor = ''; - } + if (!targetListeners) { + return; + } - // prevent Default only if were previously interacting - if (event && isFunction(event.preventDefault)) { - this.checkAndPreventDefault(event, target, this.element); - } + for (var _i = 0; _i < targetListeners.length; _i++) { + var _ref; - if (this.dragging) { - this.activeDrops.dropzones = this.activeDrops.elements = this.activeDrops.rects = null; - } - } + _ref = targetListeners[_i]; + var listener = _ref; - this.clearTargets(); + if (listener(arg, name) === false) { + return false; + } + } + } + }]); + + return Signals; +}(); + +var ___default_46 = Signals; +_$Signals_46["default"] = ___default_46; + +var _$utils_56 = {}; +"use strict"; + +Object.defineProperty(_$utils_56, "__esModule", { + value: true +}); +_$utils_56.warnOnce = warnOnce; +_$utils_56._getQBezierValue = _getQBezierValue; +_$utils_56.getQuadraticCurvePoint = getQuadraticCurvePoint; +_$utils_56.easeOutQuad = easeOutQuad; +_$utils_56.copyAction = copyAction; +Object.defineProperty(_$utils_56, "win", { + enumerable: true, + get: function get() { + return ___window_56["default"]; + } +}); +Object.defineProperty(_$utils_56, "browser", { + enumerable: true, + get: function get() { + return ___browser_56["default"]; + } +}); +Object.defineProperty(_$utils_56, "clone", { + enumerable: true, + get: function get() { + return _clone["default"]; + } +}); +Object.defineProperty(_$utils_56, "events", { + enumerable: true, + get: function get() { + return _events["default"]; + } +}); +Object.defineProperty(_$utils_56, "extend", { + enumerable: true, + get: function get() { + return ___extend_56["default"]; + } +}); +Object.defineProperty(_$utils_56, "getOriginXY", { + enumerable: true, + get: function get() { + return _getOriginXY["default"]; + } +}); +Object.defineProperty(_$utils_56, "hypot", { + enumerable: true, + get: function get() { + return ___hypot_56["default"]; + } +}); +Object.defineProperty(_$utils_56, "normalizeListeners", { + enumerable: true, + get: function get() { + return _normalizeListeners["default"]; + } +}); +Object.defineProperty(_$utils_56, "pointer", { + enumerable: true, + get: function get() { + return ___pointerUtils_56["default"]; + } +}); +Object.defineProperty(_$utils_56, "raf", { + enumerable: true, + get: function get() { + return _raf["default"]; + } +}); +Object.defineProperty(_$utils_56, "rect", { + enumerable: true, + get: function get() { + return ___rect_56["default"]; + } +}); +Object.defineProperty(_$utils_56, "Signals", { + enumerable: true, + get: function get() { + return _Signals["default"]; + } +}); +_$utils_56.is = _$utils_56.dom = _$utils_56.arr = void 0; + +var __arr_56 = ___interopRequireWildcard_56(_$arr_47); + +_$utils_56.arr = __arr_56; + +var dom = ___interopRequireWildcard_56(_$domUtils_51); + +_$utils_56.dom = dom; + +var __is_56 = ___interopRequireWildcard_56(_$is_57); + +_$utils_56.is = __is_56; + +var ___window_56 = ___interopRequireDefault_56(_$window_66); + +var ___browser_56 = ___interopRequireDefault_56(_$browser_48); + +var _clone = ___interopRequireDefault_56(_$clone_49); + +var _events = ___interopRequireDefault_56(_$events_52); + +var ___extend_56 = ___interopRequireDefault_56(_$extend_53); + +var _getOriginXY = ___interopRequireDefault_56(_$getOriginXY_54); + +var ___hypot_56 = ___interopRequireDefault_56(_$hypot_55); + +var _normalizeListeners = ___interopRequireDefault_56(_$normalizeListeners_59); + +var ___pointerUtils_56 = ___interopRequireDefault_56(_$pointerUtils_61); + +var _raf = ___interopRequireDefault_56(_$raf_62); + +var ___rect_56 = ___interopRequireDefault_56(_$rect_63); + +var _Signals = ___interopRequireDefault_56(_$Signals_46); + +function ___interopRequireDefault_56(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_56(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function warnOnce(method, message) { + var warned = false; // eslint-disable-next-line no-shadow + + return function () { + if (!warned) { + ___window_56["default"].window.console.warn(message); + + warned = true; + } - this.pointerIsDown = this.snapStatus.locked = this.dragging = this.resizing = this.gesturing = false; - this.prepared.name = this.prevEvent = null; - this.inertiaStatus.resumeDx = this.inertiaStatus.resumeDy = 0; + return method.apply(this, arguments); + }; +} // http://stackoverflow.com/a/5634528/2280888 + + +function _getQBezierValue(t, p1, p2, p3) { + var iT = 1 - t; + return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3; +} + +function getQuadraticCurvePoint(startX, startY, cpX, cpY, endX, endY, position) { + return { + x: _getQBezierValue(position, startX, cpX, endX), + y: _getQBezierValue(position, startY, cpY, endY) + }; +} // http://gizma.com/easing/ + + +function easeOutQuad(t, b, c, d) { + t /= d; + return -c * t * (t - 2) + b; +} + +function copyAction(dest, src) { + dest.name = src.name; + dest.axis = src.axis; + dest.edges = src.edges; + return dest; +} + +var _$defaultOptions_20 = {}; +"use strict"; + +Object.defineProperty(_$defaultOptions_20, "__esModule", { + value: true +}); +_$defaultOptions_20["default"] = _$defaultOptions_20.defaults = void 0; +// tslint:disable no-empty-interface +var defaults = { + base: { + preventDefault: 'auto', + deltaSource: 'page' + }, + perAction: { + enabled: false, + origin: { + x: 0, + y: 0 + } + }, + actions: {} +}; +_$defaultOptions_20.defaults = defaults; +var ___default_20 = defaults; +_$defaultOptions_20["default"] = ___default_20; - // remove pointers if their ID isn't in this.pointerIds - for (var i = 0; i < this.pointers.length; i++) { - if (indexOf(this.pointerIds, getPointerId(this.pointers[i])) === -1) { - this.pointers.splice(i, 1); - } - } - }, +var _$Eventable_14 = {}; +"use strict"; - inertiaFrame: function () { - var inertiaStatus = this.inertiaStatus, - options = this.target.options[this.prepared.name].inertia, - lambda = options.resistance, - t = new Date().getTime() / 1000 - inertiaStatus.t0; +Object.defineProperty(_$Eventable_14, "__esModule", { + value: true +}); +_$Eventable_14["default"] = void 0; - if (t < inertiaStatus.te) { +var __arr_14 = ___interopRequireWildcard_14(_$arr_47); - var progress = 1 - (Math.exp(-lambda * t) - inertiaStatus.lambda_v0) / inertiaStatus.one_ve_v0; +var ___extend_14 = ___interopRequireDefault_14(_$extend_53); - if (inertiaStatus.modifiedXe === inertiaStatus.xe && inertiaStatus.modifiedYe === inertiaStatus.ye) { - inertiaStatus.sx = inertiaStatus.xe * progress; - inertiaStatus.sy = inertiaStatus.ye * progress; - } - else { - var quadPoint = getQuadraticCurvePoint( - 0, 0, - inertiaStatus.xe, inertiaStatus.ye, - inertiaStatus.modifiedXe, inertiaStatus.modifiedYe, - progress); +var ___normalizeListeners_14 = ___interopRequireDefault_14(_$normalizeListeners_59); - inertiaStatus.sx = quadPoint.x; - inertiaStatus.sy = quadPoint.y; - } +function ___interopRequireDefault_14(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - this.pointerMove(inertiaStatus.startEvent, inertiaStatus.startEvent); +function ___interopRequireWildcard_14(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - inertiaStatus.i = reqFrame(this.boundInertiaFrame); - } - else { - inertiaStatus.ending = true; +function ___classCallCheck_14(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - inertiaStatus.sx = inertiaStatus.modifiedXe; - inertiaStatus.sy = inertiaStatus.modifiedYe; +function ___defineProperties_14(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - this.pointerMove(inertiaStatus.startEvent, inertiaStatus.startEvent); - this.pointerEnd(inertiaStatus.startEvent, inertiaStatus.startEvent); +function ___createClass_14(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_14(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_14(Constructor, staticProps); return Constructor; } - inertiaStatus.active = inertiaStatus.ending = false; - } - }, +function fireUntilImmediateStopped(event, listeners) { + for (var _i = 0; _i < listeners.length; _i++) { + var _ref; - smoothEndFrame: function () { - var inertiaStatus = this.inertiaStatus, - t = new Date().getTime() - inertiaStatus.t0, - duration = this.target.options[this.prepared.name].inertia.smoothEndDuration; + _ref = listeners[_i]; + var listener = _ref; - if (t < duration) { - inertiaStatus.sx = easeOutQuad(t, 0, inertiaStatus.xe, duration); - inertiaStatus.sy = easeOutQuad(t, 0, inertiaStatus.ye, duration); + if (event.immediatePropagationStopped) { + break; + } - this.pointerMove(inertiaStatus.startEvent, inertiaStatus.startEvent); + listener(event); + } +} + +var Eventable = +/*#__PURE__*/ +function () { + function Eventable(options) { + ___classCallCheck_14(this, Eventable); + + this.types = {}; + this.propagationStopped = false; + this.immediatePropagationStopped = false; + this.options = (0, ___extend_14["default"])({}, options || {}); + } + + ___createClass_14(Eventable, [{ + key: "fire", + value: function fire(event) { + var listeners; + var global = this.global; // Interactable#on() listeners + // tslint:disable no-conditional-assignment + + if (listeners = this.types[event.type]) { + fireUntilImmediateStopped(event, listeners); + } // interact.on() listeners + + + if (!event.propagationStopped && global && (listeners = global[event.type])) { + fireUntilImmediateStopped(event, listeners); + } + } + }, { + key: "on", + value: function on(type, listener) { + var listeners = (0, ___normalizeListeners_14["default"])(type, listener); + + for (type in listeners) { + this.types[type] = __arr_14.merge(this.types[type] || [], listeners[type]); + } + } + }, { + key: "off", + value: function off(type, listener) { + var listeners = (0, ___normalizeListeners_14["default"])(type, listener); - inertiaStatus.i = reqFrame(this.boundSmoothEndFrame); - } - else { - inertiaStatus.ending = true; + for (type in listeners) { + var eventList = this.types[type]; - inertiaStatus.sx = inertiaStatus.xe; - inertiaStatus.sy = inertiaStatus.ye; + if (!eventList || !eventList.length) { + continue; + } - this.pointerMove(inertiaStatus.startEvent, inertiaStatus.startEvent); - this.pointerEnd(inertiaStatus.startEvent, inertiaStatus.startEvent); + for (var _i2 = 0; _i2 < listeners[type].length; _i2++) { + var _ref2; - inertiaStatus.smoothEnd = - inertiaStatus.active = inertiaStatus.ending = false; - } - }, + _ref2 = listeners[type][_i2]; + var subListener = _ref2; + var index = eventList.indexOf(subListener); - addPointer: function (pointer) { - var id = getPointerId(pointer), - index = this.mouse? 0 : indexOf(this.pointerIds, id); + if (index !== -1) { + eventList.splice(index, 1); + } + } + } + } + }]); - if (index === -1) { - index = this.pointerIds.length; - } + return Eventable; +}(); - this.pointerIds[index] = id; - this.pointers[index] = pointer; +var ___default_14 = Eventable; +_$Eventable_14["default"] = ___default_14; - return index; - }, +var _$Interactable_16 = {}; +"use strict"; - removePointer: function (pointer) { - var id = getPointerId(pointer), - index = this.mouse? 0 : indexOf(this.pointerIds, id); +Object.defineProperty(_$Interactable_16, "__esModule", { + value: true +}); +_$Interactable_16["default"] = _$Interactable_16.Interactable = void 0; - if (index === -1) { return; } +var __arr_16 = ___interopRequireWildcard_16(_$arr_47); - this.pointers .splice(index, 1); - this.pointerIds .splice(index, 1); - this.downTargets.splice(index, 1); - this.downTimes .splice(index, 1); - this.holdTimers .splice(index, 1); - }, +var ___browser_16 = ___interopRequireDefault_16(_$browser_48); - recordPointer: function (pointer) { - var index = this.mouse? 0: indexOf(this.pointerIds, getPointerId(pointer)); +var ___clone_16 = ___interopRequireDefault_16(_$clone_49); - if (index === -1) { return; } +/* removed: var _$domUtils_51 = require("@interactjs/utils/domUtils"); */; - this.pointers[index] = pointer; - }, +var ___events_16 = ___interopRequireDefault_16(_$events_52); - collectEventTargets: function (pointer, event, eventTarget, eventType) { - var pointerIndex = this.mouse? 0 : indexOf(this.pointerIds, getPointerId(pointer)); +var ___extend_16 = ___interopRequireDefault_16(_$extend_53); - // do not fire a tap event if the pointer was moved before being lifted - if (eventType === 'tap' && (this.pointerWasMoved - // or if the pointerup target is different to the pointerdown target - || !(this.downTargets[pointerIndex] && this.downTargets[pointerIndex] === eventTarget))) { - return; - } +var __is_16 = ___interopRequireWildcard_16(_$is_57); - var targets = [], - elements = [], - element = eventTarget; - - function collectSelectors (interactable, selector, context) { - var els = ie8MatchesSelector - ? context.querySelectorAll(selector) - : undefined; - - if (interactable._iEvents[eventType] - && isElement(element) - && inContext(interactable, element) - && !testIgnore(interactable, element, eventTarget) - && testAllow(interactable, element, eventTarget) - && matchesSelector(element, selector, els)) { - - targets.push(interactable); - elements.push(element); - } - } +var ___normalizeListeners_16 = ___interopRequireDefault_16(_$normalizeListeners_59); - while (element) { - if (interact.isSet(element) && interact(element)._iEvents[eventType]) { - targets.push(interact(element)); - elements.push(element); - } +/* removed: var _$window_66 = require("@interactjs/utils/window"); */; - interactables.forEachSelector(collectSelectors); +var _Eventable = ___interopRequireDefault_16(_$Eventable_14); - element = parentElement(element); - } +function ___interopRequireDefault_16(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - // create the tap event even if there are no listeners so that - // doubletap can still be created and fired - if (targets.length || eventType === 'tap') { - this.firePointers(pointer, event, eventTarget, targets, elements, eventType); - } - }, +function ___interopRequireWildcard_16(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - firePointers: function (pointer, event, eventTarget, targets, elements, eventType) { - var pointerIndex = this.mouse? 0 : indexOf(this.pointerIds, getPointerId(pointer)), - pointerEvent = {}, - i, - // for tap events - interval, createNewDoubleTap; - - // if it's a doubletap then the event properties would have been - // copied from the tap event and provided as the pointer argument - if (eventType === 'doubletap') { - pointerEvent = pointer; - } - else { - pointerExtend(pointerEvent, event); - if (event !== pointer) { - pointerExtend(pointerEvent, pointer); - } - - pointerEvent.preventDefault = preventOriginalDefault; - pointerEvent.stopPropagation = InteractEvent.prototype.stopPropagation; - pointerEvent.stopImmediatePropagation = InteractEvent.prototype.stopImmediatePropagation; - pointerEvent.interaction = this; - - pointerEvent.timeStamp = new Date().getTime(); - pointerEvent.originalEvent = event; - pointerEvent.originalPointer = pointer; - pointerEvent.type = eventType; - pointerEvent.pointerId = getPointerId(pointer); - pointerEvent.pointerType = this.mouse? 'mouse' : !supportsPointerEvent? 'touch' - : isString(pointer.pointerType) - ? pointer.pointerType - : [,,'touch', 'pen', 'mouse'][pointer.pointerType]; - } +function ___classCallCheck_16(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (eventType === 'tap') { - pointerEvent.dt = pointerEvent.timeStamp - this.downTimes[pointerIndex]; +function ___defineProperties_16(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - interval = pointerEvent.timeStamp - this.tapTime; - createNewDoubleTap = !!(this.prevTap && this.prevTap.type !== 'doubletap' - && this.prevTap.target === pointerEvent.target - && interval < 500); +function ___createClass_16(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_16(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_16(Constructor, staticProps); return Constructor; } - pointerEvent.double = createNewDoubleTap; +/** */ +var Interactable = +/*#__PURE__*/ +function () { + /** */ + function Interactable(target, options, defaultContext) { + ___classCallCheck_16(this, Interactable); - this.tapTime = pointerEvent.timeStamp; - } + this.events = new _Eventable["default"](); + this._actions = options.actions; + this.target = target; + this._context = options.context || defaultContext; + this._win = (0, _$window_66.getWindow)((0, _$domUtils_51.trySelector)(target) ? this._context : target); + this._doc = this._win.document; + this.set(options); + } - for (i = 0; i < targets.length; i++) { - pointerEvent.currentTarget = elements[i]; - pointerEvent.interactable = targets[i]; - targets[i].fire(pointerEvent); + ___createClass_16(Interactable, [{ + key: "setOnEvents", + value: function setOnEvents(actionName, phases) { + if (__is_16.func(phases.onstart)) { + this.on("".concat(actionName, "start"), phases.onstart); + } - if (pointerEvent.immediatePropagationStopped - ||(pointerEvent.propagationStopped && elements[i + 1] !== pointerEvent.currentTarget)) { - break; - } - } + if (__is_16.func(phases.onmove)) { + this.on("".concat(actionName, "move"), phases.onmove); + } + + if (__is_16.func(phases.onend)) { + this.on("".concat(actionName, "end"), phases.onend); + } - if (createNewDoubleTap) { - var doubleTap = {}; + if (__is_16.func(phases.oninertiastart)) { + this.on("".concat(actionName, "inertiastart"), phases.oninertiastart); + } + + return this; + } + }, { + key: "updatePerActionListeners", + value: function updatePerActionListeners(actionName, prev, cur) { + if (__is_16.array(prev) || __is_16.object(prev)) { + this.off(actionName, prev); + } + + if (__is_16.array(cur) || __is_16.object(cur)) { + this.on(actionName, cur); + } + } + }, { + key: "setPerAction", + value: function setPerAction(actionName, options) { + var defaults = this._defaults; // for all the default per-action options + + for (var optionName in options) { + var actionOptions = this.options[actionName]; + var optionValue = options[optionName]; + var isArray = __is_16.array(optionValue); // remove old event listeners and add new ones + + if (optionName === 'listeners') { + this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue); + } // if the option value is an array + + + if (isArray) { + actionOptions[optionName] = __arr_16.from(optionValue); + } // if the option value is an object + else if (!isArray && __is_16.plainObject(optionValue)) { + // copy the object + actionOptions[optionName] = (0, ___extend_16["default"])(actionOptions[optionName] || {}, (0, ___clone_16["default"])(optionValue)); // set anabled field to true if it exists in the defaults + + if (__is_16.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) { + actionOptions[optionName].enabled = optionValue.enabled !== false; + } + } // if the option value is a boolean and the default is an object + else if (__is_16.bool(optionValue) && __is_16.object(defaults.perAction[optionName])) { + actionOptions[optionName].enabled = optionValue; + } // if it's anything else, do a plain assignment + else { + actionOptions[optionName] = optionValue; + } + } + } + /** + * The default function to get an Interactables bounding rect. Can be + * overridden using {@link Interactable.rectChecker}. + * + * @param {Element} [element] The element to measure. + * @return {object} The object's bounding rectangle. + */ - extend(doubleTap, pointerEvent); + }, { + key: "getRect", + value: function getRect(element) { + element = element || (__is_16.element(this.target) ? this.target : null); - doubleTap.dt = interval; - doubleTap.type = 'doubletap'; + if (__is_16.string(this.target)) { + element = element || this._context.querySelector(this.target); + } - this.collectEventTargets(doubleTap, event, eventTarget, 'doubletap'); + return (0, _$domUtils_51.getElementRect)(element); + } + /** + * Returns or sets the function used to calculate the interactable's + * element's rectangle + * + * @param {function} [checker] A function which returns this Interactable's + * bounding rectangle. See {@link Interactable.getRect} + * @return {function | object} The checker function or this Interactable + */ + + }, { + key: "rectChecker", + value: function rectChecker(checker) { + if (__is_16.func(checker)) { + this.getRect = checker; + return this; + } + + if (checker === null) { + delete this.getRect; + return this; + } + + return this.getRect; + } + }, { + key: "_backCompatOption", + value: function _backCompatOption(optionName, newValue) { + if ((0, _$domUtils_51.trySelector)(newValue) || __is_16.object(newValue)) { + this.options[optionName] = newValue; + + for (var _i = 0; _i < this._actions.names.length; _i++) { + var _ref; + + _ref = this._actions.names[_i]; + var action = _ref; + this.options[action][optionName] = newValue; + } - this.prevTap = doubleTap; - } - else if (eventType === 'tap') { - this.prevTap = pointerEvent; - } - }, + return this; + } - validateSelector: function (pointer, event, matches, matchElements) { - for (var i = 0, len = matches.length; i < len; i++) { - var match = matches[i], - matchElement = matchElements[i], - action = validateAction(match.getAction(pointer, event, this, matchElement), match); + return this.options[optionName]; + } + /** + * Gets or sets the origin of the Interactable's element. The x and y + * of the origin will be subtracted from action event coordinates. + * + * @param {Element | object | string} [origin] An HTML or SVG Element whose + * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self' + * or any CSS selector + * + * @return {object} The current origin or this Interactable + */ - if (action && withinInteractionLimit(match, matchElement, action)) { - this.target = match; - this.element = matchElement; + }, { + key: "origin", + value: function origin(newValue) { + return this._backCompatOption('origin', newValue); + } + /** + * Returns or sets the mouse coordinate types used to calculate the + * movement of the pointer. + * + * @param {string} [newValue] Use 'client' if you will be scrolling while + * interacting; Use 'page' if you want autoScroll to work + * @return {string | object} The current deltaSource or this Interactable + */ + + }, { + key: "deltaSource", + value: function deltaSource(newValue) { + if (newValue === 'page' || newValue === 'client') { + this.options.deltaSource = newValue; + return this; + } + + return this.options.deltaSource; + } + /** + * Gets the selector context Node of the Interactable. The default is + * `window.document`. + * + * @return {Node} The context Node of this Interactable + */ - return action; - } - } - }, + }, { + key: "context", + value: function context() { + return this._context; + } + }, { + key: "inContext", + value: function inContext(element) { + return this._context === element.ownerDocument || (0, _$domUtils_51.nodeContains)(this._context, element); + } + }, { + key: "testIgnoreAllow", + value: function testIgnoreAllow(options, targetNode, eventTarget) { + return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget); + } + }, { + key: "testAllow", + value: function testAllow(allowFrom, targetNode, element) { + if (!allowFrom) { + return true; + } - setSnapping: function (pageCoords, status) { - var snap = this.target.options[this.prepared.name].snap, - targets = [], - target, - page, - i; + if (!__is_16.element(element)) { + return false; + } - status = status || this.snapStatus; + if (__is_16.string(allowFrom)) { + return (0, _$domUtils_51.matchesUpTo)(element, allowFrom, targetNode); + } else if (__is_16.element(allowFrom)) { + return (0, _$domUtils_51.nodeContains)(allowFrom, element); + } - if (status.useStatusXY) { - page = { x: status.x, y: status.y }; - } - else { - var origin = getOriginXY(this.target, this.element); + return false; + } + }, { + key: "testIgnore", + value: function testIgnore(ignoreFrom, targetNode, element) { + if (!ignoreFrom || !__is_16.element(element)) { + return false; + } - page = extend({}, pageCoords); + if (__is_16.string(ignoreFrom)) { + return (0, _$domUtils_51.matchesUpTo)(element, ignoreFrom, targetNode); + } else if (__is_16.element(ignoreFrom)) { + return (0, _$domUtils_51.nodeContains)(ignoreFrom, element); + } - page.x -= origin.x; - page.y -= origin.y; - } + return false; + } + /** + * Calls listeners for the given InteractEvent type bound globally + * and directly to this Interactable + * + * @param {InteractEvent} iEvent The InteractEvent object to be fired on this + * Interactable + * @return {Interactable} this Interactable + */ + + }, { + key: "fire", + value: function fire(iEvent) { + this.events.fire(iEvent); + return this; + } + }, { + key: "_onOff", + value: function _onOff(method, typeArg, listenerArg, options) { + if (__is_16.object(typeArg) && !__is_16.array(typeArg)) { + options = listenerArg; + listenerArg = null; + } + + var addRemove = method === 'on' ? 'add' : 'remove'; + var listeners = (0, ___normalizeListeners_16["default"])(typeArg, listenerArg); + + for (var type in listeners) { + if (type === 'wheel') { + type = ___browser_16["default"].wheelEvent; + } - status.realX = page.x; - status.realY = page.y; + for (var _i2 = 0; _i2 < listeners[type].length; _i2++) { + var _ref2; - page.x = page.x - this.inertiaStatus.resumeDx; - page.y = page.y - this.inertiaStatus.resumeDy; + _ref2 = listeners[type][_i2]; + var listener = _ref2; - var len = snap.targets? snap.targets.length : 0; + // if it is an action event type + if (__arr_16.contains(this._actions.eventTypes, type)) { + this.events[method](type, listener); + } // delegated event + else if (__is_16.string(this.target)) { + ___events_16["default"]["".concat(addRemove, "Delegate")](this.target, this._context, type, listener, options); + } // remove listener from this Interatable's element + else { + ___events_16["default"][addRemove](this.target, type, listener, options); + } + } + } - for (var relIndex = 0; relIndex < this.snapOffsets.length; relIndex++) { - var relative = { - x: page.x - this.snapOffsets[relIndex].x, - y: page.y - this.snapOffsets[relIndex].y - }; + return this; + } + /** + * Binds a listener for an InteractEvent, pointerEvent or DOM event. + * + * @param {string | array | object} types The types of events to listen + * for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * addEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "on", + value: function on(types, listener, options) { + return this._onOff('on', types, listener, options); + } + /** + * Removes an InteractEvent, pointerEvent or DOM event listener. + * + * @param {string | array | object} types The types of events that were + * listened for + * @param {function | array | object} [listener] The event listener function(s) + * @param {object | boolean} [options] options object or useCapture flag for + * removeEventListener + * @return {Interactable} This Interactable + */ + + }, { + key: "off", + value: function off(types, listener, options) { + return this._onOff('off', types, listener, options); + } + /** + * Reset the options of this Interactable + * + * @param {object} options The new settings to apply + * @return {object} This Interactable + */ + + }, { + key: "set", + value: function set(options) { + var defaults = this._defaults; + + if (!__is_16.object(options)) { + options = {}; + } + + this.options = (0, ___clone_16["default"])(defaults.base); + + for (var actionName in this._actions.methodDict) { + var methodName = this._actions.methodDict[actionName]; + this.options[actionName] = {}; + this.setPerAction(actionName, (0, ___extend_16["default"])((0, ___extend_16["default"])({}, defaults.perAction), defaults.actions[actionName])); + this[methodName](options[actionName]); + } + + for (var setting in options) { + if (__is_16.func(this[setting])) { + this[setting](options[setting]); + } + } - for (i = 0; i < len; i++) { - if (isFunction(snap.targets[i])) { - target = snap.targets[i](relative.x, relative.y, this); - } - else { - target = snap.targets[i]; - } + return this; + } + /** + * Remove this interactable from the list of interactables and remove it's + * action capabilities and event listeners + * + * @return {interact} + */ - if (!target) { continue; } + }, { + key: "unset", + value: function unset() { + ___events_16["default"].remove(this.target, 'all'); - targets.push({ - x: isNumber(target.x) ? (target.x + this.snapOffsets[relIndex].x) : relative.x, - y: isNumber(target.y) ? (target.y + this.snapOffsets[relIndex].y) : relative.y, + if (__is_16.string(this.target)) { + // remove delegated events + for (var type in ___events_16["default"].delegatedEvents) { + var delegated = ___events_16["default"].delegatedEvents[type]; - range: isNumber(target.range)? target.range: snap.range - }); - } - } + if (delegated.selectors[0] === this.target && delegated.contexts[0] === this._context) { + delegated.selectors.splice(0, 1); + delegated.contexts.splice(0, 1); + delegated.listeners.splice(0, 1); // remove the arrays if they are empty - var closest = { - target: null, - inRange: false, - distance: 0, - range: 0, - dx: 0, - dy: 0 - }; - - for (i = 0, len = targets.length; i < len; i++) { - target = targets[i]; - - var range = target.range, - dx = target.x - page.x, - dy = target.y - page.y, - distance = hypot(dx, dy), - inRange = distance <= range; - - // Infinite targets count as being out of range - // compared to non infinite ones that are in range - if (range === Infinity && closest.inRange && closest.range !== Infinity) { - inRange = false; - } - - if (!closest.target || (inRange - // is the closest target in range? - ? (closest.inRange && range !== Infinity - // the pointer is relatively deeper in this target - ? distance / range < closest.distance / closest.range - // this target has Infinite range and the closest doesn't - : (range === Infinity && closest.range !== Infinity) - // OR this target is closer that the previous closest - || distance < closest.distance) - // The other is not in range and the pointer is closer to this target - : (!closest.inRange && distance < closest.distance))) { - - if (range === Infinity) { - inRange = true; - } - - closest.target = target; - closest.distance = distance; - closest.range = range; - closest.inRange = inRange; - closest.dx = dx; - closest.dy = dy; - - status.range = range; - } + if (!delegated.selectors.length) { + delegated[type] = null; } + } - var snapChanged; + ___events_16["default"].remove(this._context, type, ___events_16["default"].delegateListener); - if (closest.target) { - snapChanged = (status.snappedX !== closest.target.x || status.snappedY !== closest.target.y); + ___events_16["default"].remove(this._context, type, ___events_16["default"].delegateUseCapture, true); + } + } else { + ___events_16["default"].remove(this.target, 'all'); + } + } + }, { + key: "_defaults", + get: function get() { + return { + base: {}, + perAction: {}, + actions: {} + }; + } + }]); - status.snappedX = closest.target.x; - status.snappedY = closest.target.y; - } - else { - snapChanged = true; + return Interactable; +}(); - status.snappedX = NaN; - status.snappedY = NaN; - } +_$Interactable_16.Interactable = Interactable; +var ___default_16 = Interactable; +_$Interactable_16["default"] = ___default_16; - status.dx = closest.dx; - status.dy = closest.dy; +var _$InteractableSet_17 = {}; +"use strict"; - status.changed = (snapChanged || (closest.inRange && !status.locked)); - status.locked = closest.inRange; +Object.defineProperty(_$InteractableSet_17, "__esModule", { + value: true +}); +_$InteractableSet_17["default"] = void 0; - return status; - }, +var __arr_17 = ___interopRequireWildcard_17(_$arr_47); - setRestriction: function (pageCoords, status) { - var target = this.target, - restrict = target && target.options[this.prepared.name].restrict, - restriction = restrict && restrict.restriction, - page; +var __domUtils_17 = ___interopRequireWildcard_17(_$domUtils_51); - if (!restriction) { - return status; - } +var ___extend_17 = ___interopRequireDefault_17(_$extend_53); - status = status || this.restrictStatus; +var __is_17 = ___interopRequireWildcard_17(_$is_57); - page = status.useStatusXY - ? page = { x: status.x, y: status.y } - : page = extend({}, pageCoords); +var ___Signals_17 = ___interopRequireDefault_17(_$Signals_46); - if (status.snap && status.snap.locked) { - page.x += status.snap.dx || 0; - page.y += status.snap.dy || 0; - } +function ___interopRequireDefault_17(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - page.x -= this.inertiaStatus.resumeDx; - page.y -= this.inertiaStatus.resumeDy; +function ___interopRequireWildcard_17(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - status.dx = 0; - status.dy = 0; - status.restricted = false; +function ___classCallCheck_17(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var rect, restrictedX, restrictedY; +function ___defineProperties_17(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - if (isString(restriction)) { - if (restriction === 'parent') { - restriction = parentElement(this.element); - } - else if (restriction === 'self') { - restriction = target.getRect(this.element); - } - else { - restriction = closest(this.element, restriction); - } +function ___createClass_17(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_17(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_17(Constructor, staticProps); return Constructor; } - if (!restriction) { return status; } - } +var InteractableSet = +/*#__PURE__*/ +function () { + function InteractableSet(scope) { + var _this = this; - if (isFunction(restriction)) { - restriction = restriction(page.x, page.y, this.element); - } + ___classCallCheck_17(this, InteractableSet); - if (isElement(restriction)) { - restriction = getElementRect(restriction); - } + this.scope = scope; + this.signals = new ___Signals_17["default"](); // all set interactables - rect = restriction; + this.list = []; + this.selectorMap = {}; + this.signals.on('unset', function (_ref) { + var interactable = _ref.interactable; + var target = interactable.target, + context = interactable._context; + var targetMappings = __is_17.string(target) ? _this.selectorMap[target] : target[_this.scope.id]; + var targetIndex = targetMappings.findIndex(function (m) { + return m.context === context; + }); - if (!restriction) { - restrictedX = page.x; - restrictedY = page.y; - } - // object is assumed to have - // x, y, width, height or - // left, top, right, bottom - else if ('x' in restriction && 'y' in restriction) { - restrictedX = Math.max(Math.min(rect.x + rect.width - this.restrictOffset.right , page.x), rect.x + this.restrictOffset.left); - restrictedY = Math.max(Math.min(rect.y + rect.height - this.restrictOffset.bottom, page.y), rect.y + this.restrictOffset.top ); - } - else { - restrictedX = Math.max(Math.min(rect.right - this.restrictOffset.right , page.x), rect.left + this.restrictOffset.left); - restrictedY = Math.max(Math.min(rect.bottom - this.restrictOffset.bottom, page.y), rect.top + this.restrictOffset.top ); - } + if (targetMappings[targetIndex]) { + // Destroying mappingInfo's context and interactable + targetMappings[targetIndex].context = null; + targetMappings[targetIndex].interactable = null; + } - status.dx = restrictedX - page.x; - status.dy = restrictedY - page.y; + targetMappings.splice(targetIndex, 1); + }); + } - status.changed = status.restrictedX !== restrictedX || status.restrictedY !== restrictedY; - status.restricted = !!(status.dx || status.dy); + ___createClass_17(InteractableSet, [{ + key: "new", + value: function _new(target, options) { + options = (0, ___extend_17["default"])(options || {}, { + actions: this.scope.actions + }); + var interactable = new this.scope.Interactable(target, options, this.scope.document); + var mappingInfo = { + context: interactable._context, + interactable: interactable + }; + this.scope.addDocument(interactable._doc); + this.list.push(interactable); - status.restrictedX = restrictedX; - status.restrictedY = restrictedY; + if (__is_17.string(target)) { + if (!this.selectorMap[target]) { + this.selectorMap[target] = []; + } - return status; - }, + this.selectorMap[target].push(mappingInfo); + } else { + if (!interactable.target[this.scope.id]) { + Object.defineProperty(target, this.scope.id, { + value: [], + configurable: true + }); + } - checkAndPreventDefault: function (event, interactable, element) { - if (!(interactable = interactable || this.target)) { return; } + target[this.scope.id].push(mappingInfo); + } - var options = interactable.options, - prevent = options.preventDefault; + this.signals.fire('new', { + target: target, + options: options, + interactable: interactable, + win: this.scope._win + }); + return interactable; + } + }, { + key: "get", + value: function get(target, options) { + var context = options && options.context || this.scope.document; + var isSelector = __is_17.string(target); + var targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id]; + + if (!targetMappings) { + return null; + } - if (prevent === 'auto' && element && !/^(input|select|textarea)$/i.test(event.target.nodeName)) { - // do not preventDefault on pointerdown if the prepared action is a drag - // and dragging can only start from a certain direction - this allows - // a touch to pan the viewport if a drag isn't in the right direction - if (/down|start/i.test(event.type) - && this.prepared.name === 'drag' && options.drag.axis !== 'xy') { + var found = __arr_17.find(targetMappings, function (m) { + return m.context === context && (isSelector || m.interactable.inContext(target)); + }); + return found && found.interactable; + } + }, { + key: "forEachMatch", + value: function forEachMatch(node, callback) { + for (var _i = 0; _i < this.list.length; _i++) { + var _ref2; + + _ref2 = this.list[_i]; + var interactable = _ref2; + var ret = void 0; + + if ((__is_17.string(interactable.target) // target is a selector and the element matches + ? __is_17.element(node) && __domUtils_17.matchesSelector(node, interactable.target) : // target is the element + node === interactable.target) && // the element is in context + interactable.inContext(node)) { + ret = callback(interactable); + } - return; - } + if (ret !== undefined) { + return ret; + } + } + } + }]); - // with manualStart, only preventDefault while interacting - if (options[this.prepared.name] && options[this.prepared.name].manualStart - && !this.interacting()) { - return; - } + return InteractableSet; +}(); - event.preventDefault(); - return; - } +_$InteractableSet_17["default"] = InteractableSet; - if (prevent === 'always') { - event.preventDefault(); - return; - } - }, +var _$BaseEvent_13 = {}; +"use strict"; - calcInertia: function (status) { - var inertiaOptions = this.target.options[this.prepared.name].inertia, - lambda = inertiaOptions.resistance, - inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda; +Object.defineProperty(_$BaseEvent_13, "__esModule", { + value: true +}); +_$BaseEvent_13["default"] = _$BaseEvent_13.BaseEvent = _$BaseEvent_13.EventPhase = void 0; - status.x0 = this.prevEvent.pageX; - status.y0 = this.prevEvent.pageY; - status.t0 = status.startEvent.timeStamp / 1000; - status.sx = status.sy = 0; +function ___classCallCheck_13(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda; - status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda; - status.te = inertiaDur; +function ___defineProperties_13(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - status.lambda_v0 = lambda / status.v0; - status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0; - }, +function ___createClass_13(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_13(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_13(Constructor, staticProps); return Constructor; } - autoScrollMove: function (pointer) { - if (!(this.interacting() - && checkAutoScroll(this.target, this.prepared.name))) { - return; - } +var EventPhase; +_$BaseEvent_13.EventPhase = EventPhase; - if (this.inertiaStatus.active) { - autoScroll.x = autoScroll.y = 0; - return; - } +(function (EventPhase) { + EventPhase["Start"] = "start"; + EventPhase["Move"] = "move"; + EventPhase["End"] = "end"; + EventPhase["_NONE"] = ""; +})(EventPhase || (_$BaseEvent_13.EventPhase = EventPhase = {})); - var top, - right, - bottom, - left, - options = this.target.options[this.prepared.name].autoScroll, - container = options.container || getWindow(this.element); - - if (isWindow(container)) { - left = pointer.clientX < autoScroll.margin; - top = pointer.clientY < autoScroll.margin; - right = pointer.clientX > container.innerWidth - autoScroll.margin; - bottom = pointer.clientY > container.innerHeight - autoScroll.margin; - } - else { - var rect = getElementClientRect(container); +var BaseEvent = +/*#__PURE__*/ +function () { + function BaseEvent(interaction) { + ___classCallCheck_13(this, BaseEvent); - left = pointer.clientX < rect.left + autoScroll.margin; - top = pointer.clientY < rect.top + autoScroll.margin; - right = pointer.clientX > rect.right - autoScroll.margin; - bottom = pointer.clientY > rect.bottom - autoScroll.margin; - } + this.immediatePropagationStopped = false; + this.propagationStopped = false; + this._interaction = interaction; + } - autoScroll.x = (right ? 1: left? -1: 0); - autoScroll.y = (bottom? 1: top? -1: 0); + ___createClass_13(BaseEvent, [{ + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call any other listeners (even on the current target) + */ - if (!autoScroll.isScrolling) { - // set the autoScroll properties to those of the target - autoScroll.margin = options.margin; - autoScroll.speed = options.speed; + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }, { + key: "interaction", + get: function get() { + return this._interaction._proxy; + } + }]); - autoScroll.start(this); - } - }, + return BaseEvent; +}(); - _updateEventTargets: function (target, currentTarget) { - this._eventTarget = target; - this._curEventTarget = currentTarget; - } +_$BaseEvent_13.BaseEvent = BaseEvent; +var ___default_13 = BaseEvent; +_$BaseEvent_13["default"] = ___default_13; - }; +var _$InteractEvent_15 = {}; +"use strict"; - function getInteractionFromPointer (pointer, eventType, eventTarget) { - var i = 0, len = interactions.length, - mouseEvent = (/mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4), - interaction; - - var id = getPointerId(pointer); - - // try to resume inertia with a new pointer - if (/down|start/i.test(eventType)) { - for (i = 0; i < len; i++) { - interaction = interactions[i]; - - var element = eventTarget; - - if (interaction.inertiaStatus.active && interaction.target.options[interaction.prepared.name].inertia.allowResume - && (interaction.mouse === mouseEvent)) { - while (element) { - // if the element is the interaction element - if (element === interaction.element) { - return interaction; - } - element = parentElement(element); - } - } - } - } +Object.defineProperty(_$InteractEvent_15, "__esModule", { + value: true +}); +_$InteractEvent_15["default"] = _$InteractEvent_15.InteractEvent = _$InteractEvent_15.EventPhase = void 0; - // if it's a mouse interaction - if (mouseEvent || !(supportsTouch || supportsPointerEvent)) { +var ___extend_15 = ___interopRequireDefault_15(_$extend_53); - // find a mouse interaction that's not in inertia phase - for (i = 0; i < len; i++) { - if (interactions[i].mouse && !interactions[i].inertiaStatus.active) { - return interactions[i]; - } - } +var ___getOriginXY_15 = ___interopRequireDefault_15(_$getOriginXY_54); - // find any interaction specifically for mouse. - // if the eventType is a mousedown, and inertia is active - // ignore the interaction - for (i = 0; i < len; i++) { - if (interactions[i].mouse && !(/down/.test(eventType) && interactions[i].inertiaStatus.active)) { - return interaction; - } - } +var ___hypot_15 = ___interopRequireDefault_15(_$hypot_55); - // create a new interaction for mouse - interaction = new Interaction(); - interaction.mouse = true; +var _BaseEvent2 = ___interopRequireDefault_15(_$BaseEvent_13); - return interaction; - } +var _defaultOptions = ___interopRequireDefault_15(_$defaultOptions_20); - // get interaction that has this pointer - for (i = 0; i < len; i++) { - if (contains(interactions[i].pointerIds, id)) { - return interactions[i]; - } - } +function ___interopRequireDefault_15(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - // at this stage, a pointerUp should not return an interaction - if (/up|end|out/i.test(eventType)) { - return null; - } +function ___typeof_15(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_15 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_15 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_15(obj); } - // get first idle interaction - for (i = 0; i < len; i++) { - interaction = interactions[i]; +function ___classCallCheck_15(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if ((!interaction.prepared.name || (interaction.target.options.gesture.enabled)) - && !interaction.interacting() - && !(!mouseEvent && interaction.mouse)) { +function ___defineProperties_15(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - return interaction; - } - } +function ___createClass_15(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_15(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_15(Constructor, staticProps); return Constructor; } - return new Interaction(); - } +function _possibleConstructorReturn(self, call) { if (call && (___typeof_15(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - function doOnInteractions (method) { - return (function (event) { - var interaction, - eventTarget = getActualElement(event.path - ? event.path[0] - : event.target), - curEventTarget = getActualElement(event.currentTarget), - i; +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - if (supportsTouch && /touch/.test(event.type)) { - prevTouchTime = new Date().getTime(); +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - for (i = 0; i < event.changedTouches.length; i++) { - var pointer = event.changedTouches[i]; +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - interaction = getInteractionFromPointer(pointer, event.type, eventTarget); +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - if (!interaction) { continue; } +var __EventPhase_15; +_$InteractEvent_15.EventPhase = __EventPhase_15; - interaction._updateEventTargets(eventTarget, curEventTarget); +(function (EventPhase) { + EventPhase["Start"] = "start"; + EventPhase["Move"] = "move"; + EventPhase["End"] = "end"; + EventPhase["_NONE"] = ""; +})(__EventPhase_15 || (_$InteractEvent_15.EventPhase = __EventPhase_15 = {})); - interaction[method](pointer, event, eventTarget, curEventTarget); - } - } - else { - if (!supportsPointerEvent && /mouse/.test(event.type)) { - // ignore mouse events while touch interactions are active - for (i = 0; i < interactions.length; i++) { - if (!interactions[i].mouse && interactions[i].pointerIsDown) { - return; - } - } +var InteractEvent = +/*#__PURE__*/ +function (_BaseEvent) { + _inherits(InteractEvent, _BaseEvent); - // try to ignore mouse events that are simulated by the browser - // after a touch event - if (new Date().getTime() - prevTouchTime < 500) { - return; - } - } + /** */ + function InteractEvent(interaction, event, actionName, phase, element, related, preEnd, type) { + var _this; - interaction = getInteractionFromPointer(event, event.type, eventTarget); + ___classCallCheck_15(this, InteractEvent); - if (!interaction) { return; } + _this = _possibleConstructorReturn(this, _getPrototypeOf(InteractEvent).call(this, interaction)); + element = element || interaction.element; + var target = interaction.interactable; + var deltaSource = (target && target.options || _defaultOptions["default"]).deltaSource; + var origin = (0, ___getOriginXY_15["default"])(target, element, actionName); + var starting = phase === 'start'; + var ending = phase === 'end'; + var prevEvent = starting ? _assertThisInitialized(_this) : interaction.prevEvent; + var coords = starting ? interaction.coords.start : ending ? { + page: prevEvent.page, + client: prevEvent.client, + timeStamp: interaction.coords.cur.timeStamp + } : interaction.coords.cur; + _this.page = (0, ___extend_15["default"])({}, coords.page); + _this.client = (0, ___extend_15["default"])({}, coords.client); + _this.rect = (0, ___extend_15["default"])({}, interaction.rect); + _this.timeStamp = coords.timeStamp; - interaction._updateEventTargets(eventTarget, curEventTarget); + if (!ending) { + _this.page.x -= origin.x; + _this.page.y -= origin.y; + _this.client.x -= origin.x; + _this.client.y -= origin.y; + } - interaction[method](event, event, eventTarget, curEventTarget); - } - }); + _this.ctrlKey = event.ctrlKey; + _this.altKey = event.altKey; + _this.shiftKey = event.shiftKey; + _this.metaKey = event.metaKey; + _this.button = event.button; + _this.buttons = event.buttons; + _this.target = element; + _this.currentTarget = element; + _this.relatedTarget = related || null; + _this.preEnd = preEnd; + _this.type = type || actionName + (phase || ''); + _this.interactable = target; + _this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0; + _this.x0 = interaction.coords.start.page.x - origin.x; + _this.y0 = interaction.coords.start.page.y - origin.y; + _this.clientX0 = interaction.coords.start.client.x - origin.x; + _this.clientY0 = interaction.coords.start.client.y - origin.y; + + if (starting || ending) { + _this.delta = { + x: 0, + y: 0 + }; + } else { + _this.delta = { + x: _this[deltaSource].x - prevEvent[deltaSource].x, + y: _this[deltaSource].y - prevEvent[deltaSource].y + }; } - function InteractEvent (interaction, event, action, phase, element, related) { - var client, - page, - target = interaction.target, - snapStatus = interaction.snapStatus, - restrictStatus = interaction.restrictStatus, - pointers = interaction.pointers, - deltaSource = (target && target.options || defaultOptions).deltaSource, - sourceX = deltaSource + 'X', - sourceY = deltaSource + 'Y', - options = target? target.options: defaultOptions, - origin = getOriginXY(target, element), - starting = phase === 'start', - ending = phase === 'end', - coords = starting? interaction.startCoords : interaction.curCoords; - - element = element || interaction.element; - - page = extend({}, coords.page); - client = extend({}, coords.client); - - page.x -= origin.x; - page.y -= origin.y; - - client.x -= origin.x; - client.y -= origin.y; - - var relativePoints = options[action].snap && options[action].snap.relativePoints ; - - if (checkSnap(target, action) && !(starting && relativePoints && relativePoints.length)) { - this.snap = { - range : snapStatus.range, - locked : snapStatus.locked, - x : snapStatus.snappedX, - y : snapStatus.snappedY, - realX : snapStatus.realX, - realY : snapStatus.realY, - dx : snapStatus.dx, - dy : snapStatus.dy - }; - - if (snapStatus.locked) { - page.x += snapStatus.dx; - page.y += snapStatus.dy; - client.x += snapStatus.dx; - client.y += snapStatus.dy; - } - } + _this.dt = interaction.coords.delta.timeStamp; + _this.duration = _this.timeStamp - _this.t0; // velocity and speed in pixels per second - if (checkRestrict(target, action) && !(starting && options[action].restrict.elementRect) && restrictStatus.restricted) { - page.x += restrictStatus.dx; - page.y += restrictStatus.dy; - client.x += restrictStatus.dx; - client.y += restrictStatus.dy; + _this.velocity = (0, ___extend_15["default"])({}, interaction.coords.velocity[deltaSource]); + _this.speed = (0, ___hypot_15["default"])(_this.velocity.x, _this.velocity.y); + _this.swipe = ending || phase === 'inertiastart' ? _this.getSwipe() : null; + return _this; + } - this.restrict = { - dx: restrictStatus.dx, - dy: restrictStatus.dy - }; - } + ___createClass_15(InteractEvent, [{ + key: "getSwipe", + value: function getSwipe() { + var interaction = this._interaction; - this.pageX = page.x; - this.pageY = page.y; - this.clientX = client.x; - this.clientY = client.y; - - this.x0 = interaction.startCoords.page.x - origin.x; - this.y0 = interaction.startCoords.page.y - origin.y; - this.clientX0 = interaction.startCoords.client.x - origin.x; - this.clientY0 = interaction.startCoords.client.y - origin.y; - this.ctrlKey = event.ctrlKey; - this.altKey = event.altKey; - this.shiftKey = event.shiftKey; - this.metaKey = event.metaKey; - this.button = event.button; - this.buttons = event.buttons; - this.target = element; - this.t0 = interaction.downTimes[0]; - this.type = action + (phase || ''); - - this.interaction = interaction; - this.interactable = target; - - var inertiaStatus = interaction.inertiaStatus; - - if (inertiaStatus.active) { - this.detail = 'inertia'; + if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) { + return null; + } + + var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI; + var overlap = 22.5; + + if (angle < 0) { + angle += 360; + } + + var left = 135 - overlap <= angle && angle < 225 + overlap; + var up = 225 - overlap <= angle && angle < 315 + overlap; + var right = !left && (315 - overlap <= angle || angle < 45 + overlap); + var down = !up && 45 - overlap <= angle && angle < 135 + overlap; + return { + up: up, + down: down, + left: left, + right: right, + angle: angle, + speed: interaction.prevEvent.speed, + velocity: { + x: interaction.prevEvent.velocityX, + y: interaction.prevEvent.velocityY } + }; + } + }, { + key: "preventDefault", + value: function preventDefault() {} + /** + * Don't call listeners on the remaining targets + */ + + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + /** + * Don't call any other listeners (even on the current target) + */ + + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "pageX", + get: function get() { + return this.page.x; + }, + set: function set(value) { + this.page.x = value; + } + }, { + key: "pageY", + get: function get() { + return this.page.y; + }, + set: function set(value) { + this.page.y = value; + } + }, { + key: "clientX", + get: function get() { + return this.client.x; + }, + set: function set(value) { + this.client.x = value; + } + }, { + key: "clientY", + get: function get() { + return this.client.y; + }, + set: function set(value) { + this.client.y = value; + } + }, { + key: "dx", + get: function get() { + return this.delta.x; + }, + set: function set(value) { + this.delta.x = value; + } + }, { + key: "dy", + get: function get() { + return this.delta.y; + }, + set: function set(value) { + this.delta.y = value; + } + }, { + key: "velocityX", + get: function get() { + return this.velocity.x; + }, + set: function set(value) { + this.velocity.x = value; + } + }, { + key: "velocityY", + get: function get() { + return this.velocity.y; + }, + set: function set(value) { + this.velocity.y = value; + } + }]); - if (related) { - this.relatedTarget = related; - } + return InteractEvent; +}(_BaseEvent2["default"]); - // end event dx, dy is difference between start and end points - if (ending) { - if (deltaSource === 'client') { - this.dx = client.x - interaction.startCoords.client.x; - this.dy = client.y - interaction.startCoords.client.y; - } - else { - this.dx = page.x - interaction.startCoords.page.x; - this.dy = page.y - interaction.startCoords.page.y; - } - } - else if (starting) { - this.dx = 0; - this.dy = 0; - } - // copy properties from previousmove if starting inertia - else if (phase === 'inertiastart') { - this.dx = interaction.prevEvent.dx; - this.dy = interaction.prevEvent.dy; - } - else { - if (deltaSource === 'client') { - this.dx = client.x - interaction.prevEvent.clientX; - this.dy = client.y - interaction.prevEvent.clientY; - } - else { - this.dx = page.x - interaction.prevEvent.pageX; - this.dy = page.y - interaction.prevEvent.pageY; - } - } - if (interaction.prevEvent && interaction.prevEvent.detail === 'inertia' - && !inertiaStatus.active - && options[action].inertia && options[action].inertia.zeroResumeDelta) { +_$InteractEvent_15.InteractEvent = InteractEvent; +var ___default_15 = InteractEvent; +_$InteractEvent_15["default"] = ___default_15; - inertiaStatus.resumeDx += this.dx; - inertiaStatus.resumeDy += this.dy; +var _$PointerInfo_19 = {}; +"use strict"; - this.dx = this.dy = 0; - } +Object.defineProperty(_$PointerInfo_19, "__esModule", { + value: true +}); +_$PointerInfo_19["default"] = _$PointerInfo_19.PointerInfo = void 0; - if (action === 'resize' && interaction.resizeAxes) { - if (options.resize.square) { - if (interaction.resizeAxes === 'y') { - this.dx = this.dy; - } - else { - this.dy = this.dx; - } - this.axes = 'xy'; - } - else { - this.axes = interaction.resizeAxes; - - if (interaction.resizeAxes === 'x') { - this.dy = 0; - } - else if (interaction.resizeAxes === 'y') { - this.dx = 0; - } - } - } - else if (action === 'gesture') { - this.touches = [pointers[0], pointers[1]]; - - if (starting) { - this.distance = touchDistance(pointers, deltaSource); - this.box = touchBBox(pointers); - this.scale = 1; - this.ds = 0; - this.angle = touchAngle(pointers, undefined, deltaSource); - this.da = 0; - } - else if (ending || event instanceof InteractEvent) { - this.distance = interaction.prevEvent.distance; - this.box = interaction.prevEvent.box; - this.scale = interaction.prevEvent.scale; - this.ds = this.scale - 1; - this.angle = interaction.prevEvent.angle; - this.da = this.angle - interaction.gesture.startAngle; - } - else { - this.distance = touchDistance(pointers, deltaSource); - this.box = touchBBox(pointers); - this.scale = this.distance / interaction.gesture.startDistance; - this.angle = touchAngle(pointers, interaction.gesture.prevAngle, deltaSource); +function ___classCallCheck_19(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - this.ds = this.scale - interaction.gesture.prevScale; - this.da = this.angle - interaction.gesture.prevAngle; - } - } +/* eslint-disable @typescript-eslint/no-parameter-properties */ +var PointerInfo = function PointerInfo(id, pointer, event, downTime, downTarget) { + ___classCallCheck_19(this, PointerInfo); - if (starting) { - this.timeStamp = interaction.downTimes[0]; - this.dt = 0; - this.duration = 0; - this.speed = 0; - this.velocityX = 0; - this.velocityY = 0; - } - else if (phase === 'inertiastart') { - this.timeStamp = interaction.prevEvent.timeStamp; - this.dt = interaction.prevEvent.dt; - this.duration = interaction.prevEvent.duration; - this.speed = interaction.prevEvent.speed; - this.velocityX = interaction.prevEvent.velocityX; - this.velocityY = interaction.prevEvent.velocityY; - } - else { - this.timeStamp = new Date().getTime(); - this.dt = this.timeStamp - interaction.prevEvent.timeStamp; - this.duration = this.timeStamp - interaction.downTimes[0]; - - if (event instanceof InteractEvent) { - var dx = this[sourceX] - interaction.prevEvent[sourceX], - dy = this[sourceY] - interaction.prevEvent[sourceY], - dt = this.dt / 1000; - - this.speed = hypot(dx, dy) / dt; - this.velocityX = dx / dt; - this.velocityY = dy / dt; - } - // if normal move or end event, use previous user event coords - else { - // speed and velocity in pixels per second - this.speed = interaction.pointerDelta[deltaSource].speed; - this.velocityX = interaction.pointerDelta[deltaSource].vx; - this.velocityY = interaction.pointerDelta[deltaSource].vy; - } - } + this.id = id; + this.pointer = pointer; + this.event = event; + this.downTime = downTime; + this.downTarget = downTarget; +}; - if ((ending || phase === 'inertiastart') - && interaction.prevEvent.speed > 600 && this.timeStamp - interaction.prevEvent.timeStamp < 150) { +_$PointerInfo_19.PointerInfo = PointerInfo; +var ___default_19 = PointerInfo; +_$PointerInfo_19["default"] = ___default_19; - var angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI, - overlap = 22.5; +var _$interactionFinder_22 = {}; +"use strict"; - if (angle < 0) { - angle += 360; - } +Object.defineProperty(_$interactionFinder_22, "__esModule", { + value: true +}); +_$interactionFinder_22["default"] = void 0; - var left = 135 - overlap <= angle && angle < 225 + overlap, - up = 225 - overlap <= angle && angle < 315 + overlap, - - right = !left && (315 - overlap <= angle || angle < 45 + overlap), - down = !up && 45 - overlap <= angle && angle < 135 + overlap; - - this.swipe = { - up : up, - down : down, - left : left, - right: right, - angle: angle, - speed: interaction.prevEvent.speed, - velocity: { - x: interaction.prevEvent.velocityX, - y: interaction.prevEvent.velocityY - } - }; - } - } +var __dom_22 = ___interopRequireWildcard_22(_$domUtils_51); - InteractEvent.prototype = { - preventDefault: blank, - stopImmediatePropagation: function () { - this.immediatePropagationStopped = this.propagationStopped = true; - }, - stopPropagation: function () { - this.propagationStopped = true; - } - }; +function ___interopRequireWildcard_22(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +var finder = { + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], + search: function search(details) { + for (var _i = 0; _i < finder.methodOrder.length; _i++) { + var _ref; - function preventOriginalDefault () { - this.originalEvent.preventDefault(); + _ref = finder.methodOrder[_i]; + var method = _ref; + var interaction = finder[method](details); + + if (interaction) { + return interaction; + } + } + }, + // try to resume simulation with a new pointer + simulationResume: function simulationResume(_ref2) { + var pointerType = _ref2.pointerType, + eventType = _ref2.eventType, + eventTarget = _ref2.eventTarget, + scope = _ref2.scope; + + if (!/down|start/i.test(eventType)) { + return null; } - function getActionCursor (action) { - var cursor = ''; + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref3; - if (action.name === 'drag') { - cursor = actionCursors.drag; - } - if (action.name === 'resize') { - if (action.axis) { - cursor = actionCursors[action.name + action.axis]; - } - else if (action.edges) { - var cursorKey = 'resize', - edgeNames = ['top', 'bottom', 'left', 'right']; + _ref3 = scope.interactions.list[_i2]; + var interaction = _ref3; + var element = eventTarget; - for (var i = 0; i < 4; i++) { - if (action.edges[edgeNames[i]]) { - cursorKey += edgeNames[i]; - } - } + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { + while (element) { + // if the element is the interaction element + if (element === interaction.element) { + return interaction; + } - cursor = actionCursors[cursorKey]; - } + element = __dom_22.parentNode(element); } + } + } - return cursor; + return null; + }, + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { + var pointerId = _ref4.pointerId, + pointerType = _ref4.pointerType, + eventType = _ref4.eventType, + scope = _ref4.scope; + + if (pointerType !== 'mouse' && pointerType !== 'pen') { + return null; } - function checkResizeEdge (name, value, page, element, interactableElement, rect, margin) { - // false, '', undefined, null - if (!value) { return false; } + var firstNonActive; - // true value, use pointer coords and element rect - if (value === true) { - // if dimensions are negative, "switch" edges - var width = isNumber(rect.width)? rect.width : rect.right - rect.left, - height = isNumber(rect.height)? rect.height : rect.bottom - rect.top; + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref5; - if (width < 0) { - if (name === 'left' ) { name = 'right'; } - else if (name === 'right') { name = 'left' ; } - } - if (height < 0) { - if (name === 'top' ) { name = 'bottom'; } - else if (name === 'bottom') { name = 'top' ; } - } + _ref5 = scope.interactions.list[_i3]; + var interaction = _ref5; - if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); } - if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); } + if (interaction.pointerType === pointerType) { + // if it's a down event, skip interactions with running simulations + if (interaction.simulation && !hasPointerId(interaction, pointerId)) { + continue; + } // if the interaction is active, return it immediately - if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); } - if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); } - } - // the remaining checks require an element - if (!isElement(element)) { return false; } - - return isElement(value) - // the value is an element to use as a resize handle - ? value === element - // otherwise check if element matches value as selector - : matchesUpTo(element, value, interactableElement); - } - - function defaultActionChecker (pointer, interaction, element) { - var rect = this.getRect(element), - shouldResize = false, - action = null, - resizeAxes = null, - resizeEdges, - page = extend({}, interaction.curCoords.page), - options = this.options; - - if (!rect) { return null; } - - if (actionIsEnabled.resize && options.resize.enabled) { - var resizeOptions = options.resize; - - resizeEdges = { - left: false, right: false, top: false, bottom: false - }; - - // if using resize.edges - if (isObject(resizeOptions.edges)) { - for (var edge in resizeEdges) { - resizeEdges[edge] = checkResizeEdge(edge, - resizeOptions.edges[edge], - page, - interaction._eventTarget, - element, - rect, - resizeOptions.margin || margin); - } - - resizeEdges.left = resizeEdges.left && !resizeEdges.right; - resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; - - shouldResize = resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom; - } - else { - var right = options.resize.axis !== 'y' && page.x > (rect.right - margin), - bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - margin); + if (interaction.interacting()) { + return interaction; + } // otherwise save it and look for another active interaction + else if (!firstNonActive) { + firstNonActive = interaction; + } + } + } // if no active mouse interaction was found use the first inactive mouse + // interaction - shouldResize = right || bottom; - resizeAxes = (right? 'x' : '') + (bottom? 'y' : ''); - } - } - action = shouldResize - ? 'resize' - : actionIsEnabled.drag && options.drag.enabled - ? 'drag' - : null; + if (firstNonActive) { + return firstNonActive; + } // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation + // is active - if (actionIsEnabled.gesture - && interaction.pointerIds.length >=2 - && !(interaction.dragging || interaction.resizing)) { - action = 'gesture'; - } - if (action) { - return { - name: action, - axis: resizeAxes, - edges: resizeEdges - }; - } + for (var _i4 = 0; _i4 < scope.interactions.list.length; _i4++) { + var _ref6; - return null; + _ref6 = scope.interactions.list[_i4]; + var _interaction = _ref6; + + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { + return _interaction; + } } - // Check if action is enabled globally and the current target supports it - // If so, return the validated action. Otherwise, return null - function validateAction (action, interactable) { - if (!isObject(action)) { return null; } + return null; + }, + // get interaction that has this pointer + hasPointer: function hasPointer(_ref7) { + var pointerId = _ref7.pointerId, + scope = _ref7.scope; - var actionName = action.name, - options = interactable.options; + for (var _i5 = 0; _i5 < scope.interactions.list.length; _i5++) { + var _ref8; - if (( (actionName === 'resize' && options.resize.enabled ) - || (actionName === 'drag' && options.drag.enabled ) - || (actionName === 'gesture' && options.gesture.enabled)) - && actionIsEnabled[actionName]) { + _ref8 = scope.interactions.list[_i5]; + var interaction = _ref8; - if (actionName === 'resize' || actionName === 'resizeyx') { - actionName = 'resizexy'; - } + if (hasPointerId(interaction, pointerId)) { + return interaction; + } + } + + return null; + }, + // get first idle interaction with a matching pointerType + idle: function idle(_ref9) { + var pointerType = _ref9.pointerType, + scope = _ref9.scope; + + for (var _i6 = 0; _i6 < scope.interactions.list.length; _i6++) { + var _ref10; + + _ref10 = scope.interactions.list[_i6]; + var interaction = _ref10; + + // if there's already a pointer held down + if (interaction.pointers.length === 1) { + var target = interaction.interactable; // don't add this pointer if there is a target interactable and it + // isn't gesturable - return action; + if (target && !(target.options.gesture && target.options.gesture.enabled)) { + continue; } - return null; + } // maximum of 2 pointers per interaction + else if (interaction.pointers.length >= 2) { + continue; + } + + if (!interaction.interacting() && pointerType === interaction.pointerType) { + return interaction; + } } - var listeners = {}, - interactionListeners = [ - 'dragStart', 'dragMove', 'resizeStart', 'resizeMove', 'gestureStart', 'gestureMove', - 'pointerOver', 'pointerOut', 'pointerHover', 'selectorDown', - 'pointerDown', 'pointerMove', 'pointerUp', 'pointerCancel', 'pointerEnd', - 'addPointer', 'removePointer', 'recordPointer', 'autoScrollMove' - ]; + return null; + } +}; + +function hasPointerId(interaction, pointerId) { + return interaction.pointers.some(function (_ref11) { + var id = _ref11.id; + return id === pointerId; + }); +} + +var ___default_22 = finder; +_$interactionFinder_22["default"] = ___default_22; + +var _$drag_1 = {}; +"use strict"; + +Object.defineProperty(_$drag_1, "__esModule", { + value: true +}); +_$drag_1["default"] = void 0; + +var ___scope_1 = _$scope_24({}); + +var __arr_1 = ___interopRequireWildcard_1(_$arr_47); + +var __is_1 = ___interopRequireWildcard_1(_$is_57); + +function ___interopRequireWildcard_1(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +___scope_1.ActionName.Drag = 'drag'; + +function __install_1(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + interactions = scope.interactions, + defaults = scope.defaults; + interactions.signals.on('before-action-move', beforeMove); + interactions.signals.on('action-resume', beforeMove); // dragmove + + interactions.signals.on('action-move', move); + Interactable.prototype.draggable = drag.draggable; + actions[___scope_1.ActionName.Drag] = drag; + actions.names.push(___scope_1.ActionName.Drag); + __arr_1.merge(actions.eventTypes, ['dragstart', 'dragmove', 'draginertiastart', 'dragresume', 'dragend']); + actions.methodDict.drag = 'draggable'; + defaults.actions.drag = drag.defaults; +} + +function beforeMove(_ref) { + var interaction = _ref.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x') { + interaction.coords.cur.page.y = interaction.coords.start.page.y; + interaction.coords.cur.client.y = interaction.coords.start.client.y; + interaction.coords.velocity.client.y = 0; + interaction.coords.velocity.page.y = 0; + } else if (axis === 'y') { + interaction.coords.cur.page.x = interaction.coords.start.page.x; + interaction.coords.cur.client.x = interaction.coords.start.client.x; + interaction.coords.velocity.client.x = 0; + interaction.coords.velocity.page.x = 0; + } +} + +function move(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } + + var axis = interaction.prepared.axis; + + if (axis === 'x' || axis === 'y') { + var opposite = axis === 'x' ? 'y' : 'x'; + iEvent.page[opposite] = interaction.coords.start.page[opposite]; + iEvent.client[opposite] = interaction.coords.start.client[opposite]; + iEvent.delta[opposite] = 0; + } +} +/** + * ```js + * interact(element).draggable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // the axis in which the first movement must be + * // for the drag sequence to start + * // 'xy' by default - any direction + * startAxis: 'x' || 'y' || 'xy', + * + * // 'xy' by default - don't restrict to one axis (move in any direction) + * // 'x' or 'y' to restrict movement to either axis + * // 'start' to restrict movement to the axis the drag started in + * lockAxis: 'x' || 'y' || 'xy' || 'start', + * + * // max number of drags that can happen concurrently + * // with elements of this Interactable. Infinity by default + * max: Infinity, + * + * // max number of drags that can target the same element+Interactable + * // 1 by default + * maxPerElement: 2 + * }) + * + * var isDraggable = interact('element').draggable(); // true + * ``` + * + * Get or set whether drag actions can be performed on the target + * + * @alias Interactable.prototype.draggable + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on drag events (object makes the Interactable + * draggable) + * @return {boolean | Interactable} boolean indicating if this can be the + * target of drag events, or this Interctable + */ + - for (var i = 0, len = interactionListeners.length; i < len; i++) { - var name = interactionListeners[i]; +var draggable = function draggable(options) { + if (__is_1.object(options)) { + this.options.drag.enabled = options.enabled !== false; + this.setPerAction('drag', options); + this.setOnEvents('drag', options); - listeners[name] = doOnInteractions(name); + if (/^(xy|x|y|start)$/.test(options.lockAxis)) { + this.options.drag.lockAxis = options.lockAxis; } - // bound to the interactable context when a DOM event - // listener is added to a selector interactable - function delegateListener (event, useCapture) { - var fakeEvent = {}, - delegated = delegatedEvents[event.type], - eventTarget = getActualElement(event.path - ? event.path[0] - : event.target), - element = eventTarget; + if (/^(xy|x|y)$/.test(options.startAxis)) { + this.options.drag.startAxis = options.startAxis; + } - useCapture = useCapture? true: false; + return this; + } - // duplicate the event so that currentTarget can be changed - for (var prop in event) { - fakeEvent[prop] = event[prop]; - } + if (__is_1.bool(options)) { + this.options.drag.enabled = options; + return this; + } - fakeEvent.originalEvent = event; - fakeEvent.preventDefault = preventOriginalDefault; + return this.options.drag; +}; - // climb up document tree looking for selector matches - while (isElement(element)) { - for (var i = 0; i < delegated.selectors.length; i++) { - var selector = delegated.selectors[i], - context = delegated.contexts[i]; +var drag = { + id: 'actions/drag', + install: __install_1, + draggable: draggable, + beforeMove: beforeMove, + move: move, + defaults: { + startAxis: 'xy', + lockAxis: 'xy' + }, + checker: function checker(_pointer, _event, interactable) { + var dragOptions = interactable.options.drag; + return dragOptions.enabled ? { + name: 'drag', + axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis + } : null; + }, + getCursor: function getCursor() { + return 'move'; + } +}; +var ___default_1 = drag; +_$drag_1["default"] = ___default_1; - if (matchesSelector(element, selector) - && nodeContains(context, eventTarget) - && nodeContains(context, element)) { +var _$DropEvent_2 = {}; +"use strict"; - var listeners = delegated.listeners[i]; +Object.defineProperty(_$DropEvent_2, "__esModule", { + value: true +}); +_$DropEvent_2["default"] = void 0; - fakeEvent.currentTarget = element; +var ___BaseEvent2_2 = ___interopRequireDefault_2(_$BaseEvent_13); - for (var j = 0; j < listeners.length; j++) { - if (listeners[j][1] === useCapture) { - listeners[j][0](fakeEvent); - } - } - } - } +var __arr_2 = ___interopRequireWildcard_2(_$arr_47); - element = parentElement(element); - } - } +function ___interopRequireWildcard_2(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - function delegateUseCapture (event) { - return delegateListener.call(this, event, true); - } +function ___interopRequireDefault_2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - interactables.indexOfElement = function indexOfElement (element, context) { - context = context || document; +function ___typeof_2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_2 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_2(obj); } - for (var i = 0; i < this.length; i++) { - var interactable = this[i]; +function ___toConsumableArray_2(arr) { return ___arrayWithoutHoles_2(arr) || ___iterableToArray_2(arr) || ___nonIterableSpread_2(); } - if ((interactable.selector === element - && (interactable._context === context)) - || (!interactable.selector && interactable._element === element)) { +function ___nonIterableSpread_2() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - return i; - } - } - return -1; - }; +function ___iterableToArray_2(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - interactables.get = function interactableGet (element, options) { - return this[this.indexOfElement(element, options && options.context)]; - }; +function ___arrayWithoutHoles_2(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - interactables.forEachSelector = function (callback) { - for (var i = 0; i < this.length; i++) { - var interactable = this[i]; +function ___classCallCheck_2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (!interactable.selector) { - continue; - } +function ___defineProperties_2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - var ret = callback(interactable, interactable.selector, interactable._context, i, this); +function ___createClass_2(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_2(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_2(Constructor, staticProps); return Constructor; } - if (ret !== undefined) { - return ret; - } - } - }; +function ___possibleConstructorReturn_2(self, call) { if (call && (___typeof_2(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_2(self); } - /*\ - * interact - [ method ] - * - * The methods of this variable can be used to set elements as - * interactables and also to change various default settings. - * - * Calling it as a function and passing an element or a valid CSS selector - * string returns an Interactable object which has various methods to - * configure it. - * - - element (Element | string) The HTML or SVG Element to interact with or CSS selector - = (object) An @Interactable - * - > Usage - | interact(document.getElementById('draggable')).draggable(true); - | - | var rectables = interact('rect'); - | rectables - | .gesturable(true) - | .on('gesturemove', function (event) { - | // something cool... - | }) - | .autoScroll(true); - \*/ - function interact (element, options) { - return interactables.get(element, options) || new Interactable(element, options); - } - - /*\ - * Interactable - [ property ] - ** - * Object type returned by @interact - \*/ - function Interactable (element, options) { - this._element = element; - this._iEvents = this._iEvents || {}; +function ___assertThisInitialized_2(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - var _window; +function ___getPrototypeOf_2(o) { ___getPrototypeOf_2 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_2(o); } - if (trySelector(element)) { - this.selector = element; +function ___inherits_2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_2(subClass, superClass); } - var context = options && options.context; +function ___setPrototypeOf_2(o, p) { ___setPrototypeOf_2 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_2(o, p); } - _window = context? getWindow(context) : window; +var DropEvent = +/*#__PURE__*/ +function (_BaseEvent) { + ___inherits_2(DropEvent, _BaseEvent); - if (context && (_window.Node - ? context instanceof _window.Node - : (isElement(context) || context === _window.document))) { + /** + * Class of events fired on dropzones during drags with acceptable targets. + */ + function DropEvent(dropState, dragEvent, type) { + var _this; - this._context = context; - } - } - else { - _window = getWindow(element); - - if (isElement(element, _window)) { - - if (PointerEvent) { - events.add(this._element, pEventTypes.down, listeners.pointerDown ); - events.add(this._element, pEventTypes.move, listeners.pointerHover); - } - else { - events.add(this._element, 'mousedown' , listeners.pointerDown ); - events.add(this._element, 'mousemove' , listeners.pointerHover); - events.add(this._element, 'touchstart', listeners.pointerDown ); - events.add(this._element, 'touchmove' , listeners.pointerHover); - } - } - } + ___classCallCheck_2(this, DropEvent); - this._doc = _window.document; + _this = ___possibleConstructorReturn_2(this, ___getPrototypeOf_2(DropEvent).call(this, dragEvent._interaction)); + _this.propagationStopped = false; + _this.immediatePropagationStopped = false; + + var _ref = type === 'dragleave' ? dropState.prev : dropState.cur, + element = _ref.element, + dropzone = _ref.dropzone; + + _this.type = type; + _this.target = element; + _this.currentTarget = element; + _this.dropzone = dropzone; + _this.dragEvent = dragEvent; + _this.relatedTarget = dragEvent.target; + _this.draggable = dragEvent.interactable; + _this.timeStamp = dragEvent.timeStamp; + return _this; + } + /** + * If this is a `dropactivate` event, the dropzone element will be + * deactivated. + * + * If this is a `dragmove` or `dragenter`, a `dragleave` will be fired on the + * dropzone element and more. + */ - if (!contains(documents, this._doc)) { - listenToDocument(this._doc); - } - interactables.push(this); + ___createClass_2(DropEvent, [{ + key: "reject", + value: function reject() { + var _this2 = this; - this.set(options); + var dropState = this._interaction.dropState; + + if (this.type !== 'dropactivate' && (!this.dropzone || dropState.cur.dropzone !== this.dropzone || dropState.cur.element !== this.target)) { + return; + } + + dropState.prev.dropzone = this.dropzone; + dropState.prev.element = this.target; + dropState.rejected = true; + dropState.events.enter = null; + this.stopImmediatePropagation(); + + if (this.type === 'dropactivate') { + var activeDrops = dropState.activeDrops; + var index = __arr_2.findIndex(activeDrops, function (_ref2) { + var dropzone = _ref2.dropzone, + element = _ref2.element; + return dropzone === _this2.dropzone && element === _this2.target; + }); + dropState.activeDrops = [].concat(___toConsumableArray_2(activeDrops.slice(0, index)), ___toConsumableArray_2(activeDrops.slice(index + 1))); + var deactivateEvent = new DropEvent(dropState, this.dragEvent, 'dropdeactivate'); + deactivateEvent.dropzone = this.dropzone; + deactivateEvent.target = this.target; + this.dropzone.fire(deactivateEvent); + } else { + this.dropzone.fire(new DropEvent(dropState, this.dragEvent, 'dragleave')); + } } + }, { + key: "preventDefault", + value: function preventDefault() {} + }, { + key: "stopPropagation", + value: function stopPropagation() { + this.propagationStopped = true; + } + }, { + key: "stopImmediatePropagation", + value: function stopImmediatePropagation() { + this.immediatePropagationStopped = this.propagationStopped = true; + } + }]); - Interactable.prototype = { - setOnEvents: function (action, phases) { - if (action === 'drop') { - if (isFunction(phases.ondrop) ) { this.ondrop = phases.ondrop ; } - if (isFunction(phases.ondropactivate) ) { this.ondropactivate = phases.ondropactivate ; } - if (isFunction(phases.ondropdeactivate)) { this.ondropdeactivate = phases.ondropdeactivate; } - if (isFunction(phases.ondragenter) ) { this.ondragenter = phases.ondragenter ; } - if (isFunction(phases.ondragleave) ) { this.ondragleave = phases.ondragleave ; } - if (isFunction(phases.ondropmove) ) { this.ondropmove = phases.ondropmove ; } - } - else { - action = 'on' + action; + return DropEvent; +}(___BaseEvent2_2["default"]); - if (isFunction(phases.onstart) ) { this[action + 'start' ] = phases.onstart ; } - if (isFunction(phases.onmove) ) { this[action + 'move' ] = phases.onmove ; } - if (isFunction(phases.onend) ) { this[action + 'end' ] = phases.onend ; } - if (isFunction(phases.oninertiastart)) { this[action + 'inertiastart' ] = phases.oninertiastart ; } - } +var ___default_2 = DropEvent; +_$DropEvent_2["default"] = ___default_2; - return this; - }, +var _$drop_3 = {}; +"use strict"; - /*\ - * Interactable.draggable - [ method ] - * - * Gets or sets whether drag actions can be performed on the - * Interactable - * - = (boolean) Indicates if this can be the target of drag events - | var isDraggable = interact('ul li').draggable(); - * or - - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable) - = (object) This Interactable - | interact(element).draggable({ - | onstart: function (event) {}, - | onmove : function (event) {}, - | onend : function (event) {}, - | - | // the axis in which the first movement must be - | // for the drag sequence to start - | // 'xy' by default - any direction - | axis: 'x' || 'y' || 'xy', - | - | // max number of drags that can happen concurrently - | // with elements of this Interactable. Infinity by default - | max: Infinity, - | - | // max number of drags that can target the same element+Interactable - | // 1 by default - | maxPerElement: 2 - | }); - \*/ - draggable: function (options) { - if (isObject(options)) { - this.options.drag.enabled = options.enabled === false? false: true; - this.setPerAction('drag', options); - this.setOnEvents('drag', options); - - if (/^x$|^y$|^xy$/.test(options.axis)) { - this.options.drag.axis = options.axis; - } - else if (options.axis === null) { - delete this.options.drag.axis; - } - - return this; - } +Object.defineProperty(_$drop_3, "__esModule", { + value: true +}); +_$drop_3["default"] = void 0; - if (isBool(options)) { - this.options.drag.enabled = options; +var __utils_3 = ___interopRequireWildcard_3(_$utils_56); - return this; - } +var _drag = ___interopRequireDefault_3(_$drag_1); - return this.options.drag; - }, +var _DropEvent = ___interopRequireDefault_3(_$DropEvent_2); - setPerAction: function (action, options) { - // for all the default per-action options - for (var option in options) { - // if this option exists for this action - if (option in defaultOptions[action]) { - // if the option in the options arg is an object value - if (isObject(options[option])) { - // duplicate the object - this.options[action][option] = extend(this.options[action][option] || {}, options[option]); - - if (isObject(defaultOptions.perAction[option]) && 'enabled' in defaultOptions.perAction[option]) { - this.options[action][option].enabled = options[option].enabled === false? false : true; - } - } - else if (isBool(options[option]) && isObject(defaultOptions.perAction[option])) { - this.options[action][option].enabled = options[option]; - } - else if (options[option] !== undefined) { - // or if it's not undefined, do a plain assignment - this.options[action][option] = options[option]; - } - } - } - }, +function ___interopRequireDefault_3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - /*\ - * Interactable.dropzone - [ method ] - * - * Returns or sets whether elements can be dropped onto this - * Interactable to trigger drop events - * - * Dropzones can receive the following events: - * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends - * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone - * - `dragmove` when a draggable that has entered the dropzone is moved - * - `drop` when a draggable is dropped into this dropzone - * - * Use the `accept` option to allow only elements that match the given CSS selector or element. - * - * Use the `overlap` option to set how drops are checked for. The allowed values are: - * - `'pointer'`, the pointer must be over the dropzone (default) - * - `'center'`, the draggable element's center must be over the dropzone - * - a number from 0-1 which is the `(intersection area) / (draggable area)`. - * e.g. `0.5` for drop to happen when half of the area of the - * draggable is over the dropzone - * - - options (boolean | object | null) #optional The new value to be set. - | interact('.drop').dropzone({ - | accept: '.can-drop' || document.getElementById('single-drop'), - | overlap: 'pointer' || 'center' || zeroToOne - | } - = (boolean | object) The current setting or this Interactable - \*/ - dropzone: function (options) { - if (isObject(options)) { - this.options.drop.enabled = options.enabled === false? false: true; - this.setOnEvents('drop', options); - - if (/^(pointer|center)$/.test(options.overlap)) { - this.options.drop.overlap = options.overlap; - } - else if (isNumber(options.overlap)) { - this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); - } - if ('accept' in options) { - this.options.drop.accept = options.accept; - } - if ('checker' in options) { - this.options.drop.checker = options.checker; - } - - return this; - } +function ___interopRequireWildcard_3(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - if (isBool(options)) { - this.options.drop.enabled = options; +function __install_3(scope) { + var actions = scope.actions, + interact = scope.interact, + Interactable = scope.Interactable, + interactions = scope.interactions, + defaults = scope.defaults; + scope.usePlugin(_drag["default"]); + interactions.signals.on('before-action-start', function (_ref) { + var interaction = _ref.interaction; - return this; - } + if (interaction.prepared.name !== 'drag') { + return; + } - return this.options.drop; - }, + interaction.dropState = { + cur: { + dropzone: null, + element: null + }, + prev: { + dropzone: null, + element: null + }, + rejected: null, + events: null, + activeDrops: null + }; + }); + interactions.signals.on('after-action-start', function (_ref2) { + var interaction = _ref2.interaction, + event = _ref2.event, + dragEvent = _ref2.iEvent; + + if (interaction.prepared.name !== 'drag') { + return; + } - dropCheck: function (dragEvent, event, draggable, draggableElement, dropElement, rect) { - var dropped = false; + var dropState = interaction.dropState; // reset active dropzones - // if the dropzone has no rect (eg. display: none) - // call the custom dropChecker or just return false - if (!(rect = rect || this.getRect(dropElement))) { - return (this.options.drop.checker - ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement) - : false); - } + dropState.activeDrops = null; + dropState.events = null; + dropState.activeDrops = getActiveDrops(scope, interaction.element); + dropState.events = getDropEvents(interaction, event, dragEvent); - var dropOverlap = this.options.drop.overlap; + if (dropState.events.activate) { + fireActivationEvents(dropState.activeDrops, dropState.events.activate); + } + }); // FIXME proper signal types + + interactions.signals.on('action-move', function (arg) { + return onEventCreated(arg, scope); + }); + interactions.signals.on('action-end', function (arg) { + return onEventCreated(arg, scope); + }); + interactions.signals.on('after-action-move', function (_ref3) { + var interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'drag') { + return; + } - if (dropOverlap === 'pointer') { - var page = getPageXY(dragEvent), - origin = getOriginXY(draggable, draggableElement), - horizontal, - vertical; + fireDropEvents(interaction, interaction.dropState.events); + interaction.dropState.events = {}; + }); + interactions.signals.on('after-action-end', function (_ref4) { + var interaction = _ref4.interaction; - page.x += origin.x; - page.y += origin.y; + if (interaction.prepared.name !== 'drag') { + return; + } - horizontal = (page.x > rect.left) && (page.x < rect.right); - vertical = (page.y > rect.top ) && (page.y < rect.bottom); + fireDropEvents(interaction, interaction.dropState.events); + }); + interactions.signals.on('stop', function (_ref5) { + var interaction = _ref5.interaction; - dropped = horizontal && vertical; - } + if (interaction.prepared.name !== 'drag') { + return; + } - var dragRect = draggable.getRect(draggableElement); + var dropState = interaction.dropState; - if (dropOverlap === 'center') { - var cx = dragRect.left + dragRect.width / 2, - cy = dragRect.top + dragRect.height / 2; + if (dropState) { + dropState.activeDrops = null; + dropState.events = null; + dropState.cur.dropzone = null; + dropState.cur.element = null; + dropState.prev.dropzone = null; + dropState.prev.element = null; + dropState.rejected = false; + } + }); + /** + * + * ```js + * interact('.drop').dropzone({ + * accept: '.can-drop' || document.getElementById('single-drop'), + * overlap: 'pointer' || 'center' || zeroToOne + * } + * ``` + * + * Returns or sets whether draggables can be dropped onto this target to + * trigger drop events + * + * Dropzones can receive the following events: + * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends + * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone + * - `dragmove` when a draggable that has entered the dropzone is moved + * - `drop` when a draggable is dropped into this dropzone + * + * Use the `accept` option to allow only elements that match the given CSS + * selector or element. The value can be: + * + * - **an Element** - only that element can be dropped into this dropzone. + * - **a string**, - the element being dragged must match it as a CSS selector. + * - **`null`** - accept options is cleared - it accepts any element. + * + * Use the `overlap` option to set how drops are checked for. The allowed + * values are: + * + * - `'pointer'`, the pointer must be over the dropzone (default) + * - `'center'`, the draggable element's center must be over the dropzone + * - a number from 0-1 which is the `(intersection area) / (draggable area)`. + * e.g. `0.5` for drop to happen when half of the area of the draggable is + * over the dropzone + * + * Use the `checker` option to specify a function to check if a dragged element + * is over this Interactable. + * + * @param {boolean | object | null} [options] The new options to be set. + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.dropzone = function (options) { + return dropzoneMethod(this, options); + }; + /** + * ```js + * interact(target) + * .dropChecker(function(dragEvent, // related dragmove or dragend event + * event, // TouchEvent/PointerEvent/MouseEvent + * dropped, // bool result of the default checker + * dropzone, // dropzone Interactable + * dropElement, // dropzone elemnt + * draggable, // draggable Interactable + * draggableElement) {// draggable element + * + * return dropped && event.target.hasAttribute('allow-drop') + * } + * ``` + */ + + + Interactable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) { + return dropCheckMethod(this, dragEvent, event, draggable, draggableElement, dropElement, rect); + }; + /** + * Returns or sets whether the dimensions of dropzone elements are calculated + * on every dragmove or only on dragstart for the default dropChecker + * + * @param {boolean} [newValue] True to check on each move. False to check only + * before start + * @return {boolean | interact} The current setting or interact + */ + + + interact.dynamicDrop = function (newValue) { + if (__utils_3.is.bool(newValue)) { + // if (dragging && scope.dynamicDrop !== newValue && !newValue) { + // calcRects(dropzones) + // } + scope.dynamicDrop = newValue; + return interact; + } - dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; - } + return scope.dynamicDrop; + }; - if (isNumber(dropOverlap)) { - var overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left)) - * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top ))), - overlapRatio = overlapArea / (dragRect.width * dragRect.height); + __utils_3.arr.merge(actions.eventTypes, ['dragenter', 'dragleave', 'dropactivate', 'dropdeactivate', 'dropmove', 'drop']); + actions.methodDict.drop = 'dropzone'; + scope.dynamicDrop = false; + defaults.actions.drop = drop.defaults; +} - dropped = overlapRatio >= dropOverlap; - } +function collectDrops(_ref6, draggableElement) { + var interactables = _ref6.interactables; + var drops = []; // collect all dropzones and their elements which qualify for a drop - if (this.options.drop.checker) { - dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement); - } + for (var _i = 0; _i < interactables.list.length; _i++) { + var _ref7; - return dropped; - }, + _ref7 = interactables.list[_i]; + var dropzone = _ref7; - /*\ - * Interactable.dropChecker - [ method ] - * - * DEPRECATED. Use interactable.dropzone({ checker: function... }) instead. - * - * Gets or sets the function used to check if a dragged element is - * over this Interactable. - * - - checker (function) #optional The function that will be called when checking for a drop - = (Function | Interactable) The checker function or this Interactable - * - * The checker function takes the following arguments: - * - - dragEvent (InteractEvent) The related dragmove or dragend event - - event (TouchEvent | PointerEvent | MouseEvent) The user move/up/end Event related to the dragEvent - - dropped (boolean) The value from the default drop checker - - dropzone (Interactable) The dropzone interactable - - dropElement (Element) The dropzone element - - draggable (Interactable) The Interactable being dragged - - draggableElement (Element) The actual element that's being dragged - * - > Usage: - | interact(target) - | .dropChecker(function(dragEvent, // related dragmove or dragend event - | event, // TouchEvent/PointerEvent/MouseEvent - | dropped, // bool result of the default checker - | dropzone, // dropzone Interactable - | dropElement, // dropzone elemnt - | draggable, // draggable Interactable - | draggableElement) {// draggable element - | - | return dropped && event.target.hasAttribute('allow-drop'); - | } - \*/ - dropChecker: function (checker) { - if (isFunction(checker)) { - this.options.drop.checker = checker; - - return this; - } - if (checker === null) { - delete this.options.getRect; + if (!dropzone.options.drop.enabled) { + continue; + } - return this; - } + var accept = dropzone.options.drop.accept; // test the draggable draggableElement against the dropzone's accept setting - return this.options.drop.checker; - }, + if (__utils_3.is.element(accept) && accept !== draggableElement || __utils_3.is.string(accept) && !__utils_3.dom.matchesSelector(draggableElement, accept) || __utils_3.is.func(accept) && !accept({ + dropzone: dropzone, + draggableElement: draggableElement + })) { + continue; + } // query for new elements if necessary - /*\ - * Interactable.accept - [ method ] - * - * Deprecated. add an `accept` property to the options object passed to - * @Interactable.dropzone instead. - * - * Gets or sets the Element or CSS selector match that this - * Interactable accepts if it is a dropzone. - * - - newValue (Element | string | null) #optional - * If it is an Element, then only that element can be dropped into this dropzone. - * If it is a string, the element being dragged must match it as a selector. - * If it is null, the accept options is cleared - it accepts any element. - * - = (string | Element | null | Interactable) The current accept option if given `undefined` or this Interactable - \*/ - accept: function (newValue) { - if (isElement(newValue)) { - this.options.drop.accept = newValue; - - return this; - } - // test if it is a valid CSS selector - if (trySelector(newValue)) { - this.options.drop.accept = newValue; + var dropElements = __utils_3.is.string(dropzone.target) ? dropzone._context.querySelectorAll(dropzone.target) : __utils_3.is.array(dropzone.target) ? dropzone.target : [dropzone.target]; - return this; - } + for (var _i2 = 0; _i2 < dropElements.length; _i2++) { + var _ref8; - if (newValue === null) { - delete this.options.drop.accept; + _ref8 = dropElements[_i2]; + var dropzoneElement = _ref8; - return this; - } + if (dropzoneElement !== draggableElement) { + drops.push({ + dropzone: dropzone, + element: dropzoneElement + }); + } + } + } + + return drops; +} + +function fireActivationEvents(activeDrops, event) { + // loop through all active dropzones and trigger event + for (var _i3 = 0; _i3 < activeDrops.length; _i3++) { + var _ref9; + + _ref9 = activeDrops[_i3]; + var _ref10 = _ref9, + dropzone = _ref10.dropzone, + element = _ref10.element; + event.dropzone = dropzone; // set current element as event target + + event.target = element; + dropzone.fire(event); + event.propagationStopped = event.immediatePropagationStopped = false; + } +} // return a new array of possible drops. getActiveDrops should always be +// called when a drag has just started or a drag event happens while +// dynamicDrop is true + + +function getActiveDrops(scope, dragElement) { + // get dropzones and their elements that could receive the draggable + var activeDrops = collectDrops(scope, dragElement); + + for (var _i4 = 0; _i4 < activeDrops.length; _i4++) { + var _ref11; + + _ref11 = activeDrops[_i4]; + var activeDrop = _ref11; + activeDrop.rect = activeDrop.dropzone.getRect(activeDrop.element); + } + + return activeDrops; +} + +function getDrop(_ref12, dragEvent, pointerEvent) { + var dropState = _ref12.dropState, + draggable = _ref12.interactable, + dragElement = _ref12.element; + var validDrops = []; // collect all dropzones and their elements which qualify for a drop + + for (var _i5 = 0; _i5 < dropState.activeDrops.length; _i5++) { + var _ref13; + + _ref13 = dropState.activeDrops[_i5]; + var _ref14 = _ref13, + dropzone = _ref14.dropzone, + dropzoneElement = _ref14.element, + rect = _ref14.rect; + validDrops.push(dropzone.dropCheck(dragEvent, pointerEvent, draggable, dragElement, dropzoneElement, rect) ? dropzoneElement : null); + } // get the most appropriate dropzone based on DOM depth and order + + + var dropIndex = __utils_3.dom.indexOfDeepestElement(validDrops); + return dropState.activeDrops[dropIndex] || null; +} + +function getDropEvents(interaction, _pointerEvent, dragEvent) { + var dropState = interaction.dropState; + var dropEvents = { + enter: null, + leave: null, + activate: null, + deactivate: null, + move: null, + drop: null + }; + + if (dragEvent.type === 'dragstart') { + dropEvents.activate = new _DropEvent["default"](dropState, dragEvent, 'dropactivate'); + dropEvents.activate.target = null; + dropEvents.activate.dropzone = null; + } + + if (dragEvent.type === 'dragend') { + dropEvents.deactivate = new _DropEvent["default"](dropState, dragEvent, 'dropdeactivate'); + dropEvents.deactivate.target = null; + dropEvents.deactivate.dropzone = null; + } + + if (dropState.rejected) { + return dropEvents; + } + + if (dropState.cur.element !== dropState.prev.element) { + // if there was a previous dropzone, create a dragleave event + if (dropState.prev.dropzone) { + dropEvents.leave = new _DropEvent["default"](dropState, dragEvent, 'dragleave'); + dragEvent.dragLeave = dropEvents.leave.target = dropState.prev.element; + dragEvent.prevDropzone = dropEvents.leave.dropzone = dropState.prev.dropzone; + } // if dropzone is not null, create a dragenter event + + + if (dropState.cur.dropzone) { + dropEvents.enter = new _DropEvent["default"](dropState, dragEvent, 'dragenter'); + dragEvent.dragEnter = dropState.cur.element; + dragEvent.dropzone = dropState.cur.dropzone; + } + } + + if (dragEvent.type === 'dragend' && dropState.cur.dropzone) { + dropEvents.drop = new _DropEvent["default"](dropState, dragEvent, 'drop'); + dragEvent.dropzone = dropState.cur.dropzone; + dragEvent.relatedTarget = dropState.cur.element; + } + + if (dragEvent.type === 'dragmove' && dropState.cur.dropzone) { + dropEvents.move = new _DropEvent["default"](dropState, dragEvent, 'dropmove'); + dropEvents.move.dragmove = dragEvent; + dragEvent.dropzone = dropState.cur.dropzone; + } + + return dropEvents; +} + +function fireDropEvents(interaction, events) { + var dropState = interaction.dropState; + var activeDrops = dropState.activeDrops, + cur = dropState.cur, + prev = dropState.prev; + + if (events.leave) { + prev.dropzone.fire(events.leave); + } + + if (events.move) { + cur.dropzone.fire(events.move); + } + + if (events.enter) { + cur.dropzone.fire(events.enter); + } + + if (events.drop) { + cur.dropzone.fire(events.drop); + } + + if (events.deactivate) { + fireActivationEvents(activeDrops, events.deactivate); + } + + dropState.prev.dropzone = cur.dropzone; + dropState.prev.element = cur.element; +} + +function onEventCreated(_ref15, scope) { + var interaction = _ref15.interaction, + iEvent = _ref15.iEvent, + event = _ref15.event; + + if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { + return; + } + + var dropState = interaction.dropState; + + if (scope.dynamicDrop) { + dropState.activeDrops = getActiveDrops(scope, interaction.element); + } + + var dragEvent = iEvent; + var dropResult = getDrop(interaction, dragEvent, event); // update rejected status + + dropState.rejected = dropState.rejected && !!dropResult && dropResult.dropzone === dropState.cur.dropzone && dropResult.element === dropState.cur.element; + dropState.cur.dropzone = dropResult && dropResult.dropzone; + dropState.cur.element = dropResult && dropResult.element; + dropState.events = getDropEvents(interaction, event, dragEvent); +} + +function dropzoneMethod(interactable, options) { + if (__utils_3.is.object(options)) { + interactable.options.drop.enabled = options.enabled !== false; + + if (options.listeners) { + var normalized = __utils_3.normalizeListeners(options.listeners); // rename 'drop' to '' as it will be prefixed with 'drop' + + var corrected = Object.keys(normalized).reduce(function (acc, type) { + var correctedType = /^(enter|leave)/.test(type) ? "drag".concat(type) : /^(activate|deactivate|move)/.test(type) ? "drop".concat(type) : type; + acc[correctedType] = normalized[type]; + return acc; + }, {}); + interactable.off(interactable.options.drop.listeners); + interactable.on(corrected); + interactable.options.drop.listeners = corrected; + } - return this.options.drop.accept; - }, + if (__utils_3.is.func(options.ondrop)) { + interactable.on('drop', options.ondrop); + } - /*\ - * Interactable.resizable - [ method ] - * - * Gets or sets whether resize actions can be performed on the - * Interactable - * - = (boolean) Indicates if this can be the target of resize elements - | var isResizeable = interact('input[type=text]').resizable(); - * or - - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable) - = (object) This Interactable - | interact(element).resizable({ - | onstart: function (event) {}, - | onmove : function (event) {}, - | onend : function (event) {}, - | - | edges: { - | top : true, // Use pointer coords to check for resize. - | left : false, // Disable resizing from left edge. - | bottom: '.resize-s',// Resize if pointer target matches selector - | right : handleEl // Resize if pointer target is the given Element - | }, - | - | // Width and height can be adjusted independently. When `true`, width and - | // height are adjusted at a 1:1 ratio. - | square: false, - | - | // Width and height can be adjusted independently. When `true`, width and - | // height maintain the aspect ratio they had when resizing started. - | preserveAspectRatio: false, - | - | // a value of 'none' will limit the resize rect to a minimum of 0x0 - | // 'negate' will allow the rect to have negative width/height - | // 'reposition' will keep the width/height positive by swapping - | // the top and bottom edges and/or swapping the left and right edges - | invert: 'none' || 'negate' || 'reposition' - | - | // limit multiple resizes. - | // See the explanation in the @Interactable.draggable example - | max: Infinity, - | maxPerElement: 1, - | }); - \*/ - resizable: function (options) { - if (isObject(options)) { - this.options.resize.enabled = options.enabled === false? false: true; - this.setPerAction('resize', options); - this.setOnEvents('resize', options); - - if (/^x$|^y$|^xy$/.test(options.axis)) { - this.options.resize.axis = options.axis; - } - else if (options.axis === null) { - this.options.resize.axis = defaultOptions.resize.axis; - } - - if (isBool(options.preserveAspectRatio)) { - this.options.resize.preserveAspectRatio = options.preserveAspectRatio; - } - else if (isBool(options.square)) { - this.options.resize.square = options.square; - } - - return this; - } - if (isBool(options)) { - this.options.resize.enabled = options; + if (__utils_3.is.func(options.ondropactivate)) { + interactable.on('dropactivate', options.ondropactivate); + } - return this; - } - return this.options.resize; - }, + if (__utils_3.is.func(options.ondropdeactivate)) { + interactable.on('dropdeactivate', options.ondropdeactivate); + } - /*\ - * Interactable.squareResize - [ method ] - * - * Deprecated. Add a `square: true || false` property to @Interactable.resizable instead - * - * Gets or sets whether resizing is forced 1:1 aspect - * - = (boolean) Current setting - * - * or - * - - newValue (boolean) #optional - = (object) this Interactable - \*/ - squareResize: function (newValue) { - if (isBool(newValue)) { - this.options.resize.square = newValue; - - return this; - } + if (__utils_3.is.func(options.ondragenter)) { + interactable.on('dragenter', options.ondragenter); + } - if (newValue === null) { - delete this.options.resize.square; + if (__utils_3.is.func(options.ondragleave)) { + interactable.on('dragleave', options.ondragleave); + } - return this; - } + if (__utils_3.is.func(options.ondropmove)) { + interactable.on('dropmove', options.ondropmove); + } - return this.options.resize.square; - }, + if (/^(pointer|center)$/.test(options.overlap)) { + interactable.options.drop.overlap = options.overlap; + } else if (__utils_3.is.number(options.overlap)) { + interactable.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0); + } - /*\ - * Interactable.gesturable - [ method ] - * - * Gets or sets whether multitouch gestures can be performed on the - * Interactable's element - * - = (boolean) Indicates if this can be the target of gesture events - | var isGestureable = interact(element).gesturable(); - * or - - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable) - = (object) this Interactable - | interact(element).gesturable({ - | onstart: function (event) {}, - | onmove : function (event) {}, - | onend : function (event) {}, - | - | // limit multiple gestures. - | // See the explanation in @Interactable.draggable example - | max: Infinity, - | maxPerElement: 1, - | }); - \*/ - gesturable: function (options) { - if (isObject(options)) { - this.options.gesture.enabled = options.enabled === false? false: true; - this.setPerAction('gesture', options); - this.setOnEvents('gesture', options); - - return this; - } + if ('accept' in options) { + interactable.options.drop.accept = options.accept; + } - if (isBool(options)) { - this.options.gesture.enabled = options; + if ('checker' in options) { + interactable.options.drop.checker = options.checker; + } - return this; - } + return interactable; + } + + if (__utils_3.is.bool(options)) { + interactable.options.drop.enabled = options; + return interactable; + } + + return interactable.options.drop; +} + +function dropCheckMethod(interactable, dragEvent, event, draggable, draggableElement, dropElement, rect) { + var dropped = false; // if the dropzone has no rect (eg. display: none) + // call the custom dropChecker or just return false + + if (!(rect = rect || interactable.getRect(dropElement))) { + return interactable.options.drop.checker ? interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement) : false; + } + + var dropOverlap = interactable.options.drop.overlap; + + if (dropOverlap === 'pointer') { + var origin = __utils_3.getOriginXY(draggable, draggableElement, 'drag'); + var page = __utils_3.pointer.getPageXY(dragEvent); + page.x += origin.x; + page.y += origin.y; + var horizontal = page.x > rect.left && page.x < rect.right; + var vertical = page.y > rect.top && page.y < rect.bottom; + dropped = horizontal && vertical; + } + + var dragRect = draggable.getRect(draggableElement); + + if (dragRect && dropOverlap === 'center') { + var cx = dragRect.left + dragRect.width / 2; + var cy = dragRect.top + dragRect.height / 2; + dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom; + } + + if (dragRect && __utils_3.is.number(dropOverlap)) { + var overlapArea = Math.max(0, Math.min(rect.right, dragRect.right) - Math.max(rect.left, dragRect.left)) * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top, dragRect.top)); + var overlapRatio = overlapArea / (dragRect.width * dragRect.height); + dropped = overlapRatio >= dropOverlap; + } + + if (interactable.options.drop.checker) { + dropped = interactable.options.drop.checker(dragEvent, event, dropped, interactable, dropElement, draggable, draggableElement); + } + + return dropped; +} + +var drop = { + id: 'actions/drop', + install: __install_3, + getActiveDrops: getActiveDrops, + getDrop: getDrop, + getDropEvents: getDropEvents, + fireDropEvents: fireDropEvents, + defaults: { + enabled: false, + accept: null, + overlap: 'pointer' + } +}; +var ___default_3 = drop; +_$drop_3["default"] = ___default_3; + +var _$gesture_4 = {}; +"use strict"; + +Object.defineProperty(_$gesture_4, "__esModule", { + value: true +}); +_$gesture_4["default"] = void 0; + +var ___InteractEvent_4 = ___interopRequireDefault_4(_$InteractEvent_15); + +var ___scope_4 = _$scope_24({}); + +var __utils_4 = ___interopRequireWildcard_4(_$utils_56); + +function ___interopRequireWildcard_4(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_4(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +___scope_4.ActionName.Gesture = 'gesture'; + +function __install_4(scope) { + var actions = scope.actions, + Interactable = scope.Interactable, + interactions = scope.interactions, + defaults = scope.defaults; + /** + * ```js + * interact(element).gesturable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * // limit multiple gestures. + * // See the explanation in {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isGestureable = interact(element).gesturable() + * ``` + * + * Gets or sets whether multitouch gestures can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on gesture events (makes the Interactable gesturable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of gesture events, or this Interactable + */ + + Interactable.prototype.gesturable = function (options) { + if (__utils_4.is.object(options)) { + this.options.gesture.enabled = options.enabled !== false; + this.setPerAction('gesture', options); + this.setOnEvents('gesture', options); + return this; + } - return this.options.gesture; - }, + if (__utils_4.is.bool(options)) { + this.options.gesture.enabled = options; + return this; + } - /*\ - * Interactable.autoScroll - [ method ] - ** - * Deprecated. Add an `autoscroll` property to the options object - * passed to @Interactable.draggable or @Interactable.resizable instead. - * - * Returns or sets whether dragging and resizing near the edges of the - * window/container trigger autoScroll for this Interactable - * - = (object) Object with autoScroll properties - * - * or - * - - options (object | boolean) #optional - * options can be: - * - an object with margin, distance and interval properties, - * - true or false to enable or disable autoScroll or - = (Interactable) this Interactable - \*/ - autoScroll: function (options) { - if (isObject(options)) { - options = extend({ actions: ['drag', 'resize']}, options); - } - else if (isBool(options)) { - options = { actions: ['drag', 'resize'], enabled: options }; - } + return this.options.gesture; + }; + + interactions.signals.on('action-start', updateGestureProps); + interactions.signals.on('action-move', updateGestureProps); + interactions.signals.on('action-end', updateGestureProps); + interactions.signals.on('new', function (_ref) { + var interaction = _ref.interaction; + interaction.gesture = { + angle: 0, + distance: 0, + scale: 1, + startAngle: 0, + startDistance: 0 + }; + }); + actions[___scope_4.ActionName.Gesture] = gesture; + actions.names.push(___scope_4.ActionName.Gesture); + __utils_4.arr.merge(actions.eventTypes, ['gesturestart', 'gesturemove', 'gestureend']); + actions.methodDict.gesture = 'gesturable'; + defaults.actions.gesture = gesture.defaults; +} + +var gesture = { + id: 'actions/gesture', + install: __install_4, + defaults: {}, + checker: function checker(_pointer, _event, _interactable, _element, interaction) { + if (interaction.pointers.length >= 2) { + return { + name: 'gesture' + }; + } - return this.setOptions('autoScroll', options); - }, + return null; + }, + getCursor: function getCursor() { + return ''; + } +}; + +function updateGestureProps(_ref2) { + var interaction = _ref2.interaction, + iEvent = _ref2.iEvent, + event = _ref2.event, + phase = _ref2.phase; + + if (interaction.prepared.name !== 'gesture') { + return; + } + + var pointers = interaction.pointers.map(function (p) { + return p.pointer; + }); + var starting = phase === 'start'; + var ending = phase === 'end'; + var deltaSource = interaction.interactable.options.deltaSource; + iEvent.touches = [pointers[0], pointers[1]]; + + if (starting) { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = 1; + iEvent.ds = 0; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.da = 0; + interaction.gesture.startDistance = iEvent.distance; + interaction.gesture.startAngle = iEvent.angle; + } else if (ending || event instanceof ___InteractEvent_4["default"]) { + var prevEvent = interaction.prevEvent; + iEvent.distance = prevEvent.distance; + iEvent.box = prevEvent.box; + iEvent.scale = prevEvent.scale; + iEvent.ds = 0; + iEvent.angle = prevEvent.angle; + iEvent.da = 0; + } else { + iEvent.distance = __utils_4.pointer.touchDistance(pointers, deltaSource); + iEvent.box = __utils_4.pointer.touchBBox(pointers); + iEvent.scale = iEvent.distance / interaction.gesture.startDistance; + iEvent.angle = __utils_4.pointer.touchAngle(pointers, deltaSource); + iEvent.ds = iEvent.scale - interaction.gesture.scale; + iEvent.da = iEvent.angle - interaction.gesture.angle; + } + + interaction.gesture.distance = iEvent.distance; + interaction.gesture.angle = iEvent.angle; + + if (__utils_4.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) { + interaction.gesture.scale = iEvent.scale; + } +} + +var ___default_4 = gesture; +_$gesture_4["default"] = ___default_4; + +var _$resize_6 = {}; +"use strict"; + +Object.defineProperty(_$resize_6, "__esModule", { + value: true +}); +_$resize_6["default"] = void 0; + +var ___scope_6 = _$scope_24({}); + +var __arr_6 = ___interopRequireWildcard_6(_$arr_47); + +var __dom_6 = ___interopRequireWildcard_6(_$domUtils_51); + +var ___extend_6 = ___interopRequireDefault_6(_$extend_53); + +var __is_6 = ___interopRequireWildcard_6(_$is_57); + +function ___interopRequireDefault_6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_6(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +___scope_6.ActionName.Resize = 'resize'; + +function __install_6(scope) { + var actions = scope.actions, + browser = scope.browser, + Interactable = scope.Interactable, + interactions = scope.interactions, + defaults = scope.defaults; // Less Precision with touch input + + interactions.signals.on('new', function (interaction) { + interaction.resizeAxes = 'xy'; + }); + interactions.signals.on('action-start', start); + interactions.signals.on('action-move', __move_6); + interactions.signals.on('action-start', updateEventAxes); + interactions.signals.on('action-move', updateEventAxes); + resize.cursors = initCursors(browser); + resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10; + /** + * ```js + * interact(element).resizable({ + * onstart: function (event) {}, + * onmove : function (event) {}, + * onend : function (event) {}, + * + * edges: { + * top : true, // Use pointer coords to check for resize. + * left : false, // Disable resizing from left edge. + * bottom: '.resize-s',// Resize if pointer target matches selector + * right : handleEl // Resize if pointer target is the given Element + * }, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height are adjusted at a 1:1 ratio. + * square: false, + * + * // Width and height can be adjusted independently. When `true`, width and + * // height maintain the aspect ratio they had when resizing started. + * preserveAspectRatio: false, + * + * // a value of 'none' will limit the resize rect to a minimum of 0x0 + * // 'negate' will allow the rect to have negative width/height + * // 'reposition' will keep the width/height positive by swapping + * // the top and bottom edges and/or swapping the left and right edges + * invert: 'none' || 'negate' || 'reposition' + * + * // limit multiple resizes. + * // See the explanation in the {@link Interactable.draggable} example + * max: Infinity, + * maxPerElement: 1, + * }) + * + * var isResizeable = interact(element).resizable() + * ``` + * + * Gets or sets whether resize actions can be performed on the target + * + * @param {boolean | object} [options] true/false or An object with event + * listeners to be fired on resize events (object makes the Interactable + * resizable) + * @return {boolean | Interactable} A boolean indicating if this can be the + * target of resize elements, or this Interactable + */ + + Interactable.prototype.resizable = function (options) { + return resizable(this, options, scope); + }; + + actions[___scope_6.ActionName.Resize] = resize; + actions.names.push(___scope_6.ActionName.Resize); + __arr_6.merge(actions.eventTypes, ['resizestart', 'resizemove', 'resizeinertiastart', 'resizeresume', 'resizeend']); + actions.methodDict.resize = 'resizable'; + defaults.actions.resize = resize.defaults; +} + +var resize = { + id: 'actions/resize', + install: __install_6, + defaults: { + square: false, + preserveAspectRatio: false, + axis: 'xy', + // use default margin + margin: NaN, + // object with props left, right, top, bottom which are + // true/false values to resize when the pointer is over that edge, + // CSS selectors to match the handles for each direction + // or the Elements for each handle + edges: null, + // a value of 'none' will limit the resize rect to a minimum of 0x0 + // 'negate' will alow the rect to have negative width/height + // 'reposition' will keep the width/height positive by swapping + // the top and bottom edges and/or swapping the left and right edges + invert: 'none' + }, + checker: function checker(_pointer, _event, interactable, element, interaction, rect) { + if (!rect) { + return null; + } - /*\ - * Interactable.snap - [ method ] - ** - * Deprecated. Add a `snap` property to the options object passed - * to @Interactable.draggable or @Interactable.resizable instead. - * - * Returns or sets if and how action coordinates are snapped. By - * default, snapping is relative to the pointer coordinates. You can - * change this by setting the - * [`elementOrigin`](https://github.com/taye/interact.js/pull/72). - ** - = (boolean | object) `false` if snap is disabled; object with snap properties if snap is enabled - ** - * or - ** - - options (object | boolean | null) #optional - = (Interactable) this Interactable - > Usage - | interact(document.querySelector('#thing')).snap({ - | targets: [ - | // snap to this specific point - | { - | x: 100, - | y: 100, - | range: 25 - | }, - | // give this function the x and y page coords and snap to the object returned - | function (x, y) { - | return { - | x: x, - | y: (75 + 50 * Math.sin(x * 0.04)), - | range: 40 - | }; - | }, - | // create a function that snaps to a grid - | interact.createSnapGrid({ - | x: 50, - | y: 50, - | range: 10, // optional - | offset: { x: 5, y: 10 } // optional - | }) - | ], - | // do not snap during normal movement. - | // Instead, trigger only one snapped move event - | // immediately before the end event. - | endOnly: true, - | - | relativePoints: [ - | { x: 0, y: 0 }, // snap relative to the top left of the element - | { x: 1, y: 1 }, // and also to the bottom right - | ], - | - | // offset the snap target coordinates - | // can be an object with x/y or 'startCoords' - | offset: { x: 50, y: 50 } - | } - | }); - \*/ - snap: function (options) { - var ret = this.setOptions('snap', options); - - if (ret === this) { return this; } - - return ret.drag; - }, + var page = (0, ___extend_6["default"])({}, interaction.coords.cur.page); + var options = interactable.options; + + if (options.resize.enabled) { + var resizeOptions = options.resize; + var resizeEdges = { + left: false, + right: false, + top: false, + bottom: false + }; // if using resize.edges + + if (__is_6.object(resizeOptions.edges)) { + for (var edge in resizeEdges) { + resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || this.defaultMargin); + } - setOptions: function (option, options) { - var actions = options && isArray(options.actions) - ? options.actions - : ['drag']; - - var i; - - if (isObject(options) || isBool(options)) { - for (i = 0; i < actions.length; i++) { - var action = /resize/.test(actions[i])? 'resize' : actions[i]; - - if (!isObject(this.options[action])) { continue; } - - var thisOption = this.options[action][option]; - - if (isObject(options)) { - extend(thisOption, options); - thisOption.enabled = options.enabled === false? false: true; - - if (option === 'snap') { - if (thisOption.mode === 'grid') { - thisOption.targets = [ - interact.createSnapGrid(extend({ - offset: thisOption.gridOffset || { x: 0, y: 0 } - }, thisOption.grid || {})) - ]; - } - else if (thisOption.mode === 'anchor') { - thisOption.targets = thisOption.anchors; - } - else if (thisOption.mode === 'path') { - thisOption.targets = thisOption.paths; - } - - if ('elementOrigin' in options) { - thisOption.relativePoints = [options.elementOrigin]; - } - } - } - else if (isBool(options)) { - thisOption.enabled = options; - } - } - - return this; - } + resizeEdges.left = resizeEdges.left && !resizeEdges.right; + resizeEdges.top = resizeEdges.top && !resizeEdges.bottom; - var ret = {}, - allActions = ['drag', 'resize', 'gesture']; + if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) { + return { + name: 'resize', + edges: resizeEdges + }; + } + } else { + var right = options.resize.axis !== 'y' && page.x > rect.right - this.defaultMargin; + var bottom = options.resize.axis !== 'x' && page.y > rect.bottom - this.defaultMargin; + + if (right || bottom) { + return { + name: 'resize', + axes: (right ? 'x' : '') + (bottom ? 'y' : '') + }; + } + } + } - for (i = 0; i < allActions.length; i++) { - if (option in defaultOptions[allActions[i]]) { - ret[allActions[i]] = this.options[allActions[i]][option]; - } - } + return null; + }, + cursors: null, + getCursor: function getCursor(_ref) { + var edges = _ref.edges, + axis = _ref.axis, + name = _ref.name; + var cursors = resize.cursors; + var result = null; + + if (axis) { + result = cursors[name + axis]; + } else if (edges) { + var cursorKey = ''; + var _arr = ['top', 'bottom', 'left', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (edges[edge]) { + cursorKey += edge; + } + } - return ret; - }, + result = cursors[cursorKey]; + } + return result; + }, + defaultMargin: null +}; + +function resizable(interactable, options, scope) { + if (__is_6.object(options)) { + interactable.options.resize.enabled = options.enabled !== false; + interactable.setPerAction('resize', options); + interactable.setOnEvents('resize', options); + + if (__is_6.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) { + interactable.options.resize.axis = options.axis; + } else if (options.axis === null) { + interactable.options.resize.axis = scope.defaults.actions.resize.axis; + } - /*\ - * Interactable.inertia - [ method ] - ** - * Deprecated. Add an `inertia` property to the options object passed - * to @Interactable.draggable or @Interactable.resizable instead. - * - * Returns or sets if and how events continue to run after the pointer is released - ** - = (boolean | object) `false` if inertia is disabled; `object` with inertia properties if inertia is enabled - ** - * or - ** - - options (object | boolean | null) #optional - = (Interactable) this Interactable - > Usage - | // enable and use default settings - | interact(element).inertia(true); - | - | // enable and use custom settings - | interact(element).inertia({ - | // value greater than 0 - | // high values slow the object down more quickly - | resistance : 16, - | - | // the minimum launch speed (pixels per second) that results in inertia start - | minSpeed : 200, - | - | // inertia will stop when the object slows down to this speed - | endSpeed : 20, - | - | // boolean; should actions be resumed when the pointer goes down during inertia - | allowResume : true, - | - | // boolean; should the jump when resuming from inertia be ignored in event.dx/dy - | zeroResumeDelta: false, - | - | // if snap/restrict are set to be endOnly and inertia is enabled, releasing - | // the pointer without triggering inertia will animate from the release - | // point to the snaped/restricted point in the given amount of time (ms) - | smoothEndDuration: 300, - | - | // an array of action types that can have inertia (no gesture) - | actions : ['drag', 'resize'] - | }); - | - | // reset custom settings and use all defaults - | interact(element).inertia(null); - \*/ - inertia: function (options) { - var ret = this.setOptions('inertia', options); - - if (ret === this) { return this; } - - return ret.drag; - }, + if (__is_6.bool(options.preserveAspectRatio)) { + interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio; + } else if (__is_6.bool(options.square)) { + interactable.options.resize.square = options.square; + } - getAction: function (pointer, event, interaction, element) { - var action = this.defaultActionChecker(pointer, interaction, element); + return interactable; + } - if (this.options.actionChecker) { - return this.options.actionChecker(pointer, event, action, this, element, interaction); - } + if (__is_6.bool(options)) { + interactable.options.resize.enabled = options; + return interactable; + } - return action; - }, + return interactable.options.resize; +} - defaultActionChecker: defaultActionChecker, - - /*\ - * Interactable.actionChecker - [ method ] - * - * Gets or sets the function used to check action to be performed on - * pointerDown - * - - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props. - = (Function | Interactable) The checker function or this Interactable - * - | interact('.resize-drag') - | .resizable(true) - | .draggable(true) - | .actionChecker(function (pointer, event, action, interactable, element, interaction) { - | - | if (interact.matchesSelector(event.target, '.drag-handle') { - | // force drag with handle target - | action.name = drag; - | } - | else { - | // resize from the top and right edges - | action.name = 'resize'; - | action.edges = { top: true, right: true }; - | } - | - | return action; - | }); - \*/ - actionChecker: function (checker) { - if (isFunction(checker)) { - this.options.actionChecker = checker; - - return this; - } +function checkResizeEdge(name, value, page, element, interactableElement, rect, margin) { + // false, '', undefined, null + if (!value) { + return false; + } // true value, use pointer coords and element rect - if (checker === null) { - delete this.options.actionChecker; - return this; - } + if (value === true) { + // if dimensions are negative, "switch" edges + var width = __is_6.number(rect.width) ? rect.width : rect.right - rect.left; + var height = __is_6.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension - return this.options.actionChecker; - }, + margin = Math.min(margin, (name === 'left' || name === 'right' ? width : height) / 2); - /*\ - * Interactable.getRect - [ method ] - * - * The default function to get an Interactables bounding rect. Can be - * overridden using @Interactable.rectChecker. - * - - element (Element) #optional The element to measure. - = (object) The object's bounding rectangle. - o { - o top : 0, - o left : 0, - o bottom: 0, - o right : 0, - o width : 0, - o height: 0 - o } - \*/ - getRect: function rectCheck (element) { - element = element || this._element; - - if (this.selector && !(isElement(element))) { - element = this._context.querySelector(this.selector); - } + if (width < 0) { + if (name === 'left') { + name = 'right'; + } else if (name === 'right') { + name = 'left'; + } + } - return getElementRect(element); - }, + if (height < 0) { + if (name === 'top') { + name = 'bottom'; + } else if (name === 'bottom') { + name = 'top'; + } + } - /*\ - * Interactable.rectChecker - [ method ] - * - * Returns or sets the function used to calculate the interactable's - * element's rectangle - * - - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect - = (function | object) The checker function or this Interactable - \*/ - rectChecker: function (checker) { - if (isFunction(checker)) { - this.getRect = checker; - - return this; - } + if (name === 'left') { + return page.x < (width >= 0 ? rect.left : rect.right) + margin; + } - if (checker === null) { - delete this.options.getRect; + if (name === 'top') { + return page.y < (height >= 0 ? rect.top : rect.bottom) + margin; + } - return this; - } + if (name === 'right') { + return page.x > (width >= 0 ? rect.right : rect.left) - margin; + } - return this.getRect; - }, + if (name === 'bottom') { + return page.y > (height >= 0 ? rect.bottom : rect.top) - margin; + } + } // the remaining checks require an element + + + if (!__is_6.element(element)) { + return false; + } + + return __is_6.element(value) // the value is an element to use as a resize handle + ? value === element // otherwise check if element matches value as selector + : __dom_6.matchesUpTo(element, value, interactableElement); +} + +function initCursors(browser) { + return browser.isIe9 ? { + x: 'e-resize', + y: 's-resize', + xy: 'se-resize', + top: 'n-resize', + left: 'w-resize', + bottom: 's-resize', + right: 'e-resize', + topleft: 'se-resize', + bottomright: 'se-resize', + topright: 'ne-resize', + bottomleft: 'ne-resize' + } : { + x: 'ew-resize', + y: 'ns-resize', + xy: 'nwse-resize', + top: 'ns-resize', + left: 'ew-resize', + bottom: 'ns-resize', + right: 'ew-resize', + topleft: 'nwse-resize', + bottomright: 'nwse-resize', + topright: 'nesw-resize', + bottomleft: 'nesw-resize' + }; +} + +function start(_ref2) { + var iEvent = _ref2.iEvent, + interaction = _ref2.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var startRect = interaction.rect; + var resizeOptions = interaction.interactable.options.resize; + /* + * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge + * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make + * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend + * on the active edges and the edge being interacted with. + */ + + if (resizeOptions.square || resizeOptions.preserveAspectRatio) { + var linkedEdges = (0, ___extend_6["default"])({}, interaction.prepared.edges); + linkedEdges.top = linkedEdges.top || linkedEdges.left && !linkedEdges.bottom; + linkedEdges.left = linkedEdges.left || linkedEdges.top && !linkedEdges.right; + linkedEdges.bottom = linkedEdges.bottom || linkedEdges.right && !linkedEdges.top; + linkedEdges.right = linkedEdges.right || linkedEdges.bottom && !linkedEdges.left; + interaction.prepared._linkedEdges = linkedEdges; + } else { + interaction.prepared._linkedEdges = null; + } // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize + + + if (resizeOptions.preserveAspectRatio) { + interaction.resizeStartAspectRatio = startRect.width / startRect.height; + } + + interaction.resizeRects = { + start: startRect, + current: (0, ___extend_6["default"])({}, startRect), + inverted: (0, ___extend_6["default"])({}, startRect), + previous: (0, ___extend_6["default"])({}, startRect), + delta: { + left: 0, + right: 0, + width: 0, + top: 0, + bottom: 0, + height: 0 + } + }; + iEvent.rect = interaction.resizeRects.inverted; + iEvent.deltaRect = interaction.resizeRects.delta; +} + +function __move_6(_ref3) { + var iEvent = _ref3.iEvent, + interaction = _ref3.interaction; + + if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) { + return; + } + + var resizeOptions = interaction.interactable.options.resize; + var invert = resizeOptions.invert; + var invertible = invert === 'reposition' || invert === 'negate'; + var edges = interaction.prepared.edges; // eslint-disable-next-line no-shadow + + var start = interaction.resizeRects.start; + var current = interaction.resizeRects.current; + var inverted = interaction.resizeRects.inverted; + var deltaRect = interaction.resizeRects.delta; + var previous = (0, ___extend_6["default"])(interaction.resizeRects.previous, inverted); + var originalEdges = edges; + var eventDelta = (0, ___extend_6["default"])({}, iEvent.delta); + + if (resizeOptions.preserveAspectRatio || resizeOptions.square) { + // `resize.preserveAspectRatio` takes precedence over `resize.square` + var startAspectRatio = resizeOptions.preserveAspectRatio ? interaction.resizeStartAspectRatio : 1; + edges = interaction.prepared._linkedEdges; + + if (originalEdges.left && originalEdges.bottom || originalEdges.right && originalEdges.top) { + eventDelta.y = -eventDelta.x / startAspectRatio; + } else if (originalEdges.left || originalEdges.right) { + eventDelta.y = eventDelta.x / startAspectRatio; + } else if (originalEdges.top || originalEdges.bottom) { + eventDelta.x = eventDelta.y * startAspectRatio; + } + } // update the 'current' rect without modifications - /*\ - * Interactable.styleCursor - [ method ] - * - * Returns or sets whether the action that would be performed when the - * mouse on the element are checked on `mousemove` so that the cursor - * may be styled appropriately - * - - newValue (boolean) #optional - = (boolean | Interactable) The current setting or this Interactable - \*/ - styleCursor: function (newValue) { - if (isBool(newValue)) { - this.options.styleCursor = newValue; - - return this; - } - if (newValue === null) { - delete this.options.styleCursor; + if (edges.top) { + current.top += eventDelta.y; + } - return this; - } + if (edges.bottom) { + current.bottom += eventDelta.y; + } - return this.options.styleCursor; - }, + if (edges.left) { + current.left += eventDelta.x; + } - /*\ - * Interactable.preventDefault - [ method ] - * - * Returns or sets whether to prevent the browser's default behaviour - * in response to pointer events. Can be set to: - * - `'always'` to always prevent - * - `'never'` to never prevent - * - `'auto'` to let interact.js try to determine what would be best - * - - newValue (string) #optional `true`, `false` or `'auto'` - = (string | Interactable) The current setting or this Interactable - \*/ - preventDefault: function (newValue) { - if (/^(always|never|auto)$/.test(newValue)) { - this.options.preventDefault = newValue; - return this; - } + if (edges.right) { + current.right += eventDelta.x; + } - if (isBool(newValue)) { - this.options.preventDefault = newValue? 'always' : 'never'; - return this; - } + if (invertible) { + // if invertible, copy the current rect + (0, ___extend_6["default"])(inverted, current); - return this.options.preventDefault; - }, + if (invert === 'reposition') { + // swap edge values if necessary to keep width/height positive + var swap; - /*\ - * Interactable.origin - [ method ] - * - * Gets or sets the origin of the Interactable's element. The x and y - * of the origin will be subtracted from action event coordinates. - * - - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector - * OR - - origin (Element) #optional An HTML or SVG Element whose rect will be used - ** - = (object) The current origin or this Interactable - \*/ - origin: function (newValue) { - if (trySelector(newValue)) { - this.options.origin = newValue; - return this; - } - else if (isObject(newValue)) { - this.options.origin = newValue; - return this; - } + if (inverted.top > inverted.bottom) { + swap = inverted.top; + inverted.top = inverted.bottom; + inverted.bottom = swap; + } - return this.options.origin; - }, + if (inverted.left > inverted.right) { + swap = inverted.left; + inverted.left = inverted.right; + inverted.right = swap; + } + } + } else { + // if not invertible, restrict to minimum of 0x0 rect + inverted.top = Math.min(current.top, start.bottom); + inverted.bottom = Math.max(current.bottom, start.top); + inverted.left = Math.min(current.left, start.right); + inverted.right = Math.max(current.right, start.left); + } + + inverted.width = inverted.right - inverted.left; + inverted.height = inverted.bottom - inverted.top; + + for (var edge in inverted) { + deltaRect[edge] = inverted[edge] - previous[edge]; + } + + iEvent.edges = interaction.prepared.edges; + iEvent.rect = inverted; + iEvent.deltaRect = deltaRect; +} + +function updateEventAxes(_ref4) { + var interaction = _ref4.interaction, + iEvent = _ref4.iEvent, + action = _ref4.action; + + if (action !== 'resize' || !interaction.resizeAxes) { + return; + } + + var options = interaction.interactable.options; + + if (options.resize.square) { + if (interaction.resizeAxes === 'y') { + iEvent.delta.x = iEvent.delta.y; + } else { + iEvent.delta.y = iEvent.delta.x; + } - /*\ - * Interactable.deltaSource - [ method ] - * - * Returns or sets the mouse coordinate types used to calculate the - * movement of the pointer. - * - - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work - = (string | object) The current deltaSource or this Interactable - \*/ - deltaSource: function (newValue) { - if (newValue === 'page' || newValue === 'client') { - this.options.deltaSource = newValue; - - return this; - } + iEvent.axes = 'xy'; + } else { + iEvent.axes = interaction.resizeAxes; - return this.options.deltaSource; - }, + if (interaction.resizeAxes === 'x') { + iEvent.delta.y = 0; + } else if (interaction.resizeAxes === 'y') { + iEvent.delta.x = 0; + } + } +} + +var ___default_6 = resize; +_$resize_6["default"] = ___default_6; + +var _$actions_5 = {}; +"use strict"; + +Object.defineProperty(_$actions_5, "__esModule", { + value: true +}); +_$actions_5.install = __install_5; +Object.defineProperty(_$actions_5, "drag", { + enumerable: true, + get: function get() { + return ___drag_5["default"]; + } +}); +Object.defineProperty(_$actions_5, "drop", { + enumerable: true, + get: function get() { + return _drop["default"]; + } +}); +Object.defineProperty(_$actions_5, "gesture", { + enumerable: true, + get: function get() { + return _gesture["default"]; + } +}); +Object.defineProperty(_$actions_5, "resize", { + enumerable: true, + get: function get() { + return _resize["default"]; + } +}); +_$actions_5.id = void 0; + +var ___drag_5 = ___interopRequireDefault_5(_$drag_1); + +var _drop = ___interopRequireDefault_5(_$drop_3); + +var _gesture = ___interopRequireDefault_5(_$gesture_4); + +var _resize = ___interopRequireDefault_5(_$resize_6); + +function ___interopRequireDefault_5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_5(scope) { + scope.usePlugin(_gesture["default"]); + scope.usePlugin(_resize["default"]); + scope.usePlugin(___drag_5["default"]); + scope.usePlugin(_drop["default"]); +} + +var id = 'actions'; +_$actions_5.id = id; + +var _$autoScroll_7 = {}; +"use strict"; + +Object.defineProperty(_$autoScroll_7, "__esModule", { + value: true +}); +_$autoScroll_7.getContainer = getContainer; +_$autoScroll_7.getScroll = getScroll; +_$autoScroll_7.getScrollSize = getScrollSize; +_$autoScroll_7.getScrollSizeDelta = getScrollSizeDelta; +_$autoScroll_7["default"] = void 0; + +var __domUtils_7 = ___interopRequireWildcard_7(_$domUtils_51); + +var __is_7 = ___interopRequireWildcard_7(_$is_57); + +var ___raf_7 = ___interopRequireDefault_7(_$raf_62); + +/* removed: var _$rect_63 = require("@interactjs/utils/rect"); */; + +/* removed: var _$window_66 = require("@interactjs/utils/window"); */; + +function ___interopRequireDefault_7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_7(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function __install_7(scope) { + var interactions = scope.interactions, + defaults = scope.defaults, + actions = scope.actions; + scope.autoScroll = autoScroll; + + autoScroll.now = function () { + return scope.now(); + }; + + interactions.signals.on('new', function (_ref) { + var interaction = _ref.interaction; + interaction.autoScroll = null; + }); + interactions.signals.on('destroy', function (_ref2) { + var interaction = _ref2.interaction; + interaction.autoScroll = null; + autoScroll.stop(); + + if (autoScroll.interaction) { + autoScroll.interaction = null; + } + }); + interactions.signals.on('stop', autoScroll.stop); + interactions.signals.on('action-move', function (arg) { + return autoScroll.onInteractionMove(arg); + }); + actions.eventTypes.push('autoscroll'); + defaults.perAction.autoScroll = autoScroll.defaults; +} + +var autoScroll = { + defaults: { + enabled: false, + margin: 60, + // the item that is scrolled (Window or HTMLElement) + container: null, + // the scroll speed in pixels per second + speed: 300 + }, + now: Date.now, + interaction: null, + i: null, + x: 0, + y: 0, + isScrolling: false, + prevTime: 0, + margin: 0, + speed: 0, + start: function start(interaction) { + autoScroll.isScrolling = true; + + ___raf_7["default"].cancel(autoScroll.i); + + interaction.autoScroll = autoScroll; + autoScroll.interaction = interaction; + autoScroll.prevTime = autoScroll.now(); + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + }, + stop: function stop() { + autoScroll.isScrolling = false; + + if (autoScroll.interaction) { + autoScroll.interaction.autoScroll = null; + } - /*\ - * Interactable.restrict - [ method ] - ** - * Deprecated. Add a `restrict` property to the options object passed to - * @Interactable.draggable, @Interactable.resizable or @Interactable.gesturable instead. - * - * Returns or sets the rectangles within which actions on this - * interactable (after snap calculations) are restricted. By default, - * restricting is relative to the pointer coordinates. You can change - * this by setting the - * [`elementRect`](https://github.com/taye/interact.js/pull/72). - ** - - options (object) #optional an object with keys drag, resize, and/or gesture whose values are rects, Elements, CSS selectors, or 'parent' or 'self' - = (object) The current restrictions object or this Interactable - ** - | interact(element).restrict({ - | // the rect will be `interact.getElementRect(element.parentNode)` - | drag: element.parentNode, - | - | // x and y are relative to the the interactable's origin - | resize: { x: 100, y: 100, width: 200, height: 200 } - | }) - | - | interact('.draggable').restrict({ - | // the rect will be the selected element's parent - | drag: 'parent', - | - | // do not restrict during normal movement. - | // Instead, trigger only one restricted move event - | // immediately before the end event. - | endOnly: true, - | - | // https://github.com/taye/interact.js/pull/72#issue-41813493 - | elementRect: { top: 0, left: 0, bottom: 1, right: 1 } - | }); - \*/ - restrict: function (options) { - if (!isObject(options)) { - return this.setOptions('restrict', options); - } + ___raf_7["default"].cancel(autoScroll.i); + }, + // scroll the window by the values in scroll.x/y + scroll: function scroll() { + var interaction = autoScroll.interaction; + var interactable = interaction.interactable, + element = interaction.element; + var options = interactable.options[autoScroll.interaction.prepared.name].autoScroll; + var container = getContainer(options.container, interactable, element); + var now = autoScroll.now(); // change in time in seconds + + var dt = (now - autoScroll.prevTime) / 1000; // displacement + + var s = options.speed * dt; + + if (s >= 1) { + var scrollBy = { + x: autoScroll.x * s, + y: autoScroll.y * s + }; + + if (scrollBy.x || scrollBy.y) { + var prevScroll = getScroll(container); + + if (__is_7.window(container)) { + container.scrollBy(scrollBy.x, scrollBy.y); + } else if (container) { + container.scrollLeft += scrollBy.x; + container.scrollTop += scrollBy.y; + } - var actions = ['drag', 'resize', 'gesture'], - ret; + var curScroll = getScroll(container); + var delta = { + x: curScroll.x - prevScroll.x, + y: curScroll.y - prevScroll.y + }; - for (var i = 0; i < actions.length; i++) { - var action = actions[i]; + if (delta.x || delta.y) { + interactable.fire({ + type: 'autoscroll', + target: element, + interactable: interactable, + delta: delta, + interaction: interaction, + container: container + }); + } + } - if (action in options) { - var perAction = extend({ - actions: [action], - restriction: options[action] - }, options); + autoScroll.prevTime = now; + } - ret = this.setOptions('restrict', perAction); - } - } + if (autoScroll.isScrolling) { + ___raf_7["default"].cancel(autoScroll.i); - return ret; - }, + autoScroll.i = ___raf_7["default"].request(autoScroll.scroll); + } + }, + check: function check(interactable, actionName) { + var options = interactable.options; + return options[actionName].autoScroll && options[actionName].autoScroll.enabled; + }, + onInteractionMove: function onInteractionMove(_ref3) { + var interaction = _ref3.interaction, + pointer = _ref3.pointer; + + if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) { + return; + } - /*\ - * Interactable.context - [ method ] - * - * Gets the selector context Node of the Interactable. The default is `window.document`. - * - = (Node) The context Node of this Interactable - ** - \*/ - context: function () { - return this._context; - }, + if (interaction.simulation) { + autoScroll.x = autoScroll.y = 0; + return; + } - _context: document, - - /*\ - * Interactable.ignoreFrom - [ method ] - * - * If the target of the `mousedown`, `pointerdown` or `touchstart` - * event or any of it's parents match the given CSS selector or - * Element, no drag/resize/gesture is started. - * - - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements - = (string | Element | object) The current ignoreFrom value or this Interactable - ** - | interact(element, { ignoreFrom: document.getElementById('no-action') }); - | // or - | interact(element).ignoreFrom('input, textarea, a'); - \*/ - ignoreFrom: function (newValue) { - if (trySelector(newValue)) { // CSS selector to match event.target - this.options.ignoreFrom = newValue; - return this; - } + var top; + var right; + var bottom; + var left; + var interactable = interaction.interactable, + element = interaction.element; + var options = interactable.options[interaction.prepared.name].autoScroll; + var container = getContainer(options.container, interactable, element); + + if (__is_7.window(container)) { + left = pointer.clientX < autoScroll.margin; + top = pointer.clientY < autoScroll.margin; + right = pointer.clientX > container.innerWidth - autoScroll.margin; + bottom = pointer.clientY > container.innerHeight - autoScroll.margin; + } else { + var rect = __domUtils_7.getElementClientRect(container); + left = pointer.clientX < rect.left + autoScroll.margin; + top = pointer.clientY < rect.top + autoScroll.margin; + right = pointer.clientX > rect.right - autoScroll.margin; + bottom = pointer.clientY > rect.bottom - autoScroll.margin; + } - if (isElement(newValue)) { // specific element - this.options.ignoreFrom = newValue; - return this; - } + autoScroll.x = right ? 1 : left ? -1 : 0; + autoScroll.y = bottom ? 1 : top ? -1 : 0; - return this.options.ignoreFrom; - }, + if (!autoScroll.isScrolling) { + // set the autoScroll properties to those of the target + autoScroll.margin = options.margin; + autoScroll.speed = options.speed; + autoScroll.start(interaction); + } + } +}; + +function getContainer(value, interactable, element) { + return (__is_7.string(value) ? (0, _$rect_63.getStringOptionResult)(value, interactable, element) : value) || (0, _$window_66.getWindow)(element); +} + +function getScroll(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollLeft, + y: container.scrollTop + }; +} + +function getScrollSize(container) { + if (__is_7.window(container)) { + container = window.document.body; + } + + return { + x: container.scrollWidth, + y: container.scrollHeight + }; +} + +function getScrollSizeDelta(_ref4, func) { + var interaction = _ref4.interaction, + element = _ref4.element; + var scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll; + + if (!scrollOptions || !scrollOptions.enabled) { + func(); + return { + x: 0, + y: 0 + }; + } + + var scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element); + var prevSize = getScroll(scrollContainer); + func(); + var curSize = getScroll(scrollContainer); + return { + x: curSize.x - prevSize.x, + y: curSize.y - prevSize.y + }; +} + +var ___default_7 = { + id: 'auto-scroll', + install: __install_7 +}; +_$autoScroll_7["default"] = ___default_7; + +var _$InteractableMethods_8 = {}; +"use strict"; + +Object.defineProperty(_$InteractableMethods_8, "__esModule", { + value: true +}); +_$InteractableMethods_8["default"] = void 0; + +/* removed: var _$utils_56 = require("@interactjs/utils"); */; + +var __is_8 = ___interopRequireWildcard_8(_$is_57); + +function ___interopRequireWildcard_8(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function __install_8(scope) { + var Interactable = scope.Interactable, + actions = scope.actions; + Interactable.prototype.getAction = getAction; + /** + * ```js + * interact(element, { ignoreFrom: document.getElementById('no-action') }) + * // or + * interact(element).ignoreFrom('input, textarea, a') + * ``` + * @deprecated + * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any + * of it's parents match the given CSS selector or Element, no + * drag/resize/gesture is started. + * + * Don't use this method. Instead set the `ignoreFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .draggable({ + * ignoreFrom: 'input, textarea, a[href]'', + * }) + * .pointerEvents({ + * ignoreFrom: '[no-pointer]', + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to not ignore any elements + * @return {string | Element | object} The current ignoreFrom value or this + * Interactable + */ + + Interactable.prototype.ignoreFrom = (0, _$utils_56.warnOnce)(function (newValue) { + return this._backCompatOption('ignoreFrom', newValue); + }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).'); + /** + * @deprecated + * + * A drag/resize/gesture is started only If the target of the `mousedown`, + * `pointerdown` or `touchstart` event or any of it's parents match the given + * CSS selector or Element. + * + * Don't use this method. Instead set the `allowFrom` option for each action + * or for `pointerEvents` + * + * @example + * interact(targett) + * .resizable({ + * allowFrom: '.resize-handle', + * .pointerEvents({ + * allowFrom: '.handle',, + * }) + * + * @param {string | Element | null} [newValue] a CSS selector string, an + * Element or `null` to allow from any element + * @return {string | Element | object} The current allowFrom value or this + * Interactable + */ + + Interactable.prototype.allowFrom = (0, _$utils_56.warnOnce)(function (newValue) { + return this._backCompatOption('allowFrom', newValue); + }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).'); + /** + * ```js + * interact('.resize-drag') + * .resizable(true) + * .draggable(true) + * .actionChecker(function (pointer, event, action, interactable, element, interaction) { + * + * if (interact.matchesSelector(event.target, '.drag-handle')) { + * // force drag with handle target + * action.name = drag + * } + * else { + * // resize from the top and right edges + * action.name = 'resize' + * action.edges = { top: true, right: true } + * } + * + * return action + * }) + * ``` + * + * Returns or sets the function used to check action to be performed on + * pointerDown + * + * @param {function | null} [checker] A function which takes a pointer event, + * defaultAction string, interactable, element and interaction as parameters + * and returns an object with name property 'drag' 'resize' or 'gesture' and + * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right + * props. + * @return {Function | Interactable} The checker function or this Interactable + */ + + Interactable.prototype.actionChecker = actionChecker; + /** + * Returns or sets whether the the cursor should be changed depending on the + * action that would be performed if the mouse were pressed and dragged. + * + * @param {boolean} [newValue] + * @return {boolean | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.styleCursor = styleCursor; + + Interactable.prototype.defaultActionChecker = function (pointer, event, interaction, element) { + return defaultActionChecker(this, pointer, event, interaction, element, actions); + }; +} + +function getAction(pointer, event, interaction, element) { + var action = this.defaultActionChecker(pointer, event, interaction, element); + + if (this.options.actionChecker) { + return this.options.actionChecker(pointer, event, action, this, element, interaction); + } + + return action; +} + +function defaultActionChecker(interactable, pointer, event, interaction, element, actions) { + var rect = interactable.getRect(element); + var buttons = event.buttons || { + 0: 1, + 1: 4, + 3: 8, + 4: 16 + }[event.button]; + var action = null; + + for (var _i = 0; _i < actions.names.length; _i++) { + var _ref; + + _ref = actions.names[_i]; + var actionName = _ref; + + // check mouseButton setting if the pointer is down + if (interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options[actionName].mouseButtons) === 0) { + continue; + } - /*\ - * Interactable.allowFrom - [ method ] - * - * A drag/resize/gesture is started only If the target of the - * `mousedown`, `pointerdown` or `touchstart` event or any of it's - * parents match the given CSS selector or Element. - * - - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element - = (string | Element | object) The current allowFrom value or this Interactable - ** - | interact(element, { allowFrom: document.getElementById('drag-handle') }); - | // or - | interact(element).allowFrom('.handle'); - \*/ - allowFrom: function (newValue) { - if (trySelector(newValue)) { // CSS selector to match event.target - this.options.allowFrom = newValue; - return this; - } + action = actions[actionName].checker(pointer, event, interactable, element, interaction, rect); - if (isElement(newValue)) { // specific element - this.options.allowFrom = newValue; - return this; - } + if (action) { + return action; + } + } +} - return this.options.allowFrom; - }, +function styleCursor(newValue) { + if (__is_8.bool(newValue)) { + this.options.styleCursor = newValue; + return this; + } - /*\ - * Interactable.element - [ method ] - * - * If this is not a selector Interactable, it returns the element this - * interactable represents - * - = (Element) HTML / SVG Element - \*/ - element: function () { - return this._element; - }, + if (newValue === null) { + delete this.options.styleCursor; + return this; + } - /*\ - * Interactable.fire - [ method ] - * - * Calls listeners for the given InteractEvent type bound globally - * and directly to this Interactable - * - - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable - = (Interactable) this Interactable - \*/ - fire: function (iEvent) { - if (!(iEvent && iEvent.type) || !contains(eventTypes, iEvent.type)) { - return this; - } + return this.options.styleCursor; +} - var listeners, - i, - len, - onEvent = 'on' + iEvent.type, - funcName = ''; +function actionChecker(checker) { + if (__is_8.func(checker)) { + this.options.actionChecker = checker; + return this; + } - // Interactable#on() listeners - if (iEvent.type in this._iEvents) { - listeners = this._iEvents[iEvent.type]; + if (checker === null) { + delete this.options.actionChecker; + return this; + } - for (i = 0, len = listeners.length; i < len && !iEvent.immediatePropagationStopped; i++) { - funcName = listeners[i].name; - listeners[i](iEvent); - } - } + return this.options.actionChecker; +} - // interactable.onevent listener - if (isFunction(this[onEvent])) { - funcName = this[onEvent].name; - this[onEvent](iEvent); - } +var ___default_8 = { + id: 'auto-start/interactableMethods', + install: __install_8 +}; +_$InteractableMethods_8["default"] = ___default_8; - // interact.on() listeners - if (iEvent.type in globalEvents && (listeners = globalEvents[iEvent.type])) { +var _$base_9 = {}; +"use strict"; - for (i = 0, len = listeners.length; i < len && !iEvent.immediatePropagationStopped; i++) { - funcName = listeners[i].name; - listeners[i](iEvent); - } - } +Object.defineProperty(_$base_9, "__esModule", { + value: true +}); +_$base_9["default"] = void 0; - return this; - }, +var __utils_9 = ___interopRequireWildcard_9(_$utils_56); - /*\ - * Interactable.on - [ method ] - * - * Binds a listener for an InteractEvent or DOM event. - * - - eventType (string | array | object) The types of events to listen for - - listener (function) The function to be called on the given event(s) - - useCapture (boolean) #optional useCapture flag for addEventListener - = (object) This Interactable - \*/ - on: function (eventType, listener, useCapture) { - var i; - - if (isString(eventType) && eventType.search(' ') !== -1) { - eventType = eventType.trim().split(/ +/); - } +var _InteractableMethods = ___interopRequireDefault_9(_$InteractableMethods_8); - if (isArray(eventType)) { - for (i = 0; i < eventType.length; i++) { - this.on(eventType[i], listener, useCapture); - } +function ___interopRequireDefault_9(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - return this; - } +function ___interopRequireWildcard_9(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - if (isObject(eventType)) { - for (var prop in eventType) { - this.on(prop, eventType[prop], listener); - } +function __install_9(scope) { + var interact = scope.interact, + interactions = scope.interactions, + defaults = scope.defaults; + scope.usePlugin(_InteractableMethods["default"]); // set cursor style on mousedown - return this; - } + interactions.signals.on('down', function (_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget; - if (eventType === 'wheel') { - eventType = wheelEvent; - } + if (interaction.interacting()) { + return; + } - // convert to boolean - useCapture = useCapture? true: false; - - if (contains(eventTypes, eventType)) { - // if this type of event was never bound to this Interactable - if (!(eventType in this._iEvents)) { - this._iEvents[eventType] = [listener]; - } - else { - this._iEvents[eventType].push(listener); - } - } - // delegated event for selector - else if (this.selector) { - if (!delegatedEvents[eventType]) { - delegatedEvents[eventType] = { - selectors: [], - contexts : [], - listeners: [] - }; - - // add delegate listener functions - for (i = 0; i < documents.length; i++) { - events.add(documents[i], eventType, delegateListener); - events.add(documents[i], eventType, delegateUseCapture, true); - } - } - - var delegated = delegatedEvents[eventType], - index; - - for (index = delegated.selectors.length - 1; index >= 0; index--) { - if (delegated.selectors[index] === this.selector - && delegated.contexts[index] === this._context) { - break; - } - } - - if (index === -1) { - index = delegated.selectors.length; - - delegated.selectors.push(this.selector); - delegated.contexts .push(this._context); - delegated.listeners.push([]); - } - - // keep listener and useCapture flag - delegated.listeners[index].push([listener, useCapture]); - } - else { - events.add(this._element, eventType, listener, useCapture); - } + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); + }); // set cursor style on mousemove - return this; - }, + interactions.signals.on('move', function (_ref2) { + var interaction = _ref2.interaction, + pointer = _ref2.pointer, + event = _ref2.event, + eventTarget = _ref2.eventTarget; - /*\ - * Interactable.off - [ method ] - * - * Removes an InteractEvent or DOM event listener - * - - eventType (string | array | object) The types of events that were listened for - - listener (function) The listener function to be removed - - useCapture (boolean) #optional useCapture flag for removeEventListener - = (object) This Interactable - \*/ - off: function (eventType, listener, useCapture) { - var i; - - if (isString(eventType) && eventType.search(' ') !== -1) { - eventType = eventType.trim().split(/ +/); - } + if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) { + return; + } - if (isArray(eventType)) { - for (i = 0; i < eventType.length; i++) { - this.off(eventType[i], listener, useCapture); - } + var actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope); + prepare(interaction, actionInfo, scope); + }); + interactions.signals.on('move', function (arg) { + var interaction = arg.interaction; - return this; - } + if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) { + return; + } - if (isObject(eventType)) { - for (var prop in eventType) { - this.off(prop, eventType[prop], listener); - } + scope.autoStart.signals.fire('before-start', arg); + var interactable = interaction.interactable; - return this; - } + if (interaction.prepared.name && interactable) { + // check manualStart and interaction limit + if (interactable.options[interaction.prepared.name].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) { + interaction.stop(); + } else { + interaction.start(interaction.prepared, interactable, interaction.element); + } + } + }); + interactions.signals.on('stop', function (_ref3) { + var interaction = _ref3.interaction; + var interactable = interaction.interactable; - var eventList, - index = -1; + if (interactable && interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } + }); + defaults.base.actionChecker = null; + defaults.base.styleCursor = true; + __utils_9.extend(defaults.perAction, { + manualStart: false, + max: Infinity, + maxPerElement: 1, + allowFrom: null, + ignoreFrom: null, + // only allow left button by default + // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value + mouseButtons: 1 + }); + /** + * Returns or sets the maximum number of concurrent interactions allowed. By + * default only 1 interaction is allowed at a time (for backwards + * compatibility). To allow multiple interactions on the same Interactables and + * elements, you need to enable it in the draggable, resizable and gesturable + * `'max'` and `'maxPerElement'` options. + * + * @alias module:interact.maxInteractions + * + * @param {number} [newValue] Any number. newValue <= 0 means no interactions. + */ + + interact.maxInteractions = function (newValue) { + return maxInteractions(newValue, scope); + }; + + scope.autoStart = { + // Allow this many interactions to happen simultaneously + maxInteractions: Infinity, + withinInteractionLimit: withinInteractionLimit, + cursorElement: null, + signals: new __utils_9.Signals() + }; +} // Check if the current interactable supports the action. +// If so, return the validated action. Otherwise, return null + + +function validateAction(action, interactable, element, eventTarget, scope) { + if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) { + return action; + } + + return null; +} + +function validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) { + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var matchElement = matchElements[i]; + var matchAction = match.getAction(pointer, event, interaction, matchElement); + + if (!matchAction) { + continue; + } - // convert to boolean - useCapture = useCapture? true: false; + var action = validateAction(matchAction, match, matchElement, eventTarget, scope); - if (eventType === 'wheel') { - eventType = wheelEvent; - } + if (action) { + return { + action: action, + interactable: match, + element: matchElement + }; + } + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function getActionInfo(interaction, pointer, event, eventTarget, scope) { + var matches = []; + var matchElements = []; + var element = eventTarget; + + function pushMatches(interactable) { + matches.push(interactable); + matchElements.push(element); + } + + while (__utils_9.is.element(element)) { + matches = []; + matchElements = []; + scope.interactables.forEachMatch(element, pushMatches); + var actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope); + + if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) { + return actionInfo; + } - // if it is an action event type - if (contains(eventTypes, eventType)) { - eventList = this._iEvents[eventType]; + element = __utils_9.dom.parentNode(element); + } + + return { + action: null, + interactable: null, + element: null + }; +} + +function prepare(interaction, _ref4, scope) { + var action = _ref4.action, + interactable = _ref4.interactable, + element = _ref4.element; + action = action || {}; + + if (interaction.interactable && interaction.interactable.options.styleCursor) { + setCursor(interaction.element, '', scope); + } + + interaction.interactable = interactable; + interaction.element = element; + __utils_9.copyAction(interaction.prepared, action); + interaction.rect = interactable && action.name ? interactable.getRect(element) : null; + + if (interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor) { + var cursor = ''; + + if (action) { + var cursorChecker = interactable.options[action.name].cursorChecker; + + if (__utils_9.is.func(cursorChecker)) { + cursor = cursorChecker(action, interactable, element); + } else { + cursor = scope.actions[action.name].getCursor(action); + } + } - if (eventList && (index = indexOf(eventList, listener)) !== -1) { - this._iEvents[eventType].splice(index, 1); - } - } - // delegated event - else if (this.selector) { - var delegated = delegatedEvents[eventType], - matchFound = false; - - if (!delegated) { return this; } - - // count from last index of delegated to 0 - for (index = delegated.selectors.length - 1; index >= 0; index--) { - // look for matching selector and context Node - if (delegated.selectors[index] === this.selector - && delegated.contexts[index] === this._context) { - - var listeners = delegated.listeners[index]; - - // each item of the listeners array is an array: [function, useCaptureFlag] - for (i = listeners.length - 1; i >= 0; i--) { - var fn = listeners[i][0], - useCap = listeners[i][1]; - - // check if the listener functions and useCapture flags match - if (fn === listener && useCap === useCapture) { - // remove the listener from the array of listeners - listeners.splice(i, 1); - - // if all listeners for this interactable have been removed - // remove the interactable from the delegated arrays - if (!listeners.length) { - delegated.selectors.splice(index, 1); - delegated.contexts .splice(index, 1); - delegated.listeners.splice(index, 1); - - // remove delegate function from context - events.remove(this._context, eventType, delegateListener); - events.remove(this._context, eventType, delegateUseCapture, true); - - // remove the arrays if they are empty - if (!delegated.selectors.length) { - delegatedEvents[eventType] = null; - } - } - - // only remove one listener - matchFound = true; - break; - } - } - - if (matchFound) { break; } - } - } - } - // remove listener from this Interatable's element - else { - events.remove(this._element, eventType, listener, useCapture); - } + setCursor(interaction.element, cursor || '', scope); + } - return this; - }, + scope.autoStart.signals.fire('prepared', { + interaction: interaction + }); +} - /*\ - * Interactable.set - [ method ] - * - * Reset the options of this Interactable - - options (object) The new settings to apply - = (object) This Interactable - \*/ - set: function (options) { - if (!isObject(options)) { - options = {}; - } +function withinInteractionLimit(interactable, element, action, scope) { + var options = interactable.options; + var maxActions = options[action.name].max; + var maxPerElement = options[action.name].maxPerElement; + var autoStartMax = scope.autoStart.maxInteractions; + var activeInteractions = 0; + var interactableCount = 0; + var elementCount = 0; // no actions if any of these values == 0 - this.options = extend({}, defaultOptions.base); + if (!(maxActions && maxPerElement && autoStartMax)) { + return false; + } - var i, - actions = ['drag', 'drop', 'resize', 'gesture'], - methods = ['draggable', 'dropzone', 'resizable', 'gesturable'], - perActions = extend(extend({}, defaultOptions.perAction), options[action] || {}); + for (var _i = 0; _i < scope.interactions.list.length; _i++) { + var _ref5; - for (i = 0; i < actions.length; i++) { - var action = actions[i]; + _ref5 = scope.interactions.list[_i]; + var interaction = _ref5; + var otherAction = interaction.prepared.name; - this.options[action] = extend({}, defaultOptions[action]); + if (!interaction.interacting()) { + continue; + } - this.setPerAction(action, perActions); + activeInteractions++; - this[methods[i]](options[action]); - } + if (activeInteractions >= autoStartMax) { + return false; + } - var settings = [ - 'accept', 'actionChecker', 'allowFrom', 'deltaSource', - 'dropChecker', 'ignoreFrom', 'origin', 'preventDefault', - 'rectChecker', 'styleCursor' - ]; + if (interaction.interactable !== interactable) { + continue; + } - for (i = 0, len = settings.length; i < len; i++) { - var setting = settings[i]; + interactableCount += otherAction === action.name ? 1 : 0; - this.options[setting] = defaultOptions.base[setting]; + if (interactableCount >= maxActions) { + return false; + } - if (setting in options) { - this[setting](options[setting]); - } - } + if (interaction.element === element) { + elementCount++; - return this; - }, + if (otherAction === action.name && elementCount >= maxPerElement) { + return false; + } + } + } - /*\ - * Interactable.unset - [ method ] - * - * Remove this interactable from the list of interactables and remove - * it's drag, drop, resize and gesture capabilities - * - = (object) @interact - \*/ - unset: function () { - events.remove(this._element, 'all'); - - if (!isString(this.selector)) { - events.remove(this, 'all'); - if (this.options.styleCursor) { - this._element.style.cursor = ''; - } - } - else { - // remove delegated events - for (var type in delegatedEvents) { - var delegated = delegatedEvents[type]; - - for (var i = 0; i < delegated.selectors.length; i++) { - if (delegated.selectors[i] === this.selector - && delegated.contexts[i] === this._context) { - - delegated.selectors.splice(i, 1); - delegated.contexts .splice(i, 1); - delegated.listeners.splice(i, 1); - - // remove the arrays if they are empty - if (!delegated.selectors.length) { - delegatedEvents[type] = null; - } - } - - events.remove(this._context, type, delegateListener); - events.remove(this._context, type, delegateUseCapture, true); - - break; - } - } - } + return autoStartMax > 0; +} - this.dropzone(false); +function maxInteractions(newValue, scope) { + if (__utils_9.is.number(newValue)) { + scope.autoStart.maxInteractions = newValue; + return this; + } - interactables.splice(indexOf(interactables, this), 1); + return scope.autoStart.maxInteractions; +} - return interact; - } - }; +function setCursor(element, cursor, scope) { + if (scope.autoStart.cursorElement) { + scope.autoStart.cursorElement.style.cursor = ''; + } - function warnOnce (method, message) { - var warned = false; + element.ownerDocument.documentElement.style.cursor = cursor; + element.style.cursor = cursor; + scope.autoStart.cursorElement = cursor ? element : null; +} - return function () { - if (!warned) { - window.console.warn(message); - warned = true; - } +var ___default_9 = { + id: 'auto-start/base', + install: __install_9, + maxInteractions: maxInteractions, + withinInteractionLimit: withinInteractionLimit, + validateAction: validateAction +}; +_$base_9["default"] = ___default_9; - return method.apply(this, arguments); - }; - } +var _$dragAxis_10 = {}; +"use strict"; - Interactable.prototype.snap = warnOnce(Interactable.prototype.snap, - 'Interactable#snap is deprecated. See the new documentation for snapping at http://interactjs.io/docs/snapping'); - Interactable.prototype.restrict = warnOnce(Interactable.prototype.restrict, - 'Interactable#restrict is deprecated. See the new documentation for resticting at http://interactjs.io/docs/restriction'); - Interactable.prototype.inertia = warnOnce(Interactable.prototype.inertia, - 'Interactable#inertia is deprecated. See the new documentation for inertia at http://interactjs.io/docs/inertia'); - Interactable.prototype.autoScroll = warnOnce(Interactable.prototype.autoScroll, - 'Interactable#autoScroll is deprecated. See the new documentation for autoScroll at http://interactjs.io/docs/#autoscroll'); - Interactable.prototype.squareResize = warnOnce(Interactable.prototype.squareResize, - 'Interactable#squareResize is deprecated. See http://interactjs.io/docs/#resize-square'); - - Interactable.prototype.accept = warnOnce(Interactable.prototype.accept, - 'Interactable#accept is deprecated. use Interactable#dropzone({ accept: target }) instead'); - Interactable.prototype.dropChecker = warnOnce(Interactable.prototype.dropChecker, - 'Interactable#dropChecker is deprecated. use Interactable#dropzone({ dropChecker: checkerFunction }) instead'); - Interactable.prototype.context = warnOnce(Interactable.prototype.context, - 'Interactable#context as a method is deprecated. It will soon be a DOM Node instead'); - - /*\ - * interact.isSet - [ method ] - * - * Check if an element has been set - - element (Element) The Element being searched for - = (boolean) Indicates if the element or CSS selector was previously passed to interact - \*/ - interact.isSet = function(element, options) { - return interactables.indexOfElement(element, options && options.context) !== -1; - }; +Object.defineProperty(_$dragAxis_10, "__esModule", { + value: true +}); +_$dragAxis_10["default"] = void 0; - /*\ - * interact.on - [ method ] - * - * Adds a global listener for an InteractEvent or adds a DOM event to - * `document` - * - - type (string | array | object) The types of events to listen for - - listener (function) The function to be called on the given event(s) - - useCapture (boolean) #optional useCapture flag for addEventListener - = (object) interact - \*/ - interact.on = function (type, listener, useCapture) { - if (isString(type) && type.search(' ') !== -1) { - type = type.trim().split(/ +/); - } +var ___scope_10 = _$scope_24({}); - if (isArray(type)) { - for (var i = 0; i < type.length; i++) { - interact.on(type[i], listener, useCapture); - } +/* removed: var _$domUtils_51 = require("@interactjs/utils/domUtils"); */; - return interact; - } +var __is_10 = ___interopRequireWildcard_10(_$is_57); - if (isObject(type)) { - for (var prop in type) { - interact.on(prop, type[prop], listener); - } +var _base = ___interopRequireDefault_10(_$base_9); - return interact; - } +function ___interopRequireDefault_10(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - // if it is an InteractEvent type, add listener to globalEvents - if (contains(eventTypes, type)) { - // if this type of event was never bound - if (!globalEvents[type]) { - globalEvents[type] = [listener]; - } - else { - globalEvents[type].push(listener); - } - } - // If non InteractEvent type, addEventListener to document - else { - events.add(document, type, listener, useCapture); - } +function ___interopRequireWildcard_10(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } - return interact; - }; +function __install_10(scope) { + scope.autoStart.signals.on('before-start', function (_ref) { + var interaction = _ref.interaction, + eventTarget = _ref.eventTarget, + dx = _ref.dx, + dy = _ref.dy; - /*\ - * interact.off - [ method ] - * - * Removes a global InteractEvent listener or DOM event from `document` - * - - type (string | array | object) The types of events that were listened for - - listener (function) The listener function to be removed - - useCapture (boolean) #optional useCapture flag for removeEventListener - = (object) interact - \*/ - interact.off = function (type, listener, useCapture) { - if (isString(type) && type.search(' ') !== -1) { - type = type.trim().split(/ +/); - } + if (interaction.prepared.name !== 'drag') { + return; + } // check if a drag is in the correct axis - if (isArray(type)) { - for (var i = 0; i < type.length; i++) { - interact.off(type[i], listener, useCapture); - } - return interact; - } + var absX = Math.abs(dx); + var absY = Math.abs(dy); + var targetOptions = interaction.interactable.options.drag; + var startAxis = targetOptions.startAxis; + var currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy'; + interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy' + : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable - if (isObject(type)) { - for (var prop in type) { - interact.off(prop, type[prop], listener); - } + if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) { + // cancel the prepared action + interaction.prepared.name = null; // then try to get a drag from another ineractable - return interact; - } + var element = eventTarget; - if (!contains(eventTypes, type)) { - events.remove(document, type, listener, useCapture); + var getDraggable = function getDraggable(interactable) { + if (interactable === interaction.interactable) { + return; } - else { - var index; - if (type in globalEvents - && (index = indexOf(globalEvents[type], listener)) !== -1) { - globalEvents[type].splice(index, 1); - } - } + var options = interaction.interactable.options.drag; - return interact; - }; + if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) { + var action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element); - /*\ - * interact.enableDragging - [ method ] - * - * Deprecated. - * - * Returns or sets whether dragging is enabled for any Interactables - * - - newValue (boolean) #optional `true` to allow the action; `false` to disable action for all Interactables - = (boolean | object) The current setting or interact - \*/ - interact.enableDragging = warnOnce(function (newValue) { - if (newValue !== null && newValue !== undefined) { - actionIsEnabled.drag = newValue; - - return interact; + if (action && action.name === ___scope_10.ActionName.Drag && checkStartAxis(currentAxis, interactable) && _base["default"].validateAction(action, interactable, element, eventTarget, scope)) { + return interactable; + } } - return actionIsEnabled.drag; - }, 'interact.enableDragging is deprecated and will soon be removed.'); + }; // check all interactables - /*\ - * interact.enableResizing - [ method ] - * - * Deprecated. - * - * Returns or sets whether resizing is enabled for any Interactables - * - - newValue (boolean) #optional `true` to allow the action; `false` to disable action for all Interactables - = (boolean | object) The current setting or interact - \*/ - interact.enableResizing = warnOnce(function (newValue) { - if (newValue !== null && newValue !== undefined) { - actionIsEnabled.resize = newValue; - - return interact; - } - return actionIsEnabled.resize; - }, 'interact.enableResizing is deprecated and will soon be removed.'); - /*\ - * interact.enableGesturing - [ method ] - * - * Deprecated. - * - * Returns or sets whether gesturing is enabled for any Interactables - * - - newValue (boolean) #optional `true` to allow the action; `false` to disable action for all Interactables - = (boolean | object) The current setting or interact - \*/ - interact.enableGesturing = warnOnce(function (newValue) { - if (newValue !== null && newValue !== undefined) { - actionIsEnabled.gesture = newValue; - - return interact; + while (__is_10.element(element)) { + var interactable = scope.interactables.forEachMatch(element, getDraggable); + + if (interactable) { + interaction.prepared.name = ___scope_10.ActionName.Drag; + interaction.interactable = interactable; + interaction.element = element; + break; } - return actionIsEnabled.gesture; - }, 'interact.enableGesturing is deprecated and will soon be removed.'); - interact.eventTypes = eventTypes; + element = (0, _$domUtils_51.parentNode)(element); + } + } + }); - /*\ - * interact.debug - [ method ] - * - * Returns debugging data - = (object) An object with properties that outline the current state and expose internal functions and variables - \*/ - interact.debug = function () { - var interaction = interactions[0] || new Interaction(); - - return { - interactions : interactions, - target : interaction.target, - dragging : interaction.dragging, - resizing : interaction.resizing, - gesturing : interaction.gesturing, - prepared : interaction.prepared, - matches : interaction.matches, - matchElements : interaction.matchElements, - - prevCoords : interaction.prevCoords, - startCoords : interaction.startCoords, - - pointerIds : interaction.pointerIds, - pointers : interaction.pointers, - addPointer : listeners.addPointer, - removePointer : listeners.removePointer, - recordPointer : listeners.recordPointer, - - snap : interaction.snapStatus, - restrict : interaction.restrictStatus, - inertia : interaction.inertiaStatus, - - downTime : interaction.downTimes[0], - downEvent : interaction.downEvent, - downPointer : interaction.downPointer, - prevEvent : interaction.prevEvent, - - Interactable : Interactable, - interactables : interactables, - pointerIsDown : interaction.pointerIsDown, - defaultOptions : defaultOptions, - defaultActionChecker : defaultActionChecker, - - actionCursors : actionCursors, - dragMove : listeners.dragMove, - resizeMove : listeners.resizeMove, - gestureMove : listeners.gestureMove, - pointerUp : listeners.pointerUp, - pointerDown : listeners.pointerDown, - pointerMove : listeners.pointerMove, - pointerHover : listeners.pointerHover, - - eventTypes : eventTypes, - - events : events, - globalEvents : globalEvents, - delegatedEvents : delegatedEvents, - - prefixedPropREs : prefixedPropREs - }; - }; + function checkStartAxis(startAxis, interactable) { + if (!interactable) { + return false; + } - // expose the functions used to calculate multi-touch properties - interact.getPointerAverage = pointerAverage; - interact.getTouchBBox = touchBBox; - interact.getTouchDistance = touchDistance; - interact.getTouchAngle = touchAngle; + var thisAxis = interactable.options[___scope_10.ActionName.Drag].startAxis; + return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis; + } +} + +var ___default_10 = { + id: 'auto-start/dragAxis', + install: __install_10 +}; +_$dragAxis_10["default"] = ___default_10; + +var _$hold_11 = {}; +"use strict"; + +Object.defineProperty(_$hold_11, "__esModule", { + value: true +}); +_$hold_11["default"] = void 0; + +var ___base_11 = ___interopRequireDefault_11(_$base_9); + +function ___interopRequireDefault_11(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_11(scope) { + var autoStart = scope.autoStart, + interactions = scope.interactions, + defaults = scope.defaults; + scope.usePlugin(___base_11["default"]); + defaults.perAction.hold = 0; + defaults.perAction.delay = 0; + interactions.signals.on('new', function (interaction) { + interaction.autoStartHoldTimer = null; + }); + autoStart.signals.on('prepared', function (_ref) { + var interaction = _ref.interaction; + var hold = getHoldDuration(interaction); + + if (hold > 0) { + interaction.autoStartHoldTimer = setTimeout(function () { + interaction.start(interaction.prepared, interaction.interactable, interaction.element); + }, hold); + } + }); + interactions.signals.on('move', function (_ref2) { + var interaction = _ref2.interaction, + duplicate = _ref2.duplicate; - interact.getElementRect = getElementRect; - interact.getElementClientRect = getElementClientRect; - interact.matchesSelector = matchesSelector; - interact.closest = closest; + if (interaction.pointerWasMoved && !duplicate) { + clearTimeout(interaction.autoStartHoldTimer); + } + }); // prevent regular down->move autoStart - /*\ - * interact.margin - [ method ] - * - * Deprecated. Use `interact(target).resizable({ margin: number });` instead. - * Returns or sets the margin for autocheck resizing used in - * @Interactable.getAction. That is the distance from the bottom and right - * edges of an element clicking in which will start resizing - * - - newValue (number) #optional - = (number | interact) The current margin value or interact - \*/ - interact.margin = warnOnce(function (newvalue) { - if (isNumber(newvalue)) { - margin = newvalue; - - return interact; - } - return margin; - }, - 'interact.margin is deprecated. Use interact(target).resizable({ margin: number }); instead.') ; + autoStart.signals.on('before-start', function (_ref3) { + var interaction = _ref3.interaction; + var hold = getHoldDuration(interaction); - /*\ - * interact.supportsTouch - [ method ] - * - = (boolean) Whether or not the browser supports touch input - \*/ - interact.supportsTouch = function () { - return supportsTouch; - }; + if (hold > 0) { + interaction.prepared.name = null; + } + }); +} - /*\ - * interact.supportsPointerEvent - [ method ] - * - = (boolean) Whether or not the browser supports PointerEvents - \*/ - interact.supportsPointerEvent = function () { - return supportsPointerEvent; - }; +function getHoldDuration(interaction) { + var actionName = interaction.prepared && interaction.prepared.name; + + if (!actionName) { + return null; + } + + var options = interaction.interactable.options; + return options[actionName].hold || options[actionName].delay; +} + +var ___default_11 = { + id: 'auto-start/hold', + install: __install_11, + getHoldDuration: getHoldDuration +}; +_$hold_11["default"] = ___default_11; + +var _$autoStart_12 = {}; +"use strict"; + +Object.defineProperty(_$autoStart_12, "__esModule", { + value: true +}); +_$autoStart_12.install = __install_12; +Object.defineProperty(_$autoStart_12, "autoStart", { + enumerable: true, + get: function get() { + return ___base_12["default"]; + } +}); +Object.defineProperty(_$autoStart_12, "dragAxis", { + enumerable: true, + get: function get() { + return _dragAxis["default"]; + } +}); +Object.defineProperty(_$autoStart_12, "hold", { + enumerable: true, + get: function get() { + return _hold["default"]; + } +}); +_$autoStart_12.id = void 0; + +var ___base_12 = ___interopRequireDefault_12(_$base_9); + +var _dragAxis = ___interopRequireDefault_12(_$dragAxis_10); + +var _hold = ___interopRequireDefault_12(_$hold_11); + +function ___interopRequireDefault_12(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_12(scope) { + scope.usePlugin(___base_12["default"]); + scope.usePlugin(_hold["default"]); + scope.usePlugin(_dragAxis["default"]); +} + +var __id_12 = 'auto-start'; +_$autoStart_12.id = __id_12; + +var _$interactablePreventDefault_21 = {}; +"use strict"; + +Object.defineProperty(_$interactablePreventDefault_21, "__esModule", { + value: true +}); +_$interactablePreventDefault_21.install = __install_21; +_$interactablePreventDefault_21["default"] = void 0; + +/* removed: var _$domUtils_51 = require("@interactjs/utils/domUtils"); */; + +var ___events_21 = ___interopRequireDefault_21(_$events_52); + +var __is_21 = ___interopRequireWildcard_21(_$is_57); + +/* removed: var _$window_66 = require("@interactjs/utils/window"); */; + +function ___interopRequireWildcard_21(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_21(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function preventDefault(newValue) { + if (/^(always|never|auto)$/.test(newValue)) { + this.options.preventDefault = newValue; + return this; + } + + if (__is_21.bool(newValue)) { + this.options.preventDefault = newValue ? 'always' : 'never'; + return this; + } + + return this.options.preventDefault; +} + +function checkAndPreventDefault(interactable, scope, event) { + var setting = interactable.options.preventDefault; + + if (setting === 'never') { + return; + } + + if (setting === 'always') { + event.preventDefault(); + return; + } // setting === 'auto' + // if the browser supports passive event listeners and isn't running on iOS, + // don't preventDefault of touch{start,move} events. CSS touch-action and + // user-select should be used instead of calling event.preventDefault(). + + + if (___events_21["default"].supportsPassive && /^touch(start|move)$/.test(event.type)) { + var doc = (0, _$window_66.getWindow)(event.target).document; + var docOptions = scope.getDocOptions(doc); - /*\ - * interact.stop - [ method ] - * - * Cancels all interactions (end events are not fired) - * - - event (Event) An event on which to call preventDefault() - = (object) interact - \*/ - interact.stop = function (event) { - for (var i = interactions.length - 1; i >= 0; i--) { - interactions[i].stop(event); - } + if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) { + return; + } + } // don't preventDefault of pointerdown events - return interact; - }; - /*\ - * interact.dynamicDrop - [ method ] - * - * Returns or sets whether the dimensions of dropzone elements are - * calculated on every dragmove or only on dragstart for the default - * dropChecker - * - - newValue (boolean) #optional True to check on each move. False to check only before start - = (boolean | interact) The current setting or interact - \*/ - interact.dynamicDrop = function (newValue) { - if (isBool(newValue)) { - //if (dragging && dynamicDrop !== newValue && !newValue) { - //calcRects(dropzones); - //} - - dynamicDrop = newValue; - - return interact; + if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) { + return; + } // don't preventDefault on editable elements + + + if (__is_21.element(event.target) && (0, _$domUtils_51.matchesSelector)(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) { + return; + } + + event.preventDefault(); +} + +function onInteractionEvent(_ref) { + var interaction = _ref.interaction, + event = _ref.event; + + if (interaction.interactable) { + interaction.interactable.checkAndPreventDefault(event); + } +} + +function __install_21(scope) { + /** @lends Interactable */ + var Interactable = scope.Interactable; + /** + * Returns or sets whether to prevent the browser's default behaviour in + * response to pointer events. Can be set to: + * - `'always'` to always prevent + * - `'never'` to never prevent + * - `'auto'` to let interact.js try to determine what would be best + * + * @param {string} [newValue] `'always'`, `'never'` or `'auto'` + * @return {string | Interactable} The current setting or this Interactable + */ + + Interactable.prototype.preventDefault = preventDefault; + + Interactable.prototype.checkAndPreventDefault = function (event) { + return checkAndPreventDefault(this, scope, event); + }; + + var _arr = ['down', 'move', 'up', 'cancel']; + + for (var _i = 0; _i < _arr.length; _i++) { + var eventSignal = _arr[_i]; + scope.interactions.signals.on(eventSignal, onInteractionEvent); + } // prevent native HTML5 drag on interact.js target elements + + + scope.interactions.docEvents.push({ + type: 'dragstart', + listener: function listener(event) { + for (var _i2 = 0; _i2 < scope.interactions.list.length; _i2++) { + var _ref2; + + _ref2 = scope.interactions.list[_i2]; + var interaction = _ref2; + + if (interaction.element && (interaction.element === event.target || (0, _$domUtils_51.nodeContains)(interaction.element, event.target))) { + interaction.interactable.checkAndPreventDefault(event); + return; } - return dynamicDrop; + } + } + }); +} + +var ___default_21 = { + id: 'core/interactablePreventDefault', + install: __install_21 +}; +_$interactablePreventDefault_21["default"] = ___default_21; + +var _$devTools_25 = {}; +"use strict"; + +Object.defineProperty(_$devTools_25, "__esModule", { + value: true +}); +_$devTools_25["default"] = void 0; + +var ___domObjects_25 = ___interopRequireDefault_25(_$domObjects_50); + +/* removed: var _$domUtils_51 = require("@interactjs/utils/domUtils"); */; + +var ___extend_25 = ___interopRequireDefault_25(_$extend_53); + +var __is_25 = ___interopRequireWildcard_25(_$is_57); + +var ___window_25 = ___interopRequireDefault_25(_$window_66); + +function ___interopRequireWildcard_25(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_25(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___toConsumableArray_25(arr) { return ___arrayWithoutHoles_25(arr) || ___iterableToArray_25(arr) || ___nonIterableSpread_25(); } + +function ___nonIterableSpread_25() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } + +function ___iterableToArray_25(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } + +function ___arrayWithoutHoles_25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } + +var CheckName; + +(function (CheckName) { + CheckName["touchAction"] = ""; + CheckName["boxSizing"] = ""; + CheckName["noListeners"] = ""; +})(CheckName || (CheckName = {})); + +var prefix = '[interact.js] '; +var links = { + touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action', + boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing' +}; +var isProduction = "production" === 'production'; // eslint-disable-next-line no-restricted-syntax + +function __install_25(scope) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + logger = _ref.logger; + + var interactions = scope.interactions, + Interactable = scope.Interactable, + defaults = scope.defaults; + logger = logger || console; + interactions.signals.on('action-start', function (_ref2) { + var interaction = _ref2.interaction; + + for (var _i = 0; _i < checks.length; _i++) { + var _ref3; + + _ref3 = checks[_i]; + var check = _ref3; + var options = interaction.interactable && interaction.interactable.options[interaction.prepared.name]; + + if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) { + var _logger; + + (_logger = logger).warn.apply(_logger, [prefix + check.text].concat(___toConsumableArray_25(check.getInfo(interaction)))); + } + } + }); + defaults.base.devTools = { + ignore: {} + }; + + Interactable.prototype.devTools = function (options) { + if (options) { + (0, ___extend_25["default"])(this.options.devTools, options); + return this; + } + + return this.options.devTools; + }; +} + +var checks = [{ + name: 'touchAction', + perform: function perform(_ref4) { + var element = _ref4.element; + return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/); + }, + getInfo: function getInfo(_ref5) { + var element = _ref5.element; + return [element, links.touchAction]; + }, + text: 'Consider adding CSS "touch-action: none" to this element\n' +}, { + name: 'boxSizing', + perform: function perform(interaction) { + var element = interaction.element; + return interaction.prepared.name === 'resize' && element instanceof ___domObjects_25["default"].HTMLElement && !hasStyle(element, 'boxSizing', /border-box/); + }, + text: 'Consider adding CSS "box-sizing: border-box" to this resizable element', + getInfo: function getInfo(_ref6) { + var element = _ref6.element; + return [element, links.boxSizing]; + } +}, { + name: 'noListeners', + perform: function perform(interaction) { + var actionName = interaction.prepared.name; + var moveListeners = interaction.interactable.events.types["".concat(actionName, "move")] || []; + return !moveListeners.length; + }, + getInfo: function getInfo(interaction) { + return [interaction.prepared.name, interaction.interactable]; + }, + text: 'There are no listeners set for this action' +}]; + +function hasStyle(element, prop, styleRe) { + return styleRe.test(element.style[prop] || ___window_25["default"].window.getComputedStyle(element)[prop]); +} + +function parentHasStyle(element, prop, styleRe) { + var parent = element; + + while (__is_25.element(parent)) { + if (hasStyle(parent, prop, styleRe)) { + return true; + } + + parent = (0, _$domUtils_51.parentNode)(parent); + } + + return false; +} + +var __id_25 = 'dev-tools'; +var defaultExport = isProduction ? { + id: __id_25, + install: function install() {} +} : { + id: __id_25, + install: __install_25, + checks: checks, + CheckName: CheckName, + links: links, + prefix: prefix +}; +var ___default_25 = defaultExport; +_$devTools_25["default"] = ___default_25; + +var _$base_30 = {}; +"use strict"; + +Object.defineProperty(_$base_30, "__esModule", { + value: true +}); +_$base_30.startAll = startAll; +_$base_30.setAll = setAll; +_$base_30.prepareStates = prepareStates; +_$base_30.makeModifier = makeModifier; +_$base_30["default"] = void 0; + +var ___extend_30 = ___interopRequireDefault_30(_$extend_53); + +function ___interopRequireDefault_30(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_30(arr, i) { return ___arrayWithHoles_30(arr) || ___iterableToArrayLimit_30(arr, i) || ___nonIterableRest_30(); } + +function ___nonIterableRest_30() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_30(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_30(arr) { if (Array.isArray(arr)) return arr; } + +function __install_30(scope) { + var interactions = scope.interactions; + scope.defaults.perAction.modifiers = []; + interactions.signals.on('new', function (_ref) { + var interaction = _ref.interaction; + interaction.modifiers = { + startOffset: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + offsets: {}, + states: null, + result: null, + endPrevented: false, + startDelta: null }; + }); + interactions.signals.on('before-action-start', function (arg) { + __start_30(arg, arg.interaction.coords.start.page); + }); + interactions.signals.on('action-resume', function (arg) { + stop(arg); + __start_30(arg, arg.interaction.coords.cur.page); + __beforeMove_30(arg); + }); + interactions.signals.on('after-action-move', restoreCoords); + interactions.signals.on('before-action-move', __beforeMove_30); + interactions.signals.on('before-action-start', setCoords); + interactions.signals.on('after-action-start', restoreCoords); + interactions.signals.on('before-action-end', beforeEnd); + interactions.signals.on('stop', stop); +} + +function __start_30(_ref2, pageCoords) { + var interaction = _ref2.interaction, + phase = _ref2.phase; + var interactable = interaction.interactable, + element = interaction.element; + var modifierList = getModifierList(interaction); + var states = prepareStates(modifierList); + var rect = (0, ___extend_30["default"])({}, interaction.rect); + + if (!('width' in rect)) { + rect.width = rect.right - rect.left; + } + + if (!('height' in rect)) { + rect.height = rect.bottom - rect.top; + } + + var startOffset = getRectOffset(rect, pageCoords); + interaction.modifiers.startOffset = startOffset; + interaction.modifiers.startDelta = { + x: 0, + y: 0 + }; + var arg = { + interaction: interaction, + interactable: interactable, + element: element, + pageCoords: pageCoords, + phase: phase, + rect: rect, + startOffset: startOffset, + states: states, + preEnd: false, + requireEndOnly: false + }; + interaction.modifiers.states = states; + interaction.modifiers.result = null; + startAll(arg); + arg.pageCoords = (0, ___extend_30["default"])({}, interaction.coords.start.page); + var result = interaction.modifiers.result = setAll(arg); + return result; +} + +function startAll(arg) { + var states = arg.states; + + for (var _i = 0; _i < states.length; _i++) { + var _ref3; + + _ref3 = states[_i]; + var state = _ref3; + + if (state.methods.start) { + arg.state = state; + state.methods.start(arg); + } + } +} + +function setAll(arg) { + var interaction = arg.interaction, + _arg$modifiersState = arg.modifiersState, + modifiersState = _arg$modifiersState === void 0 ? interaction.modifiers : _arg$modifiersState, + _arg$prevCoords = arg.prevCoords, + prevCoords = _arg$prevCoords === void 0 ? modifiersState.result ? modifiersState.result.coords : interaction.coords.prev.page : _arg$prevCoords, + phase = arg.phase, + preEnd = arg.preEnd, + requireEndOnly = arg.requireEndOnly, + rect = arg.rect, + skipModifiers = arg.skipModifiers; + var states = skipModifiers ? arg.states.slice(skipModifiers) : arg.states; + arg.coords = (0, ___extend_30["default"])({}, arg.pageCoords); + arg.rect = (0, ___extend_30["default"])({}, rect); + var result = { + delta: { + x: 0, + y: 0 + }, + rectDelta: { + left: 0, + right: 0, + top: 0, + bottom: 0 + }, + coords: arg.coords, + changed: true + }; + + for (var _i2 = 0; _i2 < states.length; _i2++) { + var _ref4; + + _ref4 = states[_i2]; + var state = _ref4; + var options = state.options; + + if (!state.methods.set || !shouldDo(options, preEnd, requireEndOnly, phase)) { + continue; + } - /*\ - * interact.pointerMoveTolerance - [ method ] - * Returns or sets the distance the pointer must be moved before an action - * sequence occurs. This also affects tolerance for tap events. - * - - newValue (number) #optional The movement from the start position must be greater than this value - = (number | Interactable) The current setting or interact - \*/ - interact.pointerMoveTolerance = function (newValue) { - if (isNumber(newValue)) { - pointerMoveTolerance = newValue; - - return this; - } + arg.state = state; + state.methods.set(arg); + } + + result.delta.x = arg.coords.x - arg.pageCoords.x; + result.delta.y = arg.coords.y - arg.pageCoords.y; + var rectChanged = false; + + if (rect) { + result.rectDelta.left = arg.rect.left - rect.left; + result.rectDelta.right = arg.rect.right - rect.right; + result.rectDelta.top = arg.rect.top - rect.top; + result.rectDelta.bottom = arg.rect.bottom - rect.bottom; + rectChanged = result.rectDelta.left !== 0 || result.rectDelta.right !== 0 || result.rectDelta.top !== 0 || result.rectDelta.bottom !== 0; + } + + result.changed = prevCoords.x !== result.coords.x || prevCoords.y !== result.coords.y || rectChanged; + return result; +} + +function __beforeMove_30(arg) { + var interaction = arg.interaction, + phase = arg.phase, + preEnd = arg.preEnd, + skipModifiers = arg.skipModifiers; + var interactable = interaction.interactable, + element = interaction.element; + var modifierResult = setAll({ + interaction: interaction, + interactable: interactable, + element: element, + preEnd: preEnd, + phase: phase, + pageCoords: interaction.coords.cur.page, + rect: interaction.rect, + states: interaction.modifiers.states, + requireEndOnly: false, + skipModifiers: skipModifiers + }); + interaction.modifiers.result = modifierResult; // don't fire an action move if a modifier would keep the event in the same + // cordinates as before + + if (!modifierResult.changed && interaction.interacting()) { + return false; + } + + setCoords(arg); +} + +function beforeEnd(arg) { + var interaction = arg.interaction, + event = arg.event, + noPreEnd = arg.noPreEnd; + var states = interaction.modifiers.states; + + if (noPreEnd || !states || !states.length) { + return; + } + + var didPreEnd = false; + + for (var _i3 = 0; _i3 < states.length; _i3++) { + var _ref5; + + _ref5 = states[_i3]; + var state = _ref5; + arg.state = state; + var options = state.options, + methods = state.methods; + var endResult = methods.beforeEnd && methods.beforeEnd(arg); + + if (endResult === false) { + interaction.modifiers.endPrevented = true; + return false; + } // if the endOnly option is true for any modifier + + + if (!didPreEnd && shouldDo(options, true, true)) { + // fire a move event at the modified coordinates + interaction.move({ + event: event, + preEnd: true + }); + didPreEnd = true; + } + } +} + +function stop(arg) { + var interaction = arg.interaction; + var states = interaction.modifiers.states; + + if (!states || !states.length) { + return; + } - return pointerMoveTolerance; + var modifierArg = (0, ___extend_30["default"])({ + states: states, + interactable: interaction.interactable, + element: interaction.element + }, arg); + restoreCoords(arg); + + for (var _i4 = 0; _i4 < states.length; _i4++) { + var _ref6; + + _ref6 = states[_i4]; + var state = _ref6; + modifierArg.state = state; + + if (state.methods.stop) { + state.methods.stop(modifierArg); + } + } + + arg.interaction.modifiers.states = null; + arg.interaction.modifiers.endPrevented = false; +} + +function getModifierList(interaction) { + var actionOptions = interaction.interactable.options[interaction.prepared.name]; + var actionModifiers = actionOptions.modifiers; + + if (actionModifiers && actionModifiers.length) { + return actionModifiers.filter(function (modifier) { + return !modifier.options || modifier.options.enabled !== false; + }); + } + + return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(function (type) { + var options = actionOptions[type]; + return options && options.enabled && { + options: options, + methods: options._methods }; + }).filter(function (m) { + return !!m; + }); +} + +function prepareStates(modifierList) { + var states = []; + + for (var index = 0; index < modifierList.length; index++) { + var _modifierList$index = modifierList[index], + options = _modifierList$index.options, + methods = _modifierList$index.methods, + name = _modifierList$index.name; + + if (options && options.enabled === false) { + continue; + } - /*\ - * interact.maxInteractions - [ method ] - ** - * Returns or sets the maximum number of concurrent interactions allowed. - * By default only 1 interaction is allowed at a time (for backwards - * compatibility). To allow multiple interactions on the same Interactables - * and elements, you need to enable it in the draggable, resizable and - * gesturable `'max'` and `'maxPerElement'` options. - ** - - newValue (number) #optional Any number. newValue <= 0 means no interactions. - \*/ - interact.maxInteractions = function (newValue) { - if (isNumber(newValue)) { - maxInteractions = newValue; - - return this; - } + states.push({ + options: options, + methods: methods, + index: index, + name: name + }); + } + + return states; +} + +function setCoords(arg) { + var interaction = arg.interaction, + phase = arg.phase; + var curCoords = arg.curCoords || interaction.coords.cur; + var startCoords = arg.startCoords || interaction.coords.start; + var _interaction$modifier = interaction.modifiers, + result = _interaction$modifier.result, + startDelta = _interaction$modifier.startDelta; + var curDelta = result.delta; + + if (phase === 'start') { + (0, ___extend_30["default"])(interaction.modifiers.startDelta, result.delta); + } + + var _arr = [[startCoords, startDelta], [curCoords, curDelta]]; + + for (var _i5 = 0; _i5 < _arr.length; _i5++) { + var _arr$_i = ___slicedToArray_30(_arr[_i5], 2), + coordsSet = _arr$_i[0], + delta = _arr$_i[1]; + + coordsSet.page.x += delta.x; + coordsSet.page.y += delta.y; + coordsSet.client.x += delta.x; + coordsSet.client.y += delta.y; + } + + var rectDelta = interaction.modifiers.result.rectDelta; + var rect = arg.rect || interaction.rect; + rect.left += rectDelta.left; + rect.right += rectDelta.right; + rect.top += rectDelta.top; + rect.bottom += rectDelta.bottom; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +} + +function restoreCoords(_ref7) { + var _ref7$interaction = _ref7.interaction, + coords = _ref7$interaction.coords, + rect = _ref7$interaction.rect, + modifiers = _ref7$interaction.modifiers; + + if (!modifiers.result) { + return; + } + + var startDelta = modifiers.startDelta; + var _modifiers$result = modifiers.result, + curDelta = _modifiers$result.delta, + rectDelta = _modifiers$result.rectDelta; + var coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]]; + + for (var _i6 = 0; _i6 < coordsAndDeltas.length; _i6++) { + var _coordsAndDeltas$_i = ___slicedToArray_30(coordsAndDeltas[_i6], 2), + coordsSet = _coordsAndDeltas$_i[0], + delta = _coordsAndDeltas$_i[1]; + + coordsSet.page.x -= delta.x; + coordsSet.page.y -= delta.y; + coordsSet.client.x -= delta.x; + coordsSet.client.y -= delta.y; + } + + rect.left -= rectDelta.left; + rect.right -= rectDelta.right; + rect.top -= rectDelta.top; + rect.bottom -= rectDelta.bottom; +} + +function shouldDo(options, preEnd, requireEndOnly, phase) { + return options ? options.enabled !== false && (preEnd || !options.endOnly) && (!requireEndOnly || options.endOnly || options.alwaysOnEnd) && (options.setStart || phase !== 'start') : !requireEndOnly; +} + +function getRectOffset(rect, coords) { + return rect ? { + left: coords.x - rect.left, + top: coords.y - rect.top, + right: rect.right - coords.x, + bottom: rect.bottom - coords.y + } : { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; +} + +function makeModifier(module, name) { + var defaults = module.defaults; + var methods = { + start: module.start, + set: module.set, + beforeEnd: module.beforeEnd, + stop: module.stop + }; + + var modifier = function modifier(_options) { + var options = _options || {}; // add missing defaults to options + + for (var prop in defaults) { + if (!(prop in options)) { + options[prop] = defaults[prop]; + } + } - return maxInteractions; + var m = { + options: options, + methods: methods, + name: name }; + return m; + }; + + if (name && typeof name === 'string') { + // for backwrads compatibility + modifier._defaults = defaults; + modifier._methods = methods; + } + + return modifier; +} + +var ___default_30 = { + id: 'modifiers/base', + install: __install_30, + startAll: startAll, + setAll: setAll, + prepareStates: prepareStates, + start: __start_30, + beforeMove: __beforeMove_30, + beforeEnd: beforeEnd, + stop: stop, + shouldDo: shouldDo, + getModifierList: getModifierList, + getRectOffset: getRectOffset, + makeModifier: makeModifier +}; +_$base_30["default"] = ___default_30; + +var _$inertia_26 = {}; +"use strict"; + +Object.defineProperty(_$inertia_26, "__esModule", { + value: true +}); +_$inertia_26["default"] = void 0; + +/* removed: var _$InteractEvent_15 = require("@interactjs/core/InteractEvent"); */; + +var ___base_26 = ___interopRequireDefault_26(_$base_30); + +var __utils_26 = ___interopRequireWildcard_26(_$utils_56); + +var ___raf_26 = ___interopRequireDefault_26(_$raf_62); + +function ___interopRequireWildcard_26(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_26(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +_$InteractEvent_15.EventPhase.Resume = 'resume'; +_$InteractEvent_15.EventPhase.InertiaStart = 'inertiastart'; + +function __install_26(scope) { + var interactions = scope.interactions, + defaults = scope.defaults; + interactions.signals.on('new', function (_ref) { + var interaction = _ref.interaction; + interaction.inertia = { + active: false, + smoothEnd: false, + allowResume: false, + upCoords: {}, + timeout: null + }; + }); // FIXME proper signal typing + + interactions.signals.on('before-action-end', function (arg) { + return release(arg, scope); + }); + interactions.signals.on('down', function (arg) { + return resume(arg, scope); + }); + interactions.signals.on('stop', function (arg) { + return __stop_26(arg); + }); + defaults.perAction.inertia = { + enabled: false, + resistance: 10, + minSpeed: 100, + endSpeed: 10, + allowResume: true, + smoothEndDuration: 300 + }; + scope.usePlugin(___base_26["default"]); +} + +function resume(_ref2, scope) { + var interaction = _ref2.interaction, + event = _ref2.event, + pointer = _ref2.pointer, + eventTarget = _ref2.eventTarget; + var state = interaction.inertia; // Check if the down event hits the current inertia target + + if (state.active) { + var element = eventTarget; // climb up the DOM tree from the event target + + while (__utils_26.is.element(element)) { + // if interaction element is the current inertia target element + if (element === interaction.element) { + // stop inertia + ___raf_26["default"].cancel(state.timeout); + + state.active = false; + interaction.simulation = null; // update pointers to the down event's coordinates + + interaction.updatePointer(pointer, event, eventTarget, true); + __utils_26.pointer.setCoords(interaction.coords.cur, interaction.pointers.map(function (p) { + return p.pointer; + }), interaction._now()); // fire appropriate signals + + var signalArg = { + interaction: interaction + }; + scope.interactions.signals.fire('action-resume', signalArg); // fire a reume event - interact.createSnapGrid = function (grid) { - return function (x, y) { - var offsetX = 0, - offsetY = 0; + var resumeEvent = new scope.InteractEvent(interaction, event, interaction.prepared.name, _$InteractEvent_15.EventPhase.Resume, interaction.element); - if (isObject(grid.offset)) { - offsetX = grid.offset.x; - offsetY = grid.offset.y; - } + interaction._fireEvent(resumeEvent); - var gridx = Math.round((x - offsetX) / grid.x), - gridy = Math.round((y - offsetY) / grid.y), + __utils_26.pointer.copyCoords(interaction.coords.prev, interaction.coords.cur); + break; + } - newX = gridx * grid.x + offsetX, - newY = gridy * grid.y + offsetY; + element = __utils_26.dom.parentNode(element); + } + } +} + +function release(_ref3, scope) { + var interaction = _ref3.interaction, + event = _ref3.event, + noPreEnd = _ref3.noPreEnd; + var state = interaction.inertia; + + if (!interaction.interacting() || interaction.simulation && interaction.simulation.active || noPreEnd) { + return null; + } + + var options = __getOptions_26(interaction); + + var now = interaction._now(); + + var velocityClient = interaction.coords.velocity.client; + var pointerSpeed = __utils_26.hypot(velocityClient.x, velocityClient.y); + var smoothEnd = false; + var modifierResult; // check if inertia should be started + + var inertiaPossible = options && options.enabled && interaction.prepared.name !== 'gesture' && event !== state.startEvent; + var inertia = inertiaPossible && now - interaction.coords.cur.timeStamp < 50 && pointerSpeed > options.minSpeed && pointerSpeed > options.endSpeed; + var modifierArg = { + interaction: interaction, + pageCoords: __utils_26.extend({}, interaction.coords.cur.page), + states: inertiaPossible && interaction.modifiers.states.map(function (modifierStatus) { + return __utils_26.extend({}, modifierStatus); + }), + preEnd: true, + prevCoords: undefined, + requireEndOnly: null + }; // smoothEnd + + if (inertiaPossible && !inertia) { + modifierArg.prevCoords = interaction.prevEvent.page; + modifierArg.requireEndOnly = false; + modifierResult = ___base_26["default"].setAll(modifierArg); + + if (modifierResult.changed) { + smoothEnd = true; + } + } + + if (!(inertia || smoothEnd)) { + return null; + } + + __utils_26.pointer.copyCoords(state.upCoords, interaction.coords.cur); + interaction.pointers[0].pointer = state.startEvent = new scope.InteractEvent(interaction, event, // FIXME add proper typing Action.name + interaction.prepared.name, _$InteractEvent_15.EventPhase.InertiaStart, interaction.element); + state.t0 = now; + state.active = true; + state.allowResume = options.allowResume; + interaction.simulation = state; + interaction.interactable.fire(state.startEvent); + + if (inertia) { + state.vx0 = interaction.coords.velocity.client.x; + state.vy0 = interaction.coords.velocity.client.y; + state.v0 = pointerSpeed; + calcInertia(interaction, state); + __utils_26.extend(modifierArg.pageCoords, interaction.coords.cur.page); + modifierArg.pageCoords.x += state.xe; + modifierArg.pageCoords.y += state.ye; + modifierArg.prevCoords = undefined; + modifierArg.requireEndOnly = true; + modifierResult = ___base_26["default"].setAll(modifierArg); + state.modifiedXe += modifierResult.delta.x; + state.modifiedYe += modifierResult.delta.y; + state.timeout = ___raf_26["default"].request(function () { + return inertiaTick(interaction); + }); + } else { + state.smoothEnd = true; + state.xe = modifierResult.delta.x; + state.ye = modifierResult.delta.y; + state.sx = state.sy = 0; + state.timeout = ___raf_26["default"].request(function () { + return smothEndTick(interaction); + }); + } + + return false; +} + +function __stop_26(_ref4) { + var interaction = _ref4.interaction; + var state = interaction.inertia; + + if (state.active) { + ___raf_26["default"].cancel(state.timeout); + + state.active = false; + interaction.simulation = null; + } +} + +function calcInertia(interaction, state) { + var options = __getOptions_26(interaction); + var lambda = options.resistance; + var inertiaDur = -Math.log(options.endSpeed / state.v0) / lambda; + state.x0 = interaction.prevEvent.page.x; + state.y0 = interaction.prevEvent.page.y; + state.t0 = state.startEvent.timeStamp / 1000; + state.sx = state.sy = 0; + state.modifiedXe = state.xe = (state.vx0 - inertiaDur) / lambda; + state.modifiedYe = state.ye = (state.vy0 - inertiaDur) / lambda; + state.te = inertiaDur; + state.lambda_v0 = lambda / state.v0; + state.one_ve_v0 = 1 - options.endSpeed / state.v0; +} + +function inertiaTick(interaction) { + updateInertiaCoords(interaction); + __utils_26.pointer.setCoordDeltas(interaction.coords.delta, interaction.coords.prev, interaction.coords.cur); + __utils_26.pointer.setCoordVelocity(interaction.coords.velocity, interaction.coords.delta); + var state = interaction.inertia; + var options = __getOptions_26(interaction); + var lambda = options.resistance; + var t = interaction._now() / 1000 - state.t0; + + if (t < state.te) { + var progress = 1 - (Math.exp(-lambda * t) - state.lambda_v0) / state.one_ve_v0; + + if (state.modifiedXe === state.xe && state.modifiedYe === state.ye) { + state.sx = state.xe * progress; + state.sy = state.ye * progress; + } else { + var quadPoint = __utils_26.getQuadraticCurvePoint(0, 0, state.xe, state.ye, state.modifiedXe, state.modifiedYe, progress); + state.sx = quadPoint.x; + state.sy = quadPoint.y; + } - return { - x: newX, - y: newY, - range: grid.range - }; - }; + interaction.move(); + state.timeout = ___raf_26["default"].request(function () { + return inertiaTick(interaction); + }); + } else { + state.sx = state.modifiedXe; + state.sy = state.modifiedYe; + interaction.move(); + interaction.end(state.startEvent); + state.active = false; + interaction.simulation = null; + } + + __utils_26.pointer.copyCoords(interaction.coords.prev, interaction.coords.cur); +} + +function smothEndTick(interaction) { + updateInertiaCoords(interaction); + var state = interaction.inertia; + var t = interaction._now() - state.t0; + + var _getOptions = __getOptions_26(interaction), + duration = _getOptions.smoothEndDuration; + + if (t < duration) { + state.sx = __utils_26.easeOutQuad(t, 0, state.xe, duration); + state.sy = __utils_26.easeOutQuad(t, 0, state.ye, duration); + interaction.move(); + state.timeout = ___raf_26["default"].request(function () { + return smothEndTick(interaction); + }); + } else { + state.sx = state.xe; + state.sy = state.ye; + interaction.move(); + interaction.end(state.startEvent); + state.smoothEnd = state.active = false; + interaction.simulation = null; + } +} + +function updateInertiaCoords(interaction) { + var state = interaction.inertia; // return if inertia isn't running + + if (!state.active) { + return; + } + + var pageUp = state.upCoords.page; + var clientUp = state.upCoords.client; + __utils_26.pointer.setCoords(interaction.coords.cur, [{ + pageX: pageUp.x + state.sx, + pageY: pageUp.y + state.sy, + clientX: clientUp.x + state.sx, + clientY: clientUp.y + state.sy + }], interaction._now()); +} + +function __getOptions_26(_ref5) { + var interactable = _ref5.interactable, + prepared = _ref5.prepared; + return interactable && interactable.options && prepared.name && interactable.options[prepared.name].inertia; +} + +var ___default_26 = { + id: 'inertia', + install: __install_26, + calcInertia: calcInertia, + inertiaTick: inertiaTick, + smothEndTick: smothEndTick, + updateInertiaCoords: updateInertiaCoords +}; +_$inertia_26["default"] = ___default_26; + +var _$pointer_33 = {}; +"use strict"; + +Object.defineProperty(_$pointer_33, "__esModule", { + value: true +}); +_$pointer_33["default"] = void 0; + +var ___extend_33 = ___interopRequireDefault_33(_$extend_53); + +var __is_33 = ___interopRequireWildcard_33(_$is_57); + +var ___rect_33 = ___interopRequireDefault_33(_$rect_63); + +function ___interopRequireWildcard_33(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_33(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __start_33(_ref) { + var rect = _ref.rect, + startOffset = _ref.startOffset, + state = _ref.state, + interaction = _ref.interaction, + pageCoords = _ref.pageCoords; + var options = state.options; + var elementRect = options.elementRect; + var offset = (0, ___extend_33["default"])({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.offset || {}); + + if (rect && elementRect) { + var restriction = getRestrictionRect(options.restriction, interaction, pageCoords); + + if (restriction) { + var widthDiff = restriction.right - restriction.left - rect.width; + var heightDiff = restriction.bottom - restriction.top - rect.height; + + if (widthDiff < 0) { + offset.left += widthDiff; + offset.right += widthDiff; + } + + if (heightDiff < 0) { + offset.top += heightDiff; + offset.bottom += heightDiff; + } + } + + offset.left += startOffset.left - rect.width * elementRect.left; + offset.top += startOffset.top - rect.height * elementRect.top; + offset.right += startOffset.right - rect.width * (1 - elementRect.right); + offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom); + } + + state.offset = offset; +} + +function set(_ref2) { + var coords = _ref2.coords, + interaction = _ref2.interaction, + state = _ref2.state; + var options = state.options, + offset = state.offset; + var restriction = getRestrictionRect(options.restriction, interaction, coords); + + if (!restriction) { + return; + } + + var rect = ___rect_33["default"].xywhToTlbr(restriction); + + coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left); + coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top); +} + +function getRestrictionRect(value, interaction, coords) { + if (__is_33.func(value)) { + return ___rect_33["default"].resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]); + } else { + return ___rect_33["default"].resolveRectLike(value, interaction.interactable, interaction.element); + } +} + +var __defaults_33 = { + restriction: null, + elementRect: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrict = { + start: __start_33, + set: set, + getRestrictionRect: getRestrictionRect, + defaults: __defaults_33 +}; +var ___default_33 = restrict; +_$pointer_33["default"] = ___default_33; + +var _$edges_32 = {}; +"use strict"; + +Object.defineProperty(_$edges_32, "__esModule", { + value: true +}); +_$edges_32["default"] = void 0; + +var ___extend_32 = ___interopRequireDefault_32(_$extend_53); + +var ___rect_32 = ___interopRequireDefault_32(_$rect_63); + +var _pointer = ___interopRequireDefault_32(_$pointer_33); + +function ___interopRequireDefault_32(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +// This module adds the options.resize.restrictEdges setting which sets min and +// max for the top, left, bottom and right edges of the target being resized. +// +// interact(target).resize({ +// edges: { top: true, left: true }, +// restrictEdges: { +// inner: { top: 200, left: 200, right: 400, bottom: 400 }, +// outer: { top: 0, left: 0, right: 600, bottom: 600 }, +// }, +// }) +var __getRestrictionRect_32 = _pointer["default"].getRestrictionRect; +var noInner = { + top: +Infinity, + left: +Infinity, + bottom: -Infinity, + right: -Infinity +}; +var noOuter = { + top: -Infinity, + left: -Infinity, + bottom: +Infinity, + right: +Infinity +}; + +function __start_32(_ref) { + var interaction = _ref.interaction, + state = _ref.state; + var options = state.options; + var startOffset = interaction.modifiers.startOffset; + var offset; + + if (options) { + var offsetRect = __getRestrictionRect_32(options.offset, interaction, interaction.coords.start.page); + offset = ___rect_32["default"].rectToXY(offsetRect); + } + + offset = offset || { + x: 0, + y: 0 + }; + state.offset = { + top: offset.y + startOffset.top, + left: offset.x + startOffset.left, + bottom: offset.y - startOffset.bottom, + right: offset.x - startOffset.right + }; +} + +function __set_32(_ref2) { + var coords = _ref2.coords, + interaction = _ref2.interaction, + state = _ref2.state; + var offset = state.offset, + options = state.options; + var edges = interaction.prepared._linkedEdges || interaction.prepared.edges; + + if (!edges) { + return; + } + + var page = (0, ___extend_32["default"])({}, coords); + var inner = __getRestrictionRect_32(options.inner, interaction, page) || {}; + var outer = __getRestrictionRect_32(options.outer, interaction, page) || {}; + fixRect(inner, noInner); + fixRect(outer, noOuter); + + if (edges.top) { + coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top); + } else if (edges.bottom) { + coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom); + } + + if (edges.left) { + coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left); + } else if (edges.right) { + coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right); + } +} + +function fixRect(rect, defaults) { + var _arr = ['top', 'left', 'bottom', 'right']; + + for (var _i = 0; _i < _arr.length; _i++) { + var edge = _arr[_i]; + + if (!(edge in rect)) { + rect[edge] = defaults[edge]; + } + } + + return rect; +} + +var __defaults_32 = { + inner: null, + outer: null, + offset: null, + endOnly: false, + enabled: false +}; +var restrictEdges = { + noInner: noInner, + noOuter: noOuter, + getRestrictionRect: __getRestrictionRect_32, + start: __start_32, + set: __set_32, + defaults: __defaults_32 +}; +var ___default_32 = restrictEdges; +_$edges_32["default"] = ___default_32; + +var _$rect_34 = {}; +"use strict"; + +Object.defineProperty(_$rect_34, "__esModule", { + value: true +}); +_$rect_34["default"] = void 0; + +var ___extend_34 = ___interopRequireDefault_34(_$extend_53); + +var ___pointer_34 = ___interopRequireDefault_34(_$pointer_33); + +function ___interopRequireDefault_34(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __defaults_34 = (0, ___extend_34["default"])({ + get elementRect() { + return { + top: 0, + left: 0, + bottom: 1, + right: 1 + }; + }, + + set elementRect(_) {} + +}, ___pointer_34["default"].defaults); +var restrictRect = { + start: ___pointer_34["default"].start, + set: ___pointer_34["default"].set, + defaults: __defaults_34 +}; +var ___default_34 = restrictRect; +_$rect_34["default"] = ___default_34; + +var _$size_35 = {}; +"use strict"; + +Object.defineProperty(_$size_35, "__esModule", { + value: true +}); +_$size_35["default"] = void 0; + +var ___extend_35 = ___interopRequireDefault_35(_$extend_53); + +var ___rect_35 = ___interopRequireDefault_35(_$rect_63); + +var _edges = ___interopRequireDefault_35(_$edges_32); + +function ___interopRequireDefault_35(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var noMin = { + width: -Infinity, + height: -Infinity +}; +var noMax = { + width: +Infinity, + height: +Infinity +}; + +function __start_35(arg) { + return _edges["default"].start(arg); +} + +function __set_35(arg) { + var interaction = arg.interaction, + state = arg.state; + var options = state.options; + var edges = interaction.prepared._linkedEdges || interaction.prepared.edges; + + if (!edges) { + return; + } + + var rect = ___rect_35["default"].xywhToTlbr(interaction.resizeRects.inverted); + + var minSize = ___rect_35["default"].tlbrToXywh(_edges["default"].getRestrictionRect(options.min, interaction, arg.coords)) || noMin; + var maxSize = ___rect_35["default"].tlbrToXywh(_edges["default"].getRestrictionRect(options.max, interaction, arg.coords)) || noMax; + state.options = { + endOnly: options.endOnly, + inner: (0, ___extend_35["default"])({}, _edges["default"].noInner), + outer: (0, ___extend_35["default"])({}, _edges["default"].noOuter) + }; + + if (edges.top) { + state.options.inner.top = rect.bottom - minSize.height; + state.options.outer.top = rect.bottom - maxSize.height; + } else if (edges.bottom) { + state.options.inner.bottom = rect.top + minSize.height; + state.options.outer.bottom = rect.top + maxSize.height; + } + + if (edges.left) { + state.options.inner.left = rect.right - minSize.width; + state.options.outer.left = rect.right - maxSize.width; + } else if (edges.right) { + state.options.inner.right = rect.left + minSize.width; + state.options.outer.right = rect.left + maxSize.width; + } + + _edges["default"].set(arg); + + state.options = options; +} + +var __defaults_35 = { + min: null, + max: null, + endOnly: false, + enabled: false +}; +var restrictSize = { + start: __start_35, + set: __set_35, + defaults: __defaults_35 +}; +var ___default_35 = restrictSize; +_$size_35["default"] = ___default_35; + +var _$pointer_37 = {}; +"use strict"; + +Object.defineProperty(_$pointer_37, "__esModule", { + value: true +}); +_$pointer_37["default"] = void 0; + +var __utils_37 = ___interopRequireWildcard_37(_$utils_56); + +function ___interopRequireWildcard_37(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function __start_37(arg) { + var interaction = arg.interaction, + interactable = arg.interactable, + element = arg.element, + rect = arg.rect, + state = arg.state, + startOffset = arg.startOffset; + var options = state.options; + var offsets = []; + var origin = options.offsetWithOrigin ? getOrigin(arg) : { + x: 0, + y: 0 + }; + var snapOffset; + + if (options.offset === 'startCoords') { + snapOffset = { + x: interaction.coords.start.page.x, + y: interaction.coords.start.page.y + }; + } else { + var offsetRect = __utils_37.rect.resolveRectLike(options.offset, interactable, element, [interaction]); + snapOffset = __utils_37.rect.rectToXY(offsetRect) || { + x: 0, + y: 0 }; + snapOffset.x += origin.x; + snapOffset.y += origin.y; + } + + var relativePoints = options.relativePoints || []; + + if (rect && options.relativePoints && options.relativePoints.length) { + for (var index = 0; index < relativePoints.length; index++) { + var relativePoint = relativePoints[index]; + offsets.push({ + index: index, + relativePoint: relativePoint, + x: startOffset.left - rect.width * relativePoint.x + snapOffset.x, + y: startOffset.top - rect.height * relativePoint.y + snapOffset.y + }); + } + } else { + offsets.push(__utils_37.extend({ + index: 0, + relativePoint: null + }, snapOffset)); + } + + state.offsets = offsets; +} + +function __set_37(arg) { + var interaction = arg.interaction, + coords = arg.coords, + state = arg.state; + var options = state.options, + offsets = state.offsets; + var origin = __utils_37.getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name); + var page = __utils_37.extend({}, coords); + var targets = []; + var target; + + if (!options.offsetWithOrigin) { + page.x -= origin.x; + page.y -= origin.y; + } + + state.realX = page.x; + state.realY = page.y; + + for (var _i = 0; _i < offsets.length; _i++) { + var _ref; + + _ref = offsets[_i]; + var offset = _ref; + var relativeX = page.x - offset.x; + var relativeY = page.y - offset.y; + + for (var index = 0, _len = options.targets.length; index < _len; index++) { + var snapTarget = options.targets[index]; + + if (__utils_37.is.func(snapTarget)) { + target = snapTarget(relativeX, relativeY, interaction, offset, index); + } else { + target = snapTarget; + } + + if (!target) { + continue; + } + + targets.push({ + x: (__utils_37.is.number(target.x) ? target.x : relativeX) + offset.x, + y: (__utils_37.is.number(target.y) ? target.y : relativeY) + offset.y, + range: __utils_37.is.number(target.range) ? target.range : options.range + }); + } + } + + var closest = { + target: null, + inRange: false, + distance: 0, + range: 0, + dx: 0, + dy: 0 + }; + + for (var i = 0, len = targets.length; i < len; i++) { + target = targets[i]; + var range = target.range; + var dx = target.x - page.x; + var dy = target.y - page.y; + var distance = __utils_37.hypot(dx, dy); + var inRange = distance <= range; // Infinite targets count as being out of range + // compared to non infinite ones that are in range + + if (range === Infinity && closest.inRange && closest.range !== Infinity) { + inRange = false; + } - function endAllInteractions (event) { - for (var i = 0; i < interactions.length; i++) { - interactions[i].pointerEnd(event, event); - } + if (!closest.target || (inRange // is the closest target in range? + ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target + ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't + : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest + distance < closest.distance : // The other is not in range and the pointer is closer to this target + !closest.inRange && distance < closest.distance)) { + closest.target = target; + closest.distance = distance; + closest.range = range; + closest.inRange = inRange; + closest.dx = dx; + closest.dy = dy; + state.range = range; + } + } + + if (closest.inRange) { + coords.x = closest.target.x; + coords.y = closest.target.y; + } + + state.closest = closest; +} + +function getOrigin(arg) { + var optionsOrigin = __utils_37.rect.rectToXY(__utils_37.rect.resolveRectLike(arg.state.options.origin, [arg.interaction.element])); + var origin = optionsOrigin || __utils_37.getOriginXY(arg.interactable, arg.interaction.element, arg.interaction.prepared.name); + return origin; +} + +var __defaults_37 = { + range: Infinity, + targets: null, + offset: null, + offsetWithOrigin: true, + origin: null, + relativePoints: null, + endOnly: false, + enabled: false +}; +var snap = { + start: __start_37, + set: __set_37, + defaults: __defaults_37 +}; +var ___default_37 = snap; +_$pointer_37["default"] = ___default_37; + +var _$size_38 = {}; +"use strict"; + +Object.defineProperty(_$size_38, "__esModule", { + value: true +}); +_$size_38["default"] = void 0; + +var ___extend_38 = ___interopRequireDefault_38(_$extend_53); + +var __is_38 = ___interopRequireWildcard_38(_$is_57); + +var ___pointer_38 = ___interopRequireDefault_38(_$pointer_37); + +function ___interopRequireWildcard_38(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___interopRequireDefault_38(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___slicedToArray_38(arr, i) { return ___arrayWithHoles_38(arr) || ___iterableToArrayLimit_38(arr, i) || ___nonIterableRest_38(); } + +function ___nonIterableRest_38() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_38(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_38(arr) { if (Array.isArray(arr)) return arr; } + +function __start_38(arg) { + var interaction = arg.interaction, + state = arg.state; + var options = state.options; + var edges = interaction.prepared.edges; + + if (!edges) { + return null; + } + + arg.state = { + options: { + targets: null, + relativePoints: [{ + x: edges.left ? 0 : 1, + y: edges.top ? 0 : 1 + }], + offset: options.offset || 'self', + origin: { + x: 0, + y: 0 + }, + range: options.range + } + }; + state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']]; + + ___pointer_38["default"].start(arg); + + state.offsets = arg.state.offsets; + arg.state = state; +} + +function __set_38(arg) { + var interaction = arg.interaction, + state = arg.state, + coords = arg.coords; + var options = state.options, + offsets = state.offsets; + var relative = { + x: coords.x - offsets[0].x, + y: coords.y - offsets[0].y + }; + state.options = (0, ___extend_38["default"])({}, options); + state.options.targets = []; + + for (var _i = 0; _i < (options.targets || []).length; _i++) { + var _ref; + + _ref = (options.targets || [])[_i]; + var snapTarget = _ref; + var target = void 0; + + if (__is_38.func(snapTarget)) { + target = snapTarget(relative.x, relative.y, interaction); + } else { + target = snapTarget; } - function listenToDocument (doc) { - if (contains(documents, doc)) { return; } + if (!target) { + continue; + } - var win = doc.defaultView || doc.parentWindow; + for (var _i2 = 0; _i2 < state.targetFields.length; _i2++) { + var _ref2; - // add delegate event listener - for (var eventType in delegatedEvents) { - events.add(doc, eventType, delegateListener); - events.add(doc, eventType, delegateUseCapture, true); - } + _ref2 = state.targetFields[_i2]; - if (PointerEvent) { - if (PointerEvent === win.MSPointerEvent) { - pEventTypes = { - up: 'MSPointerUp', down: 'MSPointerDown', over: 'mouseover', - out: 'mouseout', move: 'MSPointerMove', cancel: 'MSPointerCancel' }; - } - else { - pEventTypes = { - up: 'pointerup', down: 'pointerdown', over: 'pointerover', - out: 'pointerout', move: 'pointermove', cancel: 'pointercancel' }; - } + var _ref3 = _ref2, + _ref4 = ___slicedToArray_38(_ref3, 2), + xField = _ref4[0], + yField = _ref4[1]; - events.add(doc, pEventTypes.down , listeners.selectorDown ); - events.add(doc, pEventTypes.move , listeners.pointerMove ); - events.add(doc, pEventTypes.over , listeners.pointerOver ); - events.add(doc, pEventTypes.out , listeners.pointerOut ); - events.add(doc, pEventTypes.up , listeners.pointerUp ); - events.add(doc, pEventTypes.cancel, listeners.pointerCancel); + if (xField in target || yField in target) { + target.x = target[xField]; + target.y = target[yField]; + break; + } + } - // autoscroll - events.add(doc, pEventTypes.move, listeners.autoScrollMove); - } - else { - events.add(doc, 'mousedown', listeners.selectorDown); - events.add(doc, 'mousemove', listeners.pointerMove ); - events.add(doc, 'mouseup' , listeners.pointerUp ); - events.add(doc, 'mouseover', listeners.pointerOver ); - events.add(doc, 'mouseout' , listeners.pointerOut ); - - events.add(doc, 'touchstart' , listeners.selectorDown ); - events.add(doc, 'touchmove' , listeners.pointerMove ); - events.add(doc, 'touchend' , listeners.pointerUp ); - events.add(doc, 'touchcancel', listeners.pointerCancel); - - // autoscroll - events.add(doc, 'mousemove', listeners.autoScrollMove); - events.add(doc, 'touchmove', listeners.autoScrollMove); - } + state.options.targets.push(target); + } - events.add(win, 'blur', endAllInteractions); + ___pointer_38["default"].set(arg); - try { - if (win.frameElement) { - var parentDoc = win.frameElement.ownerDocument, - parentWindow = parentDoc.defaultView; + state.options = options; +} - events.add(parentDoc , 'mouseup' , listeners.pointerEnd); - events.add(parentDoc , 'touchend' , listeners.pointerEnd); - events.add(parentDoc , 'touchcancel' , listeners.pointerEnd); - events.add(parentDoc , 'pointerup' , listeners.pointerEnd); - events.add(parentDoc , 'MSPointerUp' , listeners.pointerEnd); - events.add(parentWindow, 'blur' , endAllInteractions ); - } - } - catch (error) { - interact.windowParentError = error; - } +var __defaults_38 = { + range: Infinity, + targets: null, + offset: null, + endOnly: false, + enabled: false +}; +var snapSize = { + start: __start_38, + set: __set_38, + defaults: __defaults_38 +}; +var ___default_38 = snapSize; +_$size_38["default"] = ___default_38; - // prevent native HTML5 drag on interact.js target elements - events.add(doc, 'dragstart', function (event) { - for (var i = 0; i < interactions.length; i++) { - var interaction = interactions[i]; +var _$edges_36 = {}; +"use strict"; - if (interaction.element - && (interaction.element === event.target - || nodeContains(interaction.element, event.target))) { +Object.defineProperty(_$edges_36, "__esModule", { + value: true +}); +_$edges_36["default"] = void 0; - interaction.checkAndPreventDefault(event, interaction.target, interaction.element); - return; - } - } +var ___clone_36 = ___interopRequireDefault_36(_$clone_49); + +var ___extend_36 = ___interopRequireDefault_36(_$extend_53); + +var _size = ___interopRequireDefault_36(_$size_38); + +function ___interopRequireDefault_36(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * @module modifiers/snapEdges + * + * @description + * This module allows snapping of the edges of targets during resize + * interactions. + * + * @example + * interact(target).resizable({ + * snapEdges: { + * targets: [interact.snappers.grid({ x: 100, y: 50 })], + * }, + * }) + * + * interact(target).resizable({ + * snapEdges: { + * targets: [ + * interact.snappers.grid({ + * top: 50, + * left: 50, + * bottom: 100, + * right: 100, + * }), + * ], + * }, + * }) + */ +function __start_36(arg) { + var edges = arg.interaction.prepared.edges; + + if (!edges) { + return null; + } + + arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']]; + return _size["default"].start(arg); +} + +function __set_36(arg) { + return _size["default"].set(arg); +} + +var snapEdges = { + start: __start_36, + set: __set_36, + defaults: (0, ___extend_36["default"])((0, ___clone_36["default"])(_size["default"].defaults), { + offset: { + x: 0, + y: 0 + } + }) +}; +var ___default_36 = snapEdges; +_$edges_36["default"] = ___default_36; + +var _$modifiers_31 = {}; +"use strict"; + +Object.defineProperty(_$modifiers_31, "__esModule", { + value: true +}); +_$modifiers_31.restrictSize = _$modifiers_31.restrictEdges = _$modifiers_31.restrictRect = _$modifiers_31.restrict = _$modifiers_31.snapEdges = _$modifiers_31.snapSize = _$modifiers_31.snap = void 0; + +var ___base_31 = ___interopRequireDefault_31(_$base_30); + +var ___edges_31 = ___interopRequireDefault_31(_$edges_32); + +var ___pointer_31 = ___interopRequireDefault_31(_$pointer_33); + +var ___rect_31 = ___interopRequireDefault_31(_$rect_34); + +var ___size_31 = ___interopRequireDefault_31(_$size_35); + +var _edges2 = ___interopRequireDefault_31(_$edges_36); + +var _pointer2 = ___interopRequireDefault_31(_$pointer_37); + +var _size2 = ___interopRequireDefault_31(_$size_38); + +function ___interopRequireDefault_31(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var __makeModifier_31 = ___base_31["default"].makeModifier; +var __snap_31 = __makeModifier_31(_pointer2["default"], 'snap'); +_$modifiers_31.snap = __snap_31; +var __snapSize_31 = __makeModifier_31(_size2["default"], 'snapSize'); +_$modifiers_31.snapSize = __snapSize_31; +var __snapEdges_31 = __makeModifier_31(_edges2["default"], 'snapEdges'); +_$modifiers_31.snapEdges = __snapEdges_31; +var __restrict_31 = __makeModifier_31(___pointer_31["default"], 'restrict'); +_$modifiers_31.restrict = __restrict_31; +var __restrictRect_31 = __makeModifier_31(___rect_31["default"], 'restrictRect'); +_$modifiers_31.restrictRect = __restrictRect_31; +var __restrictEdges_31 = __makeModifier_31(___edges_31["default"], 'restrictEdges'); +_$modifiers_31.restrictEdges = __restrictEdges_31; +var __restrictSize_31 = __makeModifier_31(___size_31["default"], 'restrictSize'); +_$modifiers_31.restrictSize = __restrictSize_31; + +var _$PointerEvent_39 = {}; +"use strict"; + +Object.defineProperty(_$PointerEvent_39, "__esModule", { + value: true +}); +_$PointerEvent_39["default"] = void 0; + +var ___BaseEvent2_39 = ___interopRequireDefault_39(_$BaseEvent_13); + +var ___pointerUtils_39 = ___interopRequireDefault_39(_$pointerUtils_61); + +function ___interopRequireDefault_39(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___typeof_39(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_39 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_39 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_39(obj); } + +function ___classCallCheck_39(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ___defineProperties_39(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ___createClass_39(Constructor, protoProps, staticProps) { if (protoProps) ___defineProperties_39(Constructor.prototype, protoProps); if (staticProps) ___defineProperties_39(Constructor, staticProps); return Constructor; } + +function ___possibleConstructorReturn_39(self, call) { if (call && (___typeof_39(call) === "object" || typeof call === "function")) { return call; } return ___assertThisInitialized_39(self); } + +function ___getPrototypeOf_39(o) { ___getPrototypeOf_39 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ___getPrototypeOf_39(o); } + +function ___assertThisInitialized_39(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ___inherits_39(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ___setPrototypeOf_39(subClass, superClass); } + +function ___setPrototypeOf_39(o, p) { ___setPrototypeOf_39 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ___setPrototypeOf_39(o, p); } + +/** */ +var PointerEvent = +/*#__PURE__*/ +function (_BaseEvent) { + ___inherits_39(PointerEvent, _BaseEvent); + + /** */ + function PointerEvent(type, pointer, event, eventTarget, interaction, timeStamp) { + var _this; + + ___classCallCheck_39(this, PointerEvent); + + _this = ___possibleConstructorReturn_39(this, ___getPrototypeOf_39(PointerEvent).call(this, interaction)); + + ___pointerUtils_39["default"].pointerExtend(___assertThisInitialized_39(_this), event); + + if (event !== pointer) { + ___pointerUtils_39["default"].pointerExtend(___assertThisInitialized_39(_this), pointer); + } + + _this.timeStamp = timeStamp; + _this.originalEvent = event; + _this.type = type; + _this.pointerId = ___pointerUtils_39["default"].getPointerId(pointer); + _this.pointerType = ___pointerUtils_39["default"].getPointerType(pointer); + _this.target = eventTarget; + _this.currentTarget = null; + + if (type === 'tap') { + var pointerIndex = interaction.getPointerIndex(pointer); + _this.dt = _this.timeStamp - interaction.pointers[pointerIndex].downTime; + var interval = _this.timeStamp - interaction.tapTime; + _this["double"] = !!(interaction.prevTap && interaction.prevTap.type !== 'doubletap' && interaction.prevTap.target === _this.target && interval < 500); + } else if (type === 'doubletap') { + _this.dt = pointer.timeStamp - interaction.tapTime; + } + + return _this; + } + + ___createClass_39(PointerEvent, [{ + key: "_subtractOrigin", + value: function _subtractOrigin(_ref) { + var originX = _ref.x, + originY = _ref.y; + this.pageX -= originX; + this.pageY -= originY; + this.clientX -= originX; + this.clientY -= originY; + return this; + } + }, { + key: "_addOrigin", + value: function _addOrigin(_ref2) { + var originX = _ref2.x, + originY = _ref2.y; + this.pageX += originX; + this.pageY += originY; + this.clientX += originX; + this.clientY += originY; + return this; + } + /** + * Prevent the default behaviour of the original Event + */ + + }, { + key: "preventDefault", + value: function preventDefault() { + this.originalEvent.preventDefault(); + } + }]); + + return PointerEvent; +}(___BaseEvent2_39["default"]); + +_$PointerEvent_39["default"] = PointerEvent; + +var _$base_40 = {}; +"use strict"; + +Object.defineProperty(_$base_40, "__esModule", { + value: true +}); +_$base_40["default"] = void 0; + +var __utils_40 = ___interopRequireWildcard_40(_$utils_56); + +var _PointerEvent = ___interopRequireDefault_40(_$PointerEvent_39); + +function ___interopRequireDefault_40(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_40(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +var signals = new __utils_40.Signals(); +var simpleSignals = ['down', 'up', 'cancel']; +var simpleEvents = ['down', 'up', 'cancel']; +var __defaults_40 = { + holdDuration: 600, + ignoreFrom: null, + allowFrom: null, + origin: { + x: 0, + y: 0 + } +}; +var pointerEvents = { + id: 'pointer-events/base', + install: __install_40, + signals: signals, + PointerEvent: _PointerEvent["default"], + fire: fire, + collectEventTargets: collectEventTargets, + createSignalListener: createSignalListener, + defaults: __defaults_40, + types: ['down', 'move', 'up', 'cancel', 'tap', 'doubletap', 'hold'] +}; + +function fire(arg, scope) { + var interaction = arg.interaction, + pointer = arg.pointer, + event = arg.event, + eventTarget = arg.eventTarget, + _arg$type = arg.type, + type = _arg$type === void 0 ? arg.pointerEvent.type : _arg$type, + _arg$targets = arg.targets, + targets = _arg$targets === void 0 ? collectEventTargets(arg) : _arg$targets; + var _arg$pointerEvent = arg.pointerEvent, + pointerEvent = _arg$pointerEvent === void 0 ? new _PointerEvent["default"](type, pointer, event, eventTarget, interaction, scope.now()) : _arg$pointerEvent; + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + targets: targets, + type: type, + pointerEvent: pointerEvent + }; + + for (var i = 0; i < targets.length; i++) { + var target = targets[i]; + + for (var prop in target.props || {}) { + pointerEvent[prop] = target.props[prop]; + } + + var origin = __utils_40.getOriginXY(target.eventable, target.node); + + pointerEvent._subtractOrigin(origin); + + pointerEvent.eventable = target.eventable; + pointerEvent.currentTarget = target.node; + target.eventable.fire(pointerEvent); + + pointerEvent._addOrigin(origin); + + if (pointerEvent.immediatePropagationStopped || pointerEvent.propagationStopped && i + 1 < targets.length && targets[i + 1].node !== pointerEvent.currentTarget) { + break; + } + } + + signals.fire('fired', signalArg); + + if (type === 'tap') { + // if pointerEvent should make a double tap, create and fire a doubletap + // PointerEvent and use that as the prevTap + var prevTap = pointerEvent["double"] ? fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'doubletap' + }, scope) : pointerEvent; + interaction.prevTap = prevTap; + interaction.tapTime = prevTap.timeStamp; + } + + return pointerEvent; +} + +function collectEventTargets(_ref) { + var interaction = _ref.interaction, + pointer = _ref.pointer, + event = _ref.event, + eventTarget = _ref.eventTarget, + type = _ref.type; + var pointerIndex = interaction.getPointerIndex(pointer); + var pointerInfo = interaction.pointers[pointerIndex]; // do not fire a tap event if the pointer was moved before being lifted + + if (type === 'tap' && (interaction.pointerWasMoved || // or if the pointerup target is different to the pointerdown target + !(pointerInfo && pointerInfo.downTarget === eventTarget))) { + return []; + } + + var path = __utils_40.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: type, + path: path, + targets: [], + node: null + }; + + for (var _i = 0; _i < path.length; _i++) { + var _ref2; + + _ref2 = path[_i]; + var node = _ref2; + signalArg.node = node; + signals.fire('collect-targets', signalArg); + } + + if (type === 'hold') { + signalArg.targets = signalArg.targets.filter(function (target) { + return target.eventable.options.holdDuration === interaction.pointers[pointerIndex].hold.duration; + }); + } + + return signalArg.targets; +} + +function __install_40(scope) { + var interactions = scope.interactions; + scope.pointerEvents = pointerEvents; + scope.defaults.actions.pointerEvents = pointerEvents.defaults; + interactions.signals.on('new', function (_ref3) { + var interaction = _ref3.interaction; + interaction.prevTap = null; // the most recent tap event on this interaction + + interaction.tapTime = 0; // time of the most recent tap event + }); + interactions.signals.on('update-pointer', function (_ref4) { + var down = _ref4.down, + pointerInfo = _ref4.pointerInfo; + + if (!down && pointerInfo.hold) { + return; + } + + pointerInfo.hold = { + duration: Infinity, + timeout: null + }; + }); + interactions.signals.on('move', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + duplicateMove = _ref5.duplicateMove; + var pointerIndex = interaction.getPointerIndex(pointer); + + if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) { + if (interaction.pointerIsDown) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + + fire({ + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'move' + }, scope); + } + }); + interactions.signals.on('down', function (_ref6) { + var interaction = _ref6.interaction, + pointer = _ref6.pointer, + event = _ref6.event, + eventTarget = _ref6.eventTarget, + pointerIndex = _ref6.pointerIndex; + var timer = interaction.pointers[pointerIndex].hold; + var path = __utils_40.dom.getPath(eventTarget); + var signalArg = { + interaction: interaction, + pointer: pointer, + event: event, + eventTarget: eventTarget, + type: 'hold', + targets: [], + path: path, + node: null + }; + + for (var _i2 = 0; _i2 < path.length; _i2++) { + var _ref7; + + _ref7 = path[_i2]; + var node = _ref7; + signalArg.node = node; + signals.fire('collect-targets', signalArg); + } + + if (!signalArg.targets.length) { + return; + } + + var minDuration = Infinity; + + for (var _i3 = 0; _i3 < signalArg.targets.length; _i3++) { + var _ref8; + + _ref8 = signalArg.targets[_i3]; + var target = _ref8; + var holdDuration = target.eventable.options.holdDuration; + + if (holdDuration < minDuration) { + minDuration = holdDuration; + } + } + + timer.duration = minDuration; + timer.timeout = setTimeout(function () { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'hold' + }, scope); + }, minDuration); + }); + var _arr = ['up', 'cancel']; + + for (var _i4 = 0; _i4 < _arr.length; _i4++) { + var signalName = _arr[_i4]; + interactions.signals.on(signalName, function (_ref10) { + var interaction = _ref10.interaction, + pointerIndex = _ref10.pointerIndex; + + if (interaction.pointers[pointerIndex].hold) { + clearTimeout(interaction.pointers[pointerIndex].hold.timeout); + } + }); + } + + for (var i = 0; i < simpleSignals.length; i++) { + interactions.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i], scope)); + } + + interactions.signals.on('up', function (_ref9) { + var interaction = _ref9.interaction, + pointer = _ref9.pointer, + event = _ref9.event, + eventTarget = _ref9.eventTarget; + + if (!interaction.pointerWasMoved) { + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: 'tap' + }, scope); + } + }); +} + +function createSignalListener(type, scope) { + return function (_ref11) { + var interaction = _ref11.interaction, + pointer = _ref11.pointer, + event = _ref11.event, + eventTarget = _ref11.eventTarget; + fire({ + interaction: interaction, + eventTarget: eventTarget, + pointer: pointer, + event: event, + type: type + }, scope); + }; +} + +var ___default_40 = pointerEvents; +_$base_40["default"] = ___default_40; + +var _$holdRepeat_41 = {}; +"use strict"; + +Object.defineProperty(_$holdRepeat_41, "__esModule", { + value: true +}); +_$holdRepeat_41["default"] = void 0; + +var ___base_41 = ___interopRequireDefault_41(_$base_40); + +function ___interopRequireDefault_41(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_41(scope) { + var pointerEvents = scope.pointerEvents, + interactions = scope.interactions; + scope.usePlugin(___base_41["default"]); + pointerEvents.signals.on('new', onNew); + pointerEvents.signals.on('fired', function (arg) { + return onFired(arg, scope); + }); + var _arr = ['move', 'up', 'cancel', 'endall']; + + for (var _i = 0; _i < _arr.length; _i++) { + var signal = _arr[_i]; + interactions.signals.on(signal, endHoldRepeat); + } // don't repeat by default + + + pointerEvents.defaults.holdRepeatInterval = 0; + pointerEvents.types.push('holdrepeat'); +} + +function onNew(_ref) { + var pointerEvent = _ref.pointerEvent; + + if (pointerEvent.type !== 'hold') { + return; + } + + pointerEvent.count = (pointerEvent.count || 0) + 1; +} + +function onFired(_ref2, scope) { + var interaction = _ref2.interaction, + pointerEvent = _ref2.pointerEvent, + eventTarget = _ref2.eventTarget, + targets = _ref2.targets; + + if (pointerEvent.type !== 'hold' || !targets.length) { + return; + } // get the repeat interval from the first eventable + + + var interval = targets[0].eventable.options.holdRepeatInterval; // don't repeat if the interval is 0 or less + + if (interval <= 0) { + return; + } // set a timeout to fire the holdrepeat event + + + interaction.holdIntervalHandle = setTimeout(function () { + scope.pointerEvents.fire({ + interaction: interaction, + eventTarget: eventTarget, + type: 'hold', + pointer: pointerEvent, + event: pointerEvent + }, scope); + }, interval); +} + +function endHoldRepeat(_ref3) { + var interaction = _ref3.interaction; + + // set the interaction's holdStopTime property + // to stop further holdRepeat events + if (interaction.holdIntervalHandle) { + clearInterval(interaction.holdIntervalHandle); + interaction.holdIntervalHandle = null; + } +} + +var ___default_41 = { + id: 'pointer-events/holdRepeat', + install: __install_41 +}; +_$holdRepeat_41["default"] = ___default_41; + +var _$interactableTargets_43 = {}; +"use strict"; + +Object.defineProperty(_$interactableTargets_43, "__esModule", { + value: true +}); +_$interactableTargets_43["default"] = void 0; + +/* removed: var _$arr_47 = require("@interactjs/utils/arr"); */; + +var ___extend_43 = ___interopRequireDefault_43(_$extend_53); + +function ___interopRequireDefault_43(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_43(scope) { + var pointerEvents = scope.pointerEvents, + actions = scope.actions, + Interactable = scope.Interactable, + interactables = scope.interactables; + pointerEvents.signals.on('collect-targets', function (_ref) { + var targets = _ref.targets, + node = _ref.node, + type = _ref.type, + eventTarget = _ref.eventTarget; + scope.interactables.forEachMatch(node, function (interactable) { + var eventable = interactable.events; + var options = eventable.options; + + if (eventable.types[type] && eventable.types[type].length && interactable.testIgnoreAllow(options, node, eventTarget)) { + targets.push({ + node: node, + eventable: eventable, + props: { + interactable: interactable + } }); + } + }); + }); + interactables.signals.on('new', function (_ref2) { + var interactable = _ref2.interactable; + + interactable.events.getRect = function (element) { + return interactable.getRect(element); + }; + }); + interactables.signals.on('set', function (_ref3) { + var interactable = _ref3.interactable, + options = _ref3.options; + (0, ___extend_43["default"])(interactable.events.options, pointerEvents.defaults); + (0, ___extend_43["default"])(interactable.events.options, options.pointerEvents || {}); + }); + (0, _$arr_47.merge)(actions.eventTypes, pointerEvents.types); + Interactable.prototype.pointerEvents = pointerEventsMethod; + var __backCompatOption = Interactable.prototype._backCompatOption; + + Interactable.prototype._backCompatOption = function (optionName, newValue) { + var ret = __backCompatOption.call(this, optionName, newValue); + + if (ret === this) { + this.events.options[optionName] = newValue; + } - if (events.useAttachEvent) { - // For IE's lack of Event#preventDefault - events.add(doc, 'selectstart', function (event) { - var interaction = interactions[0]; + return ret; + }; +} + +function pointerEventsMethod(options) { + (0, ___extend_43["default"])(this.events.options, options); + return this; +} + +var ___default_43 = { + id: 'pointer-events/interactableTargets', + install: __install_43 +}; +_$interactableTargets_43["default"] = ___default_43; + +var _$pointerEvents_42 = {}; +"use strict"; + +Object.defineProperty(_$pointerEvents_42, "__esModule", { + value: true +}); +_$pointerEvents_42.install = __install_42; +Object.defineProperty(_$pointerEvents_42, "pointerEvents", { + enumerable: true, + get: function get() { + return ___base_42["default"]; + } +}); +Object.defineProperty(_$pointerEvents_42, "holdRepeat", { + enumerable: true, + get: function get() { + return _holdRepeat["default"]; + } +}); +Object.defineProperty(_$pointerEvents_42, "interactableTargets", { + enumerable: true, + get: function get() { + return _interactableTargets["default"]; + } +}); +_$pointerEvents_42.id = void 0; + +var ___base_42 = ___interopRequireDefault_42(_$base_40); + +var _holdRepeat = ___interopRequireDefault_42(_$holdRepeat_41); + +var _interactableTargets = ___interopRequireDefault_42(_$interactableTargets_43); + +function ___interopRequireDefault_42(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function __install_42(scope) { + scope.usePlugin(___base_42["default"]); + scope.usePlugin(_holdRepeat["default"]); + scope.usePlugin(_interactableTargets["default"]); +} + +var __id_42 = 'pointer-events'; +_$pointerEvents_42.id = __id_42; + +var _$reflow_44 = {}; +"use strict"; + +Object.defineProperty(_$reflow_44, "__esModule", { + value: true +}); +_$reflow_44.install = __install_44; +_$reflow_44["default"] = void 0; + +/* removed: var _$InteractEvent_15 = require("@interactjs/core/InteractEvent"); */; + +/* removed: var _$utils_56 = require("@interactjs/utils"); */; + +_$InteractEvent_15.EventPhase.Reflow = 'reflow'; + +function __install_44(scope) { + var actions = scope.actions, + interactions = scope.interactions, + Interactable = scope.Interactable; // add action reflow event types + + for (var _i = 0; _i < actions.names.length; _i++) { + var _ref; + + _ref = actions.names[_i]; + var actionName = _ref; + actions.eventTypes.push("".concat(actionName, "reflow")); + } // remove completed reflow interactions + + + interactions.signals.on('stop', function (_ref2) { + var interaction = _ref2.interaction; + + if (interaction.pointerType === _$InteractEvent_15.EventPhase.Reflow) { + if (interaction._reflowResolve) { + interaction._reflowResolve(); + } + + _$utils_56.arr.remove(scope.interactions.list, interaction); + } + }); + /** + * ```js + * const interactable = interact(target) + * const drag = { name: drag, axis: 'x' } + * const resize = { name: resize, edges: { left: true, bottom: true } + * + * interactable.reflow(drag) + * interactable.reflow(resize) + * ``` + * + * Start an action sequence to re-apply modifiers, check drops, etc. + * + * @param { Object } action The action to begin + * @param { string } action.name The name of the action + * @returns { Promise } + */ + + Interactable.prototype.reflow = function (action) { + return reflow(this, action, scope); + }; +} + +function reflow(interactable, action, scope) { + var elements = _$utils_56.is.string(interactable.target) ? _$utils_56.arr.from(interactable._context.querySelectorAll(interactable.target)) : [interactable.target]; // tslint:disable-next-line variable-name + + var Promise = _$utils_56.win.window.Promise; + var promises = Promise ? [] : null; + + var _loop = function _loop() { + _ref3 = elements[_i2]; + var element = _ref3; + var rect = interactable.getRect(element); + + if (!rect) { + return "break"; + } - if (interaction.currentAction()) { - interaction.checkAndPreventDefault(event); - } - }); + var runningInteraction = _$utils_56.arr.find(scope.interactions.list, function (interaction) { + return interaction.interacting() && interaction.interactable === interactable && interaction.element === element && interaction.prepared.name === action.name; + }); - // For IE's bad dblclick event sequence - events.add(doc, 'dblclick', doOnInteractions('ie8Dblclick')); - } + var reflowPromise = void 0; + + if (runningInteraction) { + runningInteraction.move(); + + if (promises) { + reflowPromise = runningInteraction._reflowPromise || new Promise(function (resolve) { + runningInteraction._reflowResolve = resolve; + }); + } + } else { + var xywh = _$utils_56.rect.tlbrToXywh(rect); + + var coords = { + page: { + x: xywh.x, + y: xywh.y + }, + client: { + x: xywh.x, + y: xywh.y + }, + timeStamp: scope.now() + }; + + var event = _$utils_56.pointer.coordsToEvent(coords); - documents.push(doc); + reflowPromise = startReflow(scope, interactable, element, action, event); } - listenToDocument(document); + if (promises) { + promises.push(reflowPromise); + } + }; + + for (var _i2 = 0; _i2 < elements.length; _i2++) { + var _ref3; + + var _ret = _loop(); + + if (_ret === "break") break; + } + + return promises && Promise.all(promises).then(function () { + return interactable; + }); +} + +function startReflow(scope, interactable, element, action, event) { + var interaction = scope.interactions["new"]({ + pointerType: 'reflow' + }); + var signalArg = { + interaction: interaction, + event: event, + pointer: event, + eventTarget: element, + phase: _$InteractEvent_15.EventPhase.Reflow + }; + interaction.interactable = interactable; + interaction.element = element; + interaction.prepared = (0, _$utils_56.extend)({}, action); + interaction.prevEvent = event; + interaction.updatePointer(event, event, element, true); + + interaction._doPhase(signalArg); + + var reflowPromise = _$utils_56.win.window.Promise ? new _$utils_56.win.window.Promise(function (resolve) { + interaction._reflowResolve = resolve; + }) : null; + interaction._reflowPromise = reflowPromise; + interaction.start(action, interactable, element); + + if (interaction._interacting) { + interaction.move(signalArg); + interaction.end(event); + } else { + interaction.stop(); + } + + interaction.removePointer(event, event); + interaction.pointerIsDown = false; + return reflowPromise; +} + +var ___default_44 = { + id: 'reflow', + install: __install_44 +}; +_$reflow_44["default"] = ___default_44; + +var _$interact_28 = {}; +"use strict"; + +Object.defineProperty(_$interact_28, "__esModule", { + value: true +}); +_$interact_28["default"] = _$interact_28.scope = _$interact_28.interact = void 0; + +var ___scope_28 = _$scope_24({}); + +var __utils_28 = ___interopRequireWildcard_28(_$utils_56); + +var ___browser_28 = ___interopRequireDefault_28(_$browser_48); + +var ___events_28 = ___interopRequireDefault_28(_$events_52); + +function ___interopRequireDefault_28(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_28(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +/** @module interact */ +var globalEvents = {}; +var scope = new ___scope_28.Scope(); +/** + * ```js + * interact('#draggable').draggable(true) + * + * var rectables = interact('rect') + * rectables + * .gesturable(true) + * .on('gesturemove', function (event) { + * // ... + * }) + * ``` + * + * The methods of this variable can be used to set elements as interactables + * and also to change various default settings. + * + * Calling it as a function and passing an element or a valid CSS selector + * string returns an Interactable object which has various methods to configure + * it. + * + * @global + * + * @param {Element | string} target The HTML or SVG Element to interact with + * or CSS selector + * @return {Interactable} + */ + +_$interact_28.scope = scope; - function indexOf (array, target) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === target) { - return i; - } - } +var interact = function interact(target, options) { + var interactable = scope.interactables.get(target, options); + + if (!interactable) { + interactable = scope.interactables["new"](target, options); + interactable.events.global = globalEvents; + } - return -1; + return interactable; +}; +/** + * Use a plugin + * + * @alias module:interact.use + * + * @param {Object} plugin + * @param {function} plugin.install + * @return {interact} + */ + + +_$interact_28.interact = interact; +interact.use = use; + +function use(plugin, options) { + scope.usePlugin(plugin, options); + return interact; +} +/** + * Check if an element or selector has been set with the {@link interact} + * function + * + * @alias module:interact.isSet + * + * @param {Element} element The Element being searched for + * @return {boolean} Indicates if the element or CSS selector was previously + * passed to interact + */ + + +interact.isSet = isSet; + +function isSet(target, options) { + return !!scope.interactables.get(target, options && options.context); +} +/** + * Add a global listener for an InteractEvent or adds a DOM event to `document` + * + * @alias module:interact.on + * + * @param {string | array | object} type The types of events to listen for + * @param {function} listener The function event (s) + * @param {object | boolean} [options] object or useCapture flag for + * addEventListener + * @return {object} interact + */ + + +interact.on = on; + +function on(type, listener, options) { + if (__utils_28.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_28.is.array(type)) { + for (var _i = 0; _i < type.length; _i++) { + var _ref; + + _ref = type[_i]; + var eventType = _ref; + interact.on(eventType, listener, options); } - function contains (array, target) { - return indexOf(array, target) !== -1; + return interact; + } + + if (__utils_28.is.object(type)) { + for (var prop in type) { + interact.on(prop, type[prop], listener); } - function matchesSelector (element, selector, nodeList) { - if (ie8MatchesSelector) { - return ie8MatchesSelector(element, selector, nodeList); - } + return interact; + } // if it is an InteractEvent type, add listener to globalEvents - // remove /deep/ from selectors if shadowDOM polyfill is used - if (window !== realWindow) { - selector = selector.replace(/\/deep\//g, ' '); - } - return element[prefixedMatchesSelector](selector); + if (__utils_28.arr.contains(scope.actions.eventTypes, type)) { + // if this type of event was never bound + if (!globalEvents[type]) { + globalEvents[type] = [listener]; + } else { + globalEvents[type].push(listener); + } + } // If non InteractEvent type, addEventListener to document + else { + ___events_28["default"].add(scope.document, type, listener, { + options: options + }); } - function matchesUpTo (element, selector, limit) { - while (isElement(element)) { - if (matchesSelector(element, selector)) { - return true; - } + return interact; +} +/** + * Removes a global InteractEvent listener or DOM event from `document` + * + * @alias module:interact.off + * + * @param {string | array | object} type The types of events that were listened + * for + * @param {function} listener The listener function to be removed + * @param {object | boolean} options [options] object or useCapture flag for + * removeEventListener + * @return {object} interact + */ - element = parentElement(element); - if (element === limit) { - return matchesSelector(element, selector); - } - } +interact.off = off; - return false; +function off(type, listener, options) { + if (__utils_28.is.string(type) && type.search(' ') !== -1) { + type = type.trim().split(/ +/); + } + + if (__utils_28.is.array(type)) { + for (var _i2 = 0; _i2 < type.length; _i2++) { + var _ref2; + + _ref2 = type[_i2]; + var eventType = _ref2; + interact.off(eventType, listener, options); } - // For IE8's lack of an Element#matchesSelector - // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified - if (!(prefixedMatchesSelector in Element.prototype) || !isFunction(Element.prototype[prefixedMatchesSelector])) { - ie8MatchesSelector = function (element, selector, elems) { - elems = elems || element.parentNode.querySelectorAll(selector); + return interact; + } - for (var i = 0, len = elems.length; i < len; i++) { - if (elems[i] === element) { - return true; - } - } + if (__utils_28.is.object(type)) { + for (var prop in type) { + interact.off(prop, type[prop], listener); + } - return false; - }; + return interact; + } + + if (!__utils_28.arr.contains(scope.actions.eventTypes, type)) { + ___events_28["default"].remove(scope.document, type, listener, options); + } else { + var index; + + if (type in globalEvents && (index = globalEvents[type].indexOf(listener)) !== -1) { + globalEvents[type].splice(index, 1); } + } - // requestAnimationFrame polyfill - (function() { - var lastTime = 0, - vendors = ['ms', 'moz', 'webkit', 'o']; + return interact; +} +/** + * Returns an object which exposes internal data + * @alias module:interact.debug + * + * @return {object} An object with properties that outline the current state + * and expose internal functions and variables + */ - for(var x = 0; x < vendors.length && !realWindow.requestAnimationFrame; ++x) { - reqFrame = realWindow[vendors[x]+'RequestAnimationFrame']; - cancelFrame = realWindow[vendors[x]+'CancelAnimationFrame'] || realWindow[vendors[x]+'CancelRequestAnimationFrame']; - } - if (!reqFrame) { - reqFrame = function(callback) { - var currTime = new Date().getTime(), - timeToCall = Math.max(0, 16 - (currTime - lastTime)), - id = setTimeout(function() { callback(currTime + timeToCall); }, - timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - } +interact.debug = debug; - if (!cancelFrame) { - cancelFrame = function(id) { - clearTimeout(id); - }; - } - }()); +function debug() { + return scope; +} // expose the functions used to calculate multi-touch properties - /* global exports: true, module, define */ - // http://documentcloud.github.io/underscore/docs/underscore.html#section-11 - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { - exports = module.exports = interact; - } - exports.interact = interact; +interact.getPointerAverage = __utils_28.pointer.pointerAverage; +interact.getTouchBBox = __utils_28.pointer.touchBBox; +interact.getTouchDistance = __utils_28.pointer.touchDistance; +interact.getTouchAngle = __utils_28.pointer.touchAngle; +interact.getElementRect = __utils_28.dom.getElementRect; +interact.getElementClientRect = __utils_28.dom.getElementClientRect; +interact.matchesSelector = __utils_28.dom.matchesSelector; +interact.closest = __utils_28.dom.closest; +/** + * @alias module:interact.supportsTouch + * + * @return {boolean} Whether or not the browser supports touch input + */ + +interact.supportsTouch = supportsTouch; + +function supportsTouch() { + return ___browser_28["default"].supportsTouch; +} +/** + * @alias module:interact.supportsPointerEvent + * + * @return {boolean} Whether or not the browser supports PointerEvents + */ + + +interact.supportsPointerEvent = supportsPointerEvent; + +function supportsPointerEvent() { + return ___browser_28["default"].supportsPointerEvent; +} +/** + * Cancels all interactions (end events are not fired) + * + * @alias module:interact.stop + * + * @return {object} interact + */ + + +interact.stop = __stop_28; + +function __stop_28() { + for (var _i3 = 0; _i3 < scope.interactions.list.length; _i3++) { + var _ref3; + + _ref3 = scope.interactions.list[_i3]; + var interaction = _ref3; + interaction.stop(); + } + + return interact; +} +/** + * Returns or sets the distance the pointer must be moved before an action + * sequence occurs. This also affects tolerance for tap events. + * + * @alias module:interact.pointerMoveTolerance + * + * @param {number} [newValue] The movement from the start position must be greater than this value + * @return {interact | number} + */ + + +interact.pointerMoveTolerance = pointerMoveTolerance; + +function pointerMoveTolerance(newValue) { + if (__utils_28.is.number(newValue)) { + scope.interactions.pointerMoveTolerance = newValue; + return interact; + } + + return scope.interactions.pointerMoveTolerance; +} + +scope.interactables.signals.on('unset', function (_ref4) { + var interactable = _ref4.interactable; + scope.interactables.list.splice(scope.interactables.list.indexOf(interactable), 1); // Stop related interactions when an Interactable is unset + + for (var _i4 = 0; _i4 < scope.interactions.list.length; _i4++) { + var _ref5; + + _ref5 = scope.interactions.list[_i4]; + var interaction = _ref5; + + if (interaction.interactable === interactable && interaction.interacting() && !interaction._ending) { + interaction.stop(); } - // AMD - else if (typeof define === 'function' && define.amd) { - define('interact', function() { - return interact; - }); + } +}); + +interact.addDocument = function (doc, options) { + return scope.addDocument(doc, options); +}; + +interact.removeDocument = function (doc) { + return scope.removeDocument(doc); +}; + +scope.interact = interact; +var ___default_28 = interact; +_$interact_28["default"] = ___default_28; + +var _$interact_27 = {}; +"use strict"; + +Object.defineProperty(_$interact_27, "__esModule", { + value: true +}); +_$interact_27.init = __init_27; +Object.defineProperty(_$interact_27, "autoScroll", { + enumerable: true, + get: function get() { + return _autoScroll["default"]; + } +}); +Object.defineProperty(_$interact_27, "interactablePreventDefault", { + enumerable: true, + get: function get() { + return _interactablePreventDefault["default"]; + } +}); +Object.defineProperty(_$interact_27, "inertia", { + enumerable: true, + get: function get() { + return _inertia["default"]; + } +}); +Object.defineProperty(_$interact_27, "modifiers", { + enumerable: true, + get: function get() { + return ___base_27["default"]; + } +}); +Object.defineProperty(_$interact_27, "reflow", { + enumerable: true, + get: function get() { + return _reflow["default"]; + } +}); +Object.defineProperty(_$interact_27, "interact", { + enumerable: true, + get: function get() { + return _interact["default"]; + } +}); +_$interact_27.pointerEvents = _$interact_27.actions = _$interact_27["default"] = void 0; + +var actions = ___interopRequireWildcard_27(_$actions_5); + +_$interact_27.actions = actions; + +var _autoScroll = ___interopRequireDefault_27(_$autoScroll_7); + +var autoStart = ___interopRequireWildcard_27(_$autoStart_12); + +var _interactablePreventDefault = ___interopRequireDefault_27(_$interactablePreventDefault_21); + +var _devTools = ___interopRequireDefault_27(_$devTools_25); + +var _inertia = ___interopRequireDefault_27(_$inertia_26); + +var modifiers = ___interopRequireWildcard_27(_$modifiers_31); + +var ___base_27 = ___interopRequireDefault_27(_$base_30); + +var __pointerEvents_27 = ___interopRequireWildcard_27(_$pointerEvents_42); + +_$interact_27.pointerEvents = __pointerEvents_27; + +var _reflow = ___interopRequireDefault_27(_$reflow_44); + +var _interact = ___interopRequireWildcard_27(_$interact_28); + +function ___interopRequireDefault_27(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_27(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function __init_27(window) { + _interact.scope.init(window); + + _interact["default"].use(_interactablePreventDefault["default"]); // pointerEvents + + + _interact["default"].use(__pointerEvents_27); // inertia + + + _interact["default"].use(_inertia["default"]); // autoStart, hold + + + _interact["default"].use(autoStart); // drag and drop, resize, gesture + + + _interact["default"].use(actions); // snap, resize, etc. + + + _interact["default"].use(___base_27["default"]); // for backwrads compatibility + + + for (var type in modifiers) { + var _modifiers$type = modifiers[type], + _defaults = _modifiers$type._defaults, + _methods = _modifiers$type._methods; + _defaults._methods = _methods; + _interact.scope.defaults.perAction[type] = _defaults; + } // autoScroll + + + _interact["default"].use(_autoScroll["default"]); // reflow + + + _interact["default"].use(_reflow["default"]); // eslint-disable-next-line no-undef + + + if ("production" !== 'production') { + _interact["default"].use(_devTools["default"]); + } + + return _interact["default"]; +} // eslint-disable-next-line no-undef + + +_interact["default"].version = "1.5.3"; +var ___default_27 = _interact["default"]; +_$interact_27["default"] = ___default_27; + +var _$types_45 = {}; +/// +"use strict"; + +var _$grid_64 = {}; +"use strict"; + +Object.defineProperty(_$grid_64, "__esModule", { + value: true +}); +_$grid_64["default"] = void 0; + +function ___slicedToArray_64(arr, i) { return ___arrayWithHoles_64(arr) || ___iterableToArrayLimit_64(arr, i) || ___nonIterableRest_64(); } + +function ___nonIterableRest_64() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function ___iterableToArrayLimit_64(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function ___arrayWithHoles_64(arr) { if (Array.isArray(arr)) return arr; } + +function createGrid(grid) { + var coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(function (_ref) { + var _ref2 = ___slicedToArray_64(_ref, 2), + xField = _ref2[0], + yField = _ref2[1]; + + return xField in grid || yField in grid; + }); + return function (x, y) { + var range = grid.range, + _grid$limits = grid.limits, + limits = _grid$limits === void 0 ? { + left: -Infinity, + right: Infinity, + top: -Infinity, + bottom: Infinity + } : _grid$limits, + _grid$offset = grid.offset, + offset = _grid$offset === void 0 ? { + x: 0, + y: 0 + } : _grid$offset; + var result = { + range: range + }; + + for (var _i2 = 0; _i2 < coordFields.length; _i2++) { + var _ref3; + + _ref3 = coordFields[_i2]; + + var _ref4 = _ref3, + _ref5 = ___slicedToArray_64(_ref4, 2), + xField = _ref5[0], + yField = _ref5[1]; + + var gridx = Math.round((x - offset.x) / grid[xField]); + var gridy = Math.round((y - offset.y) / grid[yField]); + result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x)); + result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y)); } - else { - realWindow.interact = interact; + + return result; + }; +} + +var ___default_64 = createGrid; +_$grid_64["default"] = ___default_64; + +var _$snappers_65 = {}; +"use strict"; + +Object.defineProperty(_$snappers_65, "__esModule", { + value: true +}); +Object.defineProperty(_$snappers_65, "grid", { + enumerable: true, + get: function get() { + return _grid["default"]; + } +}); + +var _grid = ___interopRequireDefault_65(_$grid_64); + +function ___interopRequireDefault_65(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _$index_29 = { exports: {} }; +"use strict"; + +Object.defineProperty(_$index_29.exports, "__esModule", { + value: true +}); +_$index_29.exports.init = __init_29; +_$index_29.exports["default"] = void 0; + +var ___interact_29 = ___interopRequireWildcard_29(_$interact_27); + +var __modifiers_29 = ___interopRequireWildcard_29(_$modifiers_31); + +_$types_45; + +var ___extend_29 = ___interopRequireDefault_29(_$extend_53); + +var snappers = ___interopRequireWildcard_29(_$snappers_65); + +function ___interopRequireDefault_29(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function ___interopRequireWildcard_29(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } } + +function ___typeof_29(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ___typeof_29 = function _typeof(obj) { return typeof obj; }; } else { ___typeof_29 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ___typeof_29(obj); } + +if ((typeof window === "undefined" ? "undefined" : ___typeof_29(window)) === 'object' && !!window) { + __init_29(window); +} + +function __init_29(win) { + (0, ___interact_29.init)(win); + return ___interact_29["default"].use({ + id: 'interactjs', + install: function install() { + ___interact_29["default"].modifiers = (0, ___extend_29["default"])({}, __modifiers_29); + ___interact_29["default"].snappers = snappers; + ___interact_29["default"].createSnapGrid = ___interact_29["default"].snappers.grid; } + }); +} + +var ___default_29 = ___interact_29["default"]; +_$index_29.exports["default"] = ___default_29; +___interact_29["default"]['default'] = ___interact_29["default"]; // tslint:disable-line no-string-literal + +___interact_29["default"]['init'] = __init_29; // tslint:disable-line no-string-literal + +if (("object" === "undefined" ? "undefined" : ___typeof_29(_$index_29)) === 'object' && !!_$index_29) { + _$index_29.exports = ___interact_29["default"]; +} + +_$index_29 = _$index_29.exports +return _$index_29; + +}); + -} (typeof window === 'undefined'? undefined : window)); \ No newline at end of file +//# sourceMappingURL=interact.js.map diff --git a/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.min.js b/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.min.js index 04df7fb47..59360f3cd 100644 --- a/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.min.js +++ b/src/main/resources/gwt/material/design/addins/client/dnd/resources/js/interact.min.js @@ -1,124 +1,4 @@ -/* interact.js v1.2.6 | https://raw.github.com/taye/interact.js/master/LICENSE */ (function(F){function ma(){}function t(a){if(!a||"object"!==typeof a)return!1;var b=V(a)||q;return/object|function/.test(typeof b.Element)?a instanceof b.Element:1===a.nodeType&&"string"===typeof a.nodeName}function Ba(a){return a===q||!(!a||!a.Window)&&a instanceof a.Window}function da(a){return z(a)&&void 0!==typeof a.length&&A(a.splice)}function z(a){return!!a&&"object"===typeof a}function A(a){return"function"===typeof a}function K(a){return"number"===typeof a}function H(a){return"boolean"=== - typeof a}function N(a){return"string"===typeof a}function ea(a){if(!N(a))return!1;Q.querySelector(a);return!0}function x(a,b){for(var c in b)a[c]=b[c];return a}function ra(a,b){for(var c in b){var d=!1,e;for(e in Ca)if(0===c.indexOf(e)&&Ca[e].test(c)){d=!0;break}d||(a[c]=b[c])}return a}function sa(a,b){a.page=a.page||{};a.page.x=b.page.x;a.page.y=b.page.y;a.client=a.client||{};a.client.x=b.client.x;a.client.y=b.client.y;a.timeStamp=b.timeStamp}function Ta(a,b,c){a.page.x=c.page.x-b.page.x;a.page.y= - c.page.y-b.page.y;a.client.x=c.client.x-b.client.x;a.client.y=c.client.y-b.client.y;a.timeStamp=(new Date).getTime()-b.timeStamp;b=Math.max(a.timeStamp/1E3,.001);a.page.speed=fa(a.page.x,a.page.y)/b;a.page.vx=a.page.x/b;a.page.vy=a.page.y/b;a.client.speed=fa(a.client.x,a.page.y)/b;a.client.vx=a.client.x/b;a.client.vy=a.client.y/b}function Ua(a){return a instanceof q.Event||ga&&q.Touch&&a instanceof q.Touch}function ta(a,b,c){c=c||{};a=a||"page";c.x=b[a+"X"];c.y=b[a+"Y"];return c}function Da(a,b){b= - b||{};Va&&Ua(a)?(ta("screen",a,b),b.x+=q.scrollX,b.y+=q.scrollY):ta("page",a,b);return b}function Wa(a,b){b=b||{};Va&&Ua(a)?ta("screen",a,b):ta("client",a,b);return b}function O(a){return K(a.pointerId)?a.pointerId:a.identifier}function Ea(a){return a instanceof nb?a.correspondingUseElement:a}function V(a){if(Ba(a))return a;a=a.ownerDocument||a;return a.defaultView||a.parentWindow||q}function Fa(a){return(a=a instanceof Xa?a.getBoundingClientRect():a.getClientRects()[0])&&{left:a.left,right:a.right, - top:a.top,bottom:a.bottom,width:a.width||a.right-a.left,height:a.height||a.bottom-a.top}}function ua(a){var b,c=Fa(a);!ob&&c&&(b=(b=V(a))||q,a=b.scrollX||b.document.documentElement.scrollLeft,b=b.scrollY||b.document.documentElement.scrollTop,c.left+=a,c.right+=a,c.top+=b,c.bottom+=b);return c}function Ga(a){var b=[];da(a)?(b[0]=a[0],b[1]=a[1]):"touchend"===a.type?1===a.touches.length?(b[0]=a.touches[0],b[1]=a.changedTouches[0]):0===a.touches.length&&(b[0]=a.changedTouches[0],b[1]=a.changedTouches[1]): - (b[0]=a.touches[0],b[1]=a.touches[1]);return b}function Ya(a){for(var b={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},c,d=0;db?d+=360+d/360|0:-135>b&&(d+=180+d/360|0));return d}function na(a,b){var c=a?a.options.origin:D.origin;"parent"===c?c=L(b):"self"===c?c=a.getRect(b):ea(c)&&(c=Ka(b,c)||{x:0,y:0});A(c)&&(c=c(a&&b));t(c)&&(c=ua(c));c.x="x"in c?c.x:c.left;c.y="y"in -c?c.y:c.top;return c}function Za(a,b,c,d){var e=1-a;return e*e*b+2*e*a*c+a*a*d}function Y(a,b){for(;b;){if(b===a)return!0;b=b.parentNode}return!1}function Ka(a,b){for(var c=L(a);t(c);){if(R(c,b))return c;c=L(c)}return null}function L(a){if((a=a.parentNode)&&a instanceof $a)for(;(a=a.host)&&a&&a instanceof $a;);return a}function va(a,b){return a._context===b.ownerDocument||Y(a._context,b)}function Z(a,b,c){return(a=a.options.ignoreFrom)&&t(c)?N(a)?La(c,a,b):t(a)?Y(a,c):!1:!1}function aa(a,b,c){return(a= - a.options.allowFrom)?t(c)?N(a)?La(c,a,b):t(a)?Y(a,c):!1:!1:!0}function ab(a,b){if(!b)return!1;var c=b.options.drag.axis;return"xy"===a||"xy"===c||c===a}function Ma(a,b){var c=a.options;/^resize/.test(b)&&(b="resize");return c[b].snap&&c[b].snap.enabled}function Na(a,b){var c=a.options;/^resize/.test(b)&&(b="resize");return c[b].restrict&&c[b].restrict.enabled}function ha(a,b,c){for(var d=a.options,e=d[c.name].max,d=d[c.name].maxPerElement,h=0,f=0,g=0,k=0,y=r.length;k=wa||n.target===a&&(f+=u===c.name|0,f>=e||n.element===b&&(g++,u!==c.name||g>=d))))return!1}return 0(new Date).getTime()-db)return}if(c=bb(b,b.type,d))c._updateEventTargets(d,e),c[a](b,b,d,e)}}}function G(a,b,c,d,e,h){var f,g,k=a.target,y=a.snapStatus,n=a.restrictStatus,u=a.pointers,E=(k&&k.options||D).deltaSource,eb=E+"X",l=E+"Y",ia=k?k.options:D,w=na(k,e),m="start"===d,p="end"===d;f=m?a.startCoords:a.curCoords;e=e||a.element;g=x({},f.page);f=x({},f.client);g.x-=w.x;g.y-=w.y;f.x-=w.x;f.y-=w.y;var I=ia[c].snap&&ia[c].snap.relativePoints;!Ma(k,c)||m&&I&&I.length||(this.snap={range:y.range, - locked:y.locked,x:y.snappedX,y:y.snappedY,realX:y.realX,realY:y.realY,dx:y.dx,dy:y.dy},y.locked&&(g.x+=y.dx,g.y+=y.dy,f.x+=y.dx,f.y+=y.dy));!Na(k,c)||m&&ia[c].restrict.elementRect||!n.restricted||(g.x+=n.dx,g.y+=n.dy,f.x+=n.dx,f.y+=n.dy,this.restrict={dx:n.dx,dy:n.dy});this.pageX=g.x;this.pageY=g.y;this.clientX=f.x;this.clientY=f.y;this.x0=a.startCoords.page.x-w.x;this.y0=a.startCoords.page.y-w.y;this.clientX0=a.startCoords.client.x-w.x;this.clientY0=a.startCoords.client.y-w.y;this.ctrlKey=b.ctrlKey; - this.altKey=b.altKey;this.shiftKey=b.shiftKey;this.metaKey=b.metaKey;this.button=b.button;this.buttons=b.buttons;this.target=e;this.t0=a.downTimes[0];this.type=c+(d||"");this.interaction=a;this.interactable=k;e=a.inertiaStatus;e.active&&(this.detail="inertia");h&&(this.relatedTarget=h);p?"client"===E?(this.dx=f.x-a.startCoords.client.x,this.dy=f.y-a.startCoords.client.y):(this.dx=g.x-a.startCoords.page.x,this.dy=g.y-a.startCoords.page.y):m?this.dy=this.dx=0:"inertiastart"===d?(this.dx=a.prevEvent.dx, - this.dy=a.prevEvent.dy):"client"===E?(this.dx=f.x-a.prevEvent.clientX,this.dy=f.y-a.prevEvent.clientY):(this.dx=g.x-a.prevEvent.pageX,this.dy=g.y-a.prevEvent.pageY);a.prevEvent&&"inertia"===a.prevEvent.detail&&!e.active&&ia[c].inertia&&ia[c].inertia.zeroResumeDelta&&(e.resumeDx+=this.dx,e.resumeDy+=this.dy,this.dx=this.dy=0);"resize"===c&&a.resizeAxes?ia.resize.square?("y"===a.resizeAxes?this.dx=this.dy:this.dy=this.dx,this.axes="xy"):(this.axes=a.resizeAxes,"x"===a.resizeAxes?this.dy=0:"y"===a.resizeAxes&& - (this.dx=0)):"gesture"===c&&(this.touches=[u[0],u[1]],m?(this.distance=Ia(u,E),this.box=Ha(u),this.scale=1,this.ds=0,this.angle=Ja(u,void 0,E),this.da=0):p||b instanceof G?(this.distance=a.prevEvent.distance,this.box=a.prevEvent.box,this.scale=a.prevEvent.scale,this.ds=this.scale-1,this.angle=a.prevEvent.angle,this.da=this.angle-a.gesture.startAngle):(this.distance=Ia(u,E),this.box=Ha(u),this.scale=this.distance/a.gesture.startDistance,this.angle=Ja(u,a.gesture.prevAngle,E),this.ds=this.scale-a.gesture.prevScale, - this.da=this.angle-a.gesture.prevAngle));m?(this.timeStamp=a.downTimes[0],this.velocityY=this.velocityX=this.speed=this.duration=this.dt=0):"inertiastart"===d?(this.timeStamp=a.prevEvent.timeStamp,this.dt=a.prevEvent.dt,this.duration=a.prevEvent.duration,this.speed=a.prevEvent.speed,this.velocityX=a.prevEvent.velocityX,this.velocityY=a.prevEvent.velocityY):(this.timeStamp=(new Date).getTime(),this.dt=this.timeStamp-a.prevEvent.timeStamp,this.duration=this.timeStamp-a.downTimes[0],b instanceof G?(b= - this[eb]-a.prevEvent[eb],l=this[l]-a.prevEvent[l],c=this.dt/1E3,this.speed=fa(b,l)/c,this.velocityX=b/c,this.velocityY=l/c):(this.speed=a.pointerDelta[E].speed,this.velocityX=a.pointerDelta[E].vx,this.velocityY=a.pointerDelta[E].vy));(p||"inertiastart"===d)&&600this.timeStamp-a.prevEvent.timeStamp&&(d=180*Math.atan2(a.prevEvent.velocityY,a.prevEvent.velocityX)/Math.PI,0>d&&(d+=360),p=112.5<=d&&247.5>d,l=202.5<=d&&337.5>d,this.swipe={up:l,down:!l&&22.5<=d&&157.5>d,left:p,right:!p&& - (292.5<=d||67.5>d),angle:d,speed:a.prevEvent.speed,velocity:{x:a.prevEvent.velocityX,y:a.prevEvent.velocityY}})}function fb(){this.originalEvent.preventDefault()}function gb(a){var b="";"drag"===a.name&&(b=za.drag);if("resize"===a.name)if(a.axis)b=za[a.name+a.axis];else if(a.edges){for(var b="resize",c=["top","bottom","left","right"],d=0;4>d;d++)a.edges[c[d]]&&(b+=c[d]);b=za[b]}return b}function hb(a,b,c){a=this.getRect(c);var d=!1,e=null,h=null,f,g=x({},b.curCoords.page),e=this.options;if(!a)return null; - if(S.resize&&e.resize.enabled)if(d=e.resize,f={left:!1,right:!1,top:!1,bottom:!1},z(d.edges)){for(var k in f){var y=f,n=k,u;a:{u=k;var E=d.edges[k],l=g,m=b._eventTarget,p=c,w=a,ya=d.margin||pa;if(E){if(!0===E){var q=K(w.width)?w.width:w.right-w.left,I=K(w.height)?w.height:w.bottom-w.top;0>q&&("left"===u?u="right":"right"===u&&(u="left"));0>I&&("top"===u?u="bottom":"bottom"===u&&(u="top"));if("left"===u){u=l.x<(0<=q?w.left:w.right)+ya;break a}if("top"===u){u=l.y<(0<=I?w.top:w.bottom)+ya;break a}if("right"=== - u){u=l.x>(0<=q?w.right:w.left)-ya;break a}if("bottom"===u){u=l.y>(0<=I?w.bottom:w.top)-ya;break a}}u=t(m)?t(E)?E===m:La(m,E,p):!1}else u=!1}y[n]=u}f.left=f.left&&!f.right;f.top=f.top&&!f.bottom;d=f.left||f.right||f.top||f.bottom}else c="y"!==e.resize.axis&&g.x>a.right-pa,a="x"!==e.resize.axis&&g.y>a.bottom-pa,d=c||a,h=(c?"x":"")+(a?"y":"");e=d?"resize":S.drag&&e.drag.enabled?"drag":null;S.gesture&&2<=b.pointerIds.length&&!b.dragging&&!b.resizing&&(e="gesture");return e?{name:e,axis:h,edges:f}:null} - function W(a,b){if(!z(a))return null;var c=a.name,d=b.options;return("resize"===c&&d.resize.enabled||"drag"===c&&d.drag.enabled||"gesture"===c&&d.gesture.enabled)&&S[c]?a:null}function qa(a,b){var c={},d=P[a.type],e=Ea(a.path?a.path[0]:a.target),h=e;b=b?!0:!1;for(var f in a)c[f]=a[f];c.originalEvent=a;for(c.preventDefault=fb;t(h);){for(f=0;fthis.pointerIds.length&&(f=null),this.prepared.name=f.name,this.prepared.axis=f.axis,this.prepared.edges=f.edges,this.snapStatus.snappedX=this.snapStatus.snappedY=this.restrictStatus.restrictedX=this.restrictStatus.restrictedY=NaN,this.downTimes[h]=(new Date).getTime(),this.downTargets[h]=c,ra(this.downPointer,a),sa(this.prevCoords,this.startCoords),this.pointerWasMoved=!1,this.checkAndPreventDefault(b,g,this.element)))}},setModifications:function(a, - b){var c=this.target,d=!0,e=Ma(c,this.prepared.name)&&(!c.options[this.prepared.name].snap.endOnly||b),c=Na(c,this.prepared.name)&&(!c.options[this.prepared.name].restrict.endOnly||b);e?this.setSnapping(a):this.snapStatus.locked=!1;c?this.setRestriction(a):this.restrictStatus.restricted=!1;e&&this.snapStatus.locked&&!this.snapStatus.changed?d=c&&this.restrictStatus.restricted&&this.restrictStatus.changed:c&&this.restrictStatus.restricted&&!this.restrictStatus.changed&&(d=!1);return d},setStartOffsets:function(a, - b,c){a=b.getRect(c);var d=na(b,c);c=b.options[this.prepared.name].snap;b=b.options[this.prepared.name].restrict;var e,h;a?(this.startOffset.left=this.startCoords.page.x-a.left,this.startOffset.top=this.startCoords.page.y-a.top,this.startOffset.right=a.right-this.startCoords.page.x,this.startOffset.bottom=a.bottom-this.startCoords.page.y,e="width"in a?a.width:a.right-a.left,h="height"in a?a.height:a.bottom-a.top):this.startOffset.left=this.startOffset.top=this.startOffset.right=this.startOffset.bottom= - 0;this.snapOffsets.splice(0);d=c&&"startCoords"===c.offset?{x:this.startCoords.page.x-d.x,y:this.startCoords.page.y-d.y}:c&&c.offset||{x:0,y:0};if(a&&c&&c.relativePoints&&c.relativePoints.length)for(var f=0;fQa);d||this.pointerIsDown&&!this.pointerWasMoved||(this.pointerIsDown&&clearTimeout(this.holdTimers[h]),this.collectEventTargets(a,b,c,"move"));if(this.pointerIsDown)if(d&&this.pointerWasMoved&&!e)this.checkAndPreventDefault(b,this.target,this.element);else if(Ta(this.pointerDelta,this.prevCoords,this.curCoords),this.prepared.name){if(this.pointerWasMoved&&(!this.inertiaStatus.active||a instanceof G&&/inertiastart/.test(a.type))){if(!this.interacting()&&(Ta(this.pointerDelta, - this.prevCoords,this.curCoords),"drag"===this.prepared.name)){f=Math.abs(f);g=Math.abs(g);d=this.target.options.drag.axis;var k=f>g?"x":fk.bottom&&(b=k.top,k.top=k.bottom,k.bottom=b),k.left>k.right&&(b=k.left,k.left=k.right,k.right=b))):(k.top=Math.min(g.top,f.bottom),k.bottom=Math.max(g.bottom,f.top),k.left=Math.min(g.left,f.right),k.right=Math.max(g.right,f.left));k.width=k.right-k.left;k.height=k.bottom-k.top;for(var q in k)l[q]=k[q]-n[q];a.edges=this.prepared.edges;a.rect=k;a.deltaRect=l}this.target.fire(a); - return a},gestureStart:function(a){a=new G(this,a,"gesture","start",this.element);a.ds=0;this.gesture.startDistance=this.gesture.prevDistance=a.distance;this.gesture.startAngle=this.gesture.prevAngle=a.angle;this.gesture.scale=1;this.gesturing=!0;this.target.fire(a);return a},gestureMove:function(a){if(!this.pointerIds.length)return this.prevEvent;a=new G(this,a,"gesture","move",this.element);a.ds=a.scale-this.gesture.scale;this.target.fire(a);this.gesture.prevAngle=a.angle;this.gesture.prevDistance= - a.distance;Infinity===a.scale||null===a.scale||void 0===a.scale||isNaN(a.scale)||(this.gesture.scale=a.scale);return a},pointerHold:function(a,b,c){this.collectEventTargets(a,b,c,"hold")},pointerUp:function(a,b,c,d){var e=this.mouse?0:v(this.pointerIds,O(a));clearTimeout(this.holdTimers[e]);this.collectEventTargets(a,b,c,"up");this.collectEventTargets(a,b,c,"tap");this.pointerEnd(a,b,c,d);this.removePointer(a)},pointerCancel:function(a,b,c,d){var e=this.mouse?0:v(this.pointerIds,O(a));clearTimeout(this.holdTimers[e]); - this.collectEventTargets(a,b,c,"cancel");this.pointerEnd(a,b,c,d);this.removePointer(a)},ie8Dblclick:function(a,b,c){this.prevTap&&b.clientX===this.prevTap.clientX&&b.clientY===this.prevTap.clientY&&c===this.prevTap.target&&(this.downTargets[0]=c,this.downTimes[0]=(new Date).getTime(),this.collectEventTargets(a,b,c,"tap"))},pointerEnd:function(a,b,c,d){var e,h=this.target,f=h&&h.options,g=f&&this.prepared.name&&f[this.prepared.name].inertia;e=this.inertiaStatus;if(this.interacting()){if(e.active&& - !e.ending)return;var k=(new Date).getTime(),l=!1,m=!1,n=!1,p=Ma(h,this.prepared.name)&&f[this.prepared.name].snap.endOnly,q=Na(h,this.prepared.name)&&f[this.prepared.name].restrict.endOnly,r=0,t=0,f=this.dragging?"x"===f.drag.axis?Math.abs(this.pointerDelta.client.vx):"y"===f.drag.axis?Math.abs(this.pointerDelta.client.vy):this.pointerDelta.client.speed:this.pointerDelta.client.speed,m=(l=g&&g.enabled&&"gesture"!==this.prepared.name&&b!==e.startEvent)&&50>k-this.curCoords.timeStamp&&f>g.minSpeed&& - f>g.endSpeed;l&&!m&&(p||q)&&(g={},g.snap=g.restrict=g,p&&(this.setSnapping(this.curCoords.page,g),g.locked&&(r+=g.dx,t+=g.dy)),q&&(this.setRestriction(this.curCoords.page,g),g.restricted&&(r+=g.dx,t+=g.dy)),r||t)&&(n=!0);if(m||n){sa(e.upCoords,this.curCoords);this.pointers[0]=e.startEvent=new G(this,b,this.prepared.name,"inertiastart",this.element);e.t0=k;h.fire(e.startEvent);m?(e.vx0=this.pointerDelta.client.vx,e.vy0=this.pointerDelta.client.vy,e.v0=f,this.calcInertia(e),b=x({},this.curCoords.page), - h=na(h,this.element),b.x=b.x+e.xe-h.x,b.y=b.y+e.ye-h.y,h={useStatusXY:!0,x:b.x,y:b.y,dx:0,dy:0,snap:null},h.snap=h,r=t=0,p&&(b=this.setSnapping(this.curCoords.page,h),b.locked&&(r+=b.dx,t+=b.dy)),q&&(h=this.setRestriction(this.curCoords.page,h),h.restricted&&(r+=h.dx,t+=h.dy)),e.modifiedXe+=r,e.modifiedYe+=t,e.i=T(this.boundInertiaFrame)):(e.smoothEnd=!0,e.xe=r,e.ye=t,e.sx=e.sy=0,e.i=T(this.boundSmoothEndFrame));e.active=!0;return}(p||q)&&this.pointerMove(a,b,c,d,!0)}this.dragging?(e=new G(this,b, - "drag","end",this.element),q=this.getDrop(e,b,this.element),this.dropTarget=q.dropzone,this.dropElement=q.element,q=this.getDropEvents(b,e),q.leave&&this.prevDropTarget.fire(q.leave),q.enter&&this.dropTarget.fire(q.enter),q.drop&&this.dropTarget.fire(q.drop),q.deactivate&&this.fireActiveDrops(q.deactivate),h.fire(e)):this.resizing?(e=new G(this,b,"resize","end",this.element),h.fire(e)):this.gesturing&&(e=new G(this,b,"gesture","end",this.element),h.fire(e));this.stop(b)},collectDrops:function(a){var b= - [],c=[],d;a=a||this.element;for(d=0;dk),g["double"]=l,this.tapTime=g.timeStamp);for(a=0;ah.innerWidth-p.margin, - a=a.clientY>h.innerHeight-p.margin):(h=Fa(h),d=a.clientXh.right-p.margin,a=a.clientY>h.bottom-p.margin);p.x=c?1:d?-1:0;p.y=a?1:b?-1:0;p.isScrolling||(p.margin=e.margin,p.speed=e.speed,p.start(this))}},_updateEventTargets:function(a,b){this._eventTarget=a;this._curEventTarget=b}};G.prototype={preventDefault:ma,stopImmediatePropagation:function(){this.immediatePropagationStopped=this.propagationStopped=!0},stopPropagation:function(){this.propagationStopped= - !0}};for(var m={},lb="dragStart dragMove resizeStart resizeMove gestureStart gestureMove pointerOver pointerOut pointerHover selectorDown pointerDown pointerMove pointerUp pointerCancel pointerEnd addPointer removePointer recordPointer autoScrollMove".split(" "),Ra=0,Sa=lb.length;Rah.left&&k.xh.top&&k.y=h.left&&f<=h.right&&l>=h.top&&l<=h.bottom;K(g)&&(f=Math.max(0,Math.min(h.right,k.right)-Math.max(h.left,k.left))*Math.max(0,Math.min(h.bottom,k.bottom)-Math.max(h.top,k.top))/(k.width*k.height)>=g);this.options.drop.checker&&(f=this.options.drop.checker(a,b,f,this,e,c,d));return f},dropChecker:function(a){return A(a)?(this.options.drop.checker=a,this): - null===a?(delete this.options.getRect,this):this.options.drop.checker},accept:function(a){return t(a)||ea(a)?(this.options.drop.accept=a,this):null===a?(delete this.options.drop.accept,this):this.options.drop.accept},resizable:function(a){return z(a)?(this.options.resize.enabled=!1===a.enabled?!1:!0,this.setPerAction("resize",a),this.setOnEvents("resize",a),/^x$|^y$|^xy$/.test(a.axis)?this.options.resize.axis=a.axis:null===a.axis&&(this.options.resize.axis=D.resize.axis),H(a.preserveAspectRatio)? - this.options.resize.preserveAspectRatio=a.preserveAspectRatio:H(a.square)&&(this.options.resize.square=a.square),this):H(a)?(this.options.resize.enabled=a,this):this.options.resize},squareResize:function(a){return H(a)?(this.options.resize.square=a,this):null===a?(delete this.options.resize.square,this):this.options.resize.square},gesturable:function(a){return z(a)?(this.options.gesture.enabled=!1===a.enabled?!1:!0,this.setPerAction("gesture",a),this.setOnEvents("gesture",a),this):H(a)?(this.options.gesture.enabled= - a,this):this.options.gesture},autoScroll:function(a){z(a)?a=x({actions:["drag","resize"]},a):H(a)&&(a={actions:["drag","resize"],enabled:a});return this.setOptions("autoScroll",a)},snap:function(a){a=this.setOptions("snap",a);return a===this?this:a.drag},setOptions:function(a,b){var c=b&&da(b.actions)?b.actions:["drag"],d;if(z(b)||H(b)){for(d=0;dthis.pointerMoveTolerance);var a={pointer:e,pointerIndex:this.getPointerIndex(e),event:t,eventTarget:n,dx:r,dy:o,duplicate:i,interaction:this};i||(f.pointer.setCoordDeltas(this.coords.delta,this.coords.prev,this.coords.cur),f.pointer.setCoordVelocity(this.coords.velocity,this.coords.delta)),this._signals.fire("move",a),i||(this.interacting()&&this.move(a),this.pointerWasMoved&&f.pointer.copyCoords(this.coords.prev,this.coords.cur))}},{key:"move",value:function(e){(e=f.extend({pointer:this._latestPointer.pointer,event:this._latestPointer.event,eventTarget:this._latestPointer.eventTarget,interaction:this},e||{})).phase=i.EventPhase.Move,this._doPhase(e)}},{key:"pointerUp",value:function(e,t,n,r){var o=this.getPointerIndex(e);-1===o&&(o=this.updatePointer(e,t,n,!1)),this._signals.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:o,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)}},{key:"documentBlur",value:function(e){this.end(e),this._signals.fire("blur",{event:e,interaction:this})}},{key:"end",value:function(e){var t;this._ending=!0,e=e||this._latestPointer.event,this.interacting()&&(t=this._doPhase({event:e,interaction:this,phase:i.EventPhase.End})),!(this._ending=!1)===t&&this.stop()}},{key:"currentAction",value:function(){return this._interacting?this.prepared.name:null}},{key:"interacting",value:function(){return this._interacting}},{key:"stop",value:function(){this._signals.fire("stop",{interaction:this}),this.interactable=this.element=null,this._interacting=!1,this._stopped=!0,this.prepared.name=this.prevEvent=null}},{key:"getPointerIndex",value:function(e){var t=f.pointer.getPointerId(e);return"mouse"===this.pointerType||"pen"===this.pointerType?this.pointers.length-1:f.arr.findIndex(this.pointers,function(e){return e.id===t})}},{key:"getPointerInfo",value:function(e){return this.pointers[this.getPointerIndex(e)]}},{key:"updatePointer",value:function(e,t,n,r){var o=f.pointer.getPointerId(e),i=this.getPointerIndex(e),a=this.pointers[i];return r=!1!==r&&(r||/(down|start)$/i.test(t.type)),a?a.pointer=e:(a=new s.default(o,e,t,null,null),i=this.pointers.length,this.pointers.push(a)),r&&(this.pointerIsDown=!0,this.interacting()||(f.pointer.setCoords(this.coords.start,this.pointers.map(function(e){return e.pointer}),this._now()),f.pointer.copyCoords(this.coords.cur,this.coords.start),f.pointer.copyCoords(this.coords.prev,this.coords.start),f.pointer.pointerExtend(this.downPointer,e),this.downEvent=t,a.downTime=this.coords.cur.timeStamp,a.downTarget=n,this.pointerWasMoved=!1)),this._updateLatestPointer(e,t,n),this._signals.fire("update-pointer",{pointer:e,event:t,eventTarget:n,down:r,pointerInfo:a,pointerIndex:i,interaction:this}),i}},{key:"removePointer",value:function(e,t){var n=this.getPointerIndex(e);if(-1!==n){var r=this.pointers[n];this._signals.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,pointerInfo:r,interaction:this}),this.pointers.splice(n,1)}}},{key:"_updateLatestPointer",value:function(e,t,n){this._latestPointer.pointer=e,this._latestPointer.event=t,this._latestPointer.eventTarget=n}},{key:"destroy",value:function(){this._latestPointer.pointer=null,this._latestPointer.event=null,this._latestPointer.eventTarget=null}},{key:"_createPreparedEvent",value:function(e,t,n,r){var o=this.prepared.name;return new i.default(this,e,o,t,this.element,null,n,r)}},{key:"_fireEvent",value:function(e){this.interactable.fire(e),(!this.prevEvent||e.timeStamp>=this.prevEvent.timeStamp)&&(this.prevEvent=e)}},{key:"_doPhase",value:function(e){var t=e.event,n=e.phase,r=e.preEnd,o=e.type;if(!1===this._signals.fire("before-action-".concat(n),e))return!1;var i=e.iEvent=this._createPreparedEvent(t,n,r,o),a=this.rect;if(a){var s=this.edges||this.prepared.edges||{left:!0,right:!0,top:!0,bottom:!0};s.top&&(a.top+=i.delta.y),s.bottom&&(a.bottom+=i.delta.y),s.left&&(a.left+=i.delta.x),s.right&&(a.right+=i.delta.x),a.width=a.right-a.left,a.height=a.bottom-a.top}return this._signals.fire("action-".concat(n),e),this._fireEvent(i),this._signals.fire("after-action-".concat(n),e),!0}},{key:"_now",value:function(){return Date.now()}},{key:"pointerMoveTolerance",get:function(){return 1}}]),l}(),v=t.Interaction=d;t.default=v}),s={};function t(e,t){for(var n=0;na.left&&c.xa.top&&c.y=a.left&&v<=a.right&&g>=a.top&&g<=a.bottom}if(d&&Zn.is.number(l)){var h=Math.max(0,Math.min(a.right,d.right)-Math.max(a.left,d.left))*Math.max(0,Math.min(a.bottom,d.bottom)-Math.max(a.top,d.top))/(d.width*d.height);s=l<=h}e.options.drop.checker&&(s=e.options.drop.checker(t,n,s,e,i,r,o));return s}(this,e,t,n,r,o,i)},t.dynamicDrop=function(e){return Zn.is.bool(e)?(i.dynamicDrop=e,t):i.dynamicDrop},Zn.arr.merge(e.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),e.methodDict.drop="dropzone",i.dynamicDrop=!1,o.actions.drop=ur.defaults},getActiveDrops:or,getDrop:ir,getDropEvents:ar,fireDropEvents:sr,defaults:{enabled:!1,accept:null,overlap:"pointer"}},cr=ur;Jn.default=cr;var fr={};Object.defineProperty(fr,"__esModule",{value:!0}),fr.default=void 0;var pr,dr=(pr=ln)&&pr.__esModule?pr:{default:pr},vr=g({}),gr=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}}(tt);vr.ActionName.Gesture="gesture";var hr={id:"actions/gesture",install:function(e){var t=e.actions,n=e.Interactable,r=e.interactions,o=e.defaults;n.prototype.gesturable=function(e){return gr.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):gr.is.bool(e)?(this.options.gesture.enabled=e,this):this.options.gesture},r.signals.on("action-start",yr),r.signals.on("action-move",yr),r.signals.on("action-end",yr),r.signals.on("new",function(e){e.interaction.gesture={angle:0,distance:0,scale:1,startAngle:0,startDistance:0}}),t[vr.ActionName.Gesture]=hr,t.names.push(vr.ActionName.Gesture),gr.arr.merge(t.eventTypes,["gesturestart","gesturemove","gestureend"]),t.methodDict.gesture="gesturable",o.actions.gesture=hr.defaults},defaults:{},checker:function(e,t,n,r,o){return 2<=o.pointers.length?{name:"gesture"}:null},getCursor:function(){return""}};function yr(e){var t=e.interaction,n=e.iEvent,r=e.event,o=e.phase;if("gesture"===t.prepared.name){var i=t.pointers.map(function(e){return e.pointer}),a="start"===o,s="end"===o,l=t.interactable.options.deltaSource;if(n.touches=[i[0],i[1]],a)n.distance=gr.pointer.touchDistance(i,l),n.box=gr.pointer.touchBBox(i),n.scale=1,n.ds=0,n.angle=gr.pointer.touchAngle(i,l),n.da=0,t.gesture.startDistance=n.distance,t.gesture.startAngle=n.angle;else if(s||r instanceof dr.default){var u=t.prevEvent;n.distance=u.distance,n.box=u.box,n.scale=u.scale,n.ds=0,n.angle=u.angle,n.da=0}else n.distance=gr.pointer.touchDistance(i,l),n.box=gr.pointer.touchBBox(i),n.scale=n.distance/t.gesture.startDistance,n.angle=gr.pointer.touchAngle(i,l),n.ds=n.scale-t.gesture.scale,n.da=n.angle-t.gesture.angle;t.gesture.distance=n.distance,t.gesture.angle=n.angle,gr.is.number(n.scale)&&n.scale!==1/0&&!isNaN(n.scale)&&(t.gesture.scale=n.scale)}}var mr=hr;fr.default=mr;var br={};Object.defineProperty(br,"__esModule",{value:!0}),br.default=void 0;var wr,Or=g({}),Pr=Er(s),_r=Er(z),xr=(wr=Te)&&wr.__esModule?wr:{default:wr},jr=Er(y);function Er(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}var Mr={id:"actions/resize",install:function(t){var e=t.actions,n=t.browser,r=t.Interactable,o=t.interactions,i=t.defaults;o.signals.on("new",function(e){e.resizeAxes="xy"}),o.signals.on("action-start",Tr),o.signals.on("action-move",Dr),o.signals.on("action-start",kr),o.signals.on("action-move",kr),Mr.cursors=function(e){return e.isIe9?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"}}(n),Mr.defaultMargin=n.supportsTouch||n.supportsPointerEvent?20:10,r.prototype.resizable=function(e){return function(e,t,n){if(jr.object(t))return e.options.resize.enabled=!1!==t.enabled,e.setPerAction("resize",t),e.setOnEvents("resize",t),jr.string(t.axis)&&/^x$|^y$|^xy$/.test(t.axis)?e.options.resize.axis=t.axis:null===t.axis&&(e.options.resize.axis=n.defaults.actions.resize.axis),jr.bool(t.preserveAspectRatio)?e.options.resize.preserveAspectRatio=t.preserveAspectRatio:jr.bool(t.square)&&(e.options.resize.square=t.square),e;if(jr.bool(t))return e.options.resize.enabled=t,e;return e.options.resize}(this,e,t)},e[Or.ActionName.Resize]=Mr,e.names.push(Or.ActionName.Resize),Pr.merge(e.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeresume","resizeend"]),e.methodDict.resize="resizable",i.actions.resize=Mr.defaults},defaults:{square:!(Or.ActionName.Resize="resize"),preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,r,o,i){if(!i)return null;var a=(0,xr.default)({},o.coords.cur.page),s=n.options;if(s.resize.enabled){var l=s.resize,u={left:!1,right:!1,top:!1,bottom:!1};if(jr.object(l.edges)){for(var c in u)u[c]=Sr(c,l.edges[c],a,o._latestPointer.eventTarget,r,i,l.margin||this.defaultMargin);if(u.left=u.left&&!u.right,u.top=u.top&&!u.bottom,u.left||u.right||u.top||u.bottom)return{name:"resize",edges:u}}else{var f="y"!==s.resize.axis&&a.x>i.right-this.defaultMargin,p="x"!==s.resize.axis&&a.y>i.bottom-this.defaultMargin;if(f||p)return{name:"resize",axes:(f?"x":"")+(p?"y":"")}}}return null},cursors:null,getCursor:function(e){var t=e.edges,n=e.axis,r=e.name,o=Mr.cursors,i=null;if(n)i=o[r+n];else if(t){for(var a="",s=["top","bottom","left","right"],l=0;l(0<=s?i.right:i.left)-a;if("bottom"===e)return n.y>(0<=l?i.bottom:i.top)-a}return!!jr.element(r)&&(jr.element(t)?t===r:_r.matchesUpTo(r,t,o))}function Tr(e){var t=e.iEvent,n=e.interaction;if("resize"===n.prepared.name&&n.prepared.edges){var r=n.rect,o=n.interactable.options.resize;if(o.square||o.preserveAspectRatio){var i=(0,xr.default)({},n.prepared.edges);i.top=i.top||i.left&&!i.bottom,i.left=i.left||i.top&&!i.right,i.bottom=i.bottom||i.right&&!i.top,i.right=i.right||i.bottom&&!i.left,n.prepared._linkedEdges=i}else n.prepared._linkedEdges=null;o.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:(0,xr.default)({},r),inverted:(0,xr.default)({},r),previous:(0,xr.default)({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}function Dr(e){var t=e.iEvent,n=e.interaction;if("resize"===n.prepared.name&&n.prepared.edges){var r,o=n.interactable.options.resize,i=o.invert,a="reposition"===i||"negate"===i,s=n.prepared.edges,l=n.resizeRects.start,u=n.resizeRects.current,c=n.resizeRects.inverted,f=n.resizeRects.delta,p=(0,xr.default)(n.resizeRects.previous,c),d=s,v=(0,xr.default)({},t.delta);if(o.preserveAspectRatio||o.square){var g=o.preserveAspectRatio?n.resizeStartAspectRatio:1;s=n.prepared._linkedEdges,d.left&&d.bottom||d.right&&d.top?v.y=-v.x/g:d.left||d.right?v.y=v.x/g:(d.top||d.bottom)&&(v.x=v.y*g)}if(s.top&&(u.top+=v.y),s.bottom&&(u.bottom+=v.y),s.left&&(u.left+=v.x),s.right&&(u.right+=v.x),a){if((0,xr.default)(c,u),"reposition"===i)c.top>c.bottom&&(r=c.top,c.top=c.bottom,c.bottom=r),c.left>c.right&&(r=c.left,c.left=c.right,c.right=r)}else c.top=Math.min(u.top,l.bottom),c.bottom=Math.max(u.bottom,l.top),c.left=Math.min(u.left,l.right),c.right=Math.max(u.right,l.left);for(var h in c.width=c.right-c.left,c.height=c.bottom-c.top,c)f[h]=c[h]-p[h];t.edges=n.prepared.edges,t.rect=c,t.deltaRect=f}}function kr(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.interactable.options.resize.square?("y"===t.resizeAxes?n.delta.x=n.delta.y:n.delta.y=n.delta.x,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.delta.y=0:"y"===t.resizeAxes&&(n.delta.x=0)))}var Ir=Mr;br.default=Ir;var zr={};Object.defineProperty(zr,"__esModule",{value:!0}),zr.install=function(e){e.usePlugin(Rr.default),e.usePlugin(Xr.default),e.usePlugin(Ar.default),e.usePlugin(Cr.default)},Object.defineProperty(zr,"drag",{enumerable:!0,get:function(){return Ar.default}}),Object.defineProperty(zr,"drop",{enumerable:!0,get:function(){return Cr.default}}),Object.defineProperty(zr,"gesture",{enumerable:!0,get:function(){return Rr.default}}),Object.defineProperty(zr,"resize",{enumerable:!0,get:function(){return Xr.default}}),zr.id=void 0;var Ar=Yr(In),Cr=Yr(Jn),Rr=Yr(fr),Xr=Yr(br);function Yr(e){return e&&e.__esModule?e:{default:e}}zr.id="actions";var Nr={};Object.defineProperty(Nr,"__esModule",{value:!0}),Nr.getContainer=Ur,Nr.getScroll=Br,Nr.getScrollSize=function(e){Lr.window(e)&&(e=window.document.body);return{x:e.scrollWidth,y:e.scrollHeight}},Nr.getScrollSizeDelta=function(e,t){var n=e.interaction,r=e.element,o=n&&n.interactable.options[n.prepared.name].autoScroll;if(!o||!o.enabled)return t(),{x:0,y:0};var i=Ur(o.container,n.interactable,r),a=Br(i);t();var s=Br(i);return{x:s.x-a.x,y:s.y-a.y}},Nr.default=void 0;var Fr,Wr=qr(z),Lr=qr(y),Vr=(Fr=Be)&&Fr.__esModule?Fr:{default:Fr};function qr(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}var Gr={defaults:{enabled:!1,margin:60,container:null,speed:300},now:Date.now,interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,margin:0,speed:0,start:function(e){Gr.isScrolling=!0,Vr.default.cancel(Gr.i),(e.autoScroll=Gr).interaction=e,Gr.prevTime=Gr.now(),Gr.i=Vr.default.request(Gr.scroll)},stop:function(){Gr.isScrolling=!1,Gr.interaction&&(Gr.interaction.autoScroll=null),Vr.default.cancel(Gr.i)},scroll:function(){var e=Gr.interaction,t=e.interactable,n=e.element,r=t.options[Gr.interaction.prepared.name].autoScroll,o=Ur(r.container,t,n),i=Gr.now(),a=(i-Gr.prevTime)/1e3,s=r.speed*a;if(1<=s){var l={x:Gr.x*s,y:Gr.y*s};if(l.x||l.y){var u=Br(o);Lr.window(o)?o.scrollBy(l.x,l.y):o&&(o.scrollLeft+=l.x,o.scrollTop+=l.y);var c=Br(o),f={x:c.x-u.x,y:c.y-u.y};(f.x||f.y)&&t.fire({type:"autoscroll",target:n,interactable:t,delta:f,interaction:e,container:o})}Gr.prevTime=i}Gr.isScrolling&&(Vr.default.cancel(Gr.i),Gr.i=Vr.default.request(Gr.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&Gr.check(t.interactable,t.prepared.name))if(t.simulation)Gr.x=Gr.y=0;else{var r,o,i,a,s=t.interactable,l=t.element,u=s.options[t.prepared.name].autoScroll,c=Ur(u.container,s,l);if(Lr.window(c))a=n.clientXc.innerWidth-Gr.margin,i=n.clientY>c.innerHeight-Gr.margin;else{var f=Wr.getElementClientRect(c);a=n.clientXf.right-Gr.margin,i=n.clientY>f.bottom-Gr.margin}Gr.x=o?1:a?-1:0,Gr.y=i?1:r?-1:0,Gr.isScrolling||(Gr.margin=u.margin,Gr.speed=u.speed,Gr.start(t))}}};function Ur(e,t,n){return(Lr.string(e)?(0,De.getStringOptionResult)(e,t,n):e)||(0,u.getWindow)(n)}function Br(e){return Lr.window(e)&&(e=window.document.body),{x:e.scrollLeft,y:e.scrollTop}}var Hr={id:"auto-scroll",install:function(e){var t=e.interactions,n=e.defaults,r=e.actions;(e.autoScroll=Gr).now=function(){return e.now()},t.signals.on("new",function(e){e.interaction.autoScroll=null}),t.signals.on("destroy",function(e){e.interaction.autoScroll=null,Gr.stop(),Gr.interaction&&(Gr.interaction=null)}),t.signals.on("stop",Gr.stop),t.signals.on("action-move",function(e){return Gr.onInteractionMove(e)}),r.eventTypes.push("autoscroll"),n.perAction.autoScroll=Gr.defaults}};Nr.default=Hr;var $r={};Object.defineProperty($r,"__esModule",{value:!0}),$r.default=void 0;var Kr=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}}(y);function Qr(e,t,n,r){var o=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,o,this,r,n):o}function Jr(e){return Kr.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor}function Zr(e){return Kr.func(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker}var eo={id:"auto-start/interactableMethods",install:function(e){var t=e.Interactable,o=e.actions;t.prototype.getAction=Qr,t.prototype.ignoreFrom=(0,tt.warnOnce)(function(e){return this._backCompatOption("ignoreFrom",e)},"Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue})."),t.prototype.allowFrom=(0,tt.warnOnce)(function(e){return this._backCompatOption("allowFrom",e)},"Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue})."),t.prototype.actionChecker=Zr,t.prototype.styleCursor=Jr,t.prototype.defaultActionChecker=function(e,t,n,r){return function(e,t,n,r,o,i){for(var a=e.getRect(o),s=n.buttons||{0:1,1:4,3:8,4:16}[n.button],l=null,u=0;us.minSpeed&&c>s.endSpeed,v={interaction:n,pageCoords:ci.extend({},n.coords.cur.page),states:p&&n.modifiers.states.map(function(e){return ci.extend({},e)}),preEnd:!0,prevCoords:void 0,requireEndOnly:null};p&&!d&&(v.prevCoords=n.prevEvent.page,v.requireEndOnly=!1,(a=ui.default.setAll(v)).changed&&(f=!0));if(!d&&!f)return null;ci.pointer.copyCoords(i.upCoords,n.coords.cur),n.pointers[0].pointer=i.startEvent=new t.InteractEvent(n,r,n.prepared.name,ln.EventPhase.InertiaStart,n.element),i.t0=l,i.active=!0,i.allowResume=s.allowResume,n.simulation=i,n.interactable.fire(i.startEvent),d?(i.vx0=n.coords.velocity.client.x,i.vy0=n.coords.velocity.client.y,i.v0=c,di(n,i),ci.extend(v.pageCoords,n.coords.cur.page),v.pageCoords.x+=i.xe,v.pageCoords.y+=i.ye,v.prevCoords=void 0,v.requireEndOnly=!0,a=ui.default.setAll(v),i.modifiedXe+=a.delta.x,i.modifiedYe+=a.delta.y,i.timeout=fi.default.request(function(){return vi(n)})):(i.smoothEnd=!0,i.xe=a.delta.x,i.ye=a.delta.y,i.sx=i.sy=0,i.timeout=fi.default.request(function(){return gi(n)}));return!1}(e,t)}),e.signals.on("down",function(e){return function(e,t){var n=e.interaction,r=e.event,o=e.pointer,i=e.eventTarget,a=n.inertia;if(a.active)for(var s=i;ci.is.element(s);){if(s===n.element){fi.default.cancel(a.timeout),a.active=!1,n.simulation=null,n.updatePointer(o,r,i,!0),ci.pointer.setCoords(n.coords.cur,n.pointers.map(function(e){return e.pointer}),n._now());var l={interaction:n};t.interactions.signals.fire("action-resume",l);var u=new t.InteractEvent(n,r,n.prepared.name,ln.EventPhase.Resume,n.element);n._fireEvent(u),ci.pointer.copyCoords(n.coords.prev,n.coords.cur);break}s=ci.dom.parentNode(s)}}(e,t)}),e.signals.on("stop",function(e){return function(e){var t=e.interaction,n=t.inertia;n.active&&(fi.default.cancel(n.timeout),n.active=!1,t.simulation=null)}(e)}),n.perAction.inertia={enabled:!1,resistance:10,minSpeed:100,endSpeed:10,allowResume:!0,smoothEndDuration:300},t.usePlugin(ui.default)},calcInertia:di,inertiaTick:vi,smothEndTick:gi,updateInertiaCoords:hi};li.default=mi;var bi={};Object.defineProperty(bi,"__esModule",{value:!0}),bi.default=void 0;var wi=_i(Te),Oi=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}}(y),Pi=_i(De);function _i(e){return e&&e.__esModule?e:{default:e}}function xi(e,t,n){return Oi.func(e)?Pi.default.resolveRectLike(e,t.interactable,t.element,[n.x,n.y,t]):Pi.default.resolveRectLike(e,t.interactable,t.element)}var ji={start:function(e){var t=e.rect,n=e.startOffset,r=e.state,o=e.interaction,i=e.pageCoords,a=r.options,s=a.elementRect,l=(0,wi.default)({left:0,top:0,right:0,bottom:0},a.offset||{});if(t&&s){var u=xi(a.restriction,o,i);if(u){var c=u.right-u.left-t.width,f=u.bottom-u.top-t.height;c<0&&(l.left+=c,l.right+=c),f<0&&(l.top+=f,l.bottom+=f)}l.left+=n.left-t.width*s.left,l.top+=n.top-t.height*s.top,l.right+=n.right-t.width*(1-s.right),l.bottom+=n.bottom-t.height*(1-s.bottom)}r.offset=l},set:function(e){var t=e.coords,n=e.interaction,r=e.state,o=r.options,i=r.offset,a=xi(o.restriction,n,t);if(a){var s=Pi.default.xywhToTlbr(a);t.x=Math.max(Math.min(s.right-i.right,t.x),s.left+i.left),t.y=Math.max(Math.min(s.bottom-i.bottom,t.y),s.top+i.top)}},getRestrictionRect:xi,defaults:{restriction:null,elementRect:null,offset:null,endOnly:!1,enabled:!1}};bi.default=ji;var Ei={};Object.defineProperty(Ei,"__esModule",{value:!0}),Ei.default=void 0;var Mi=Ti(Te),Si=Ti(De);function Ti(e){return e&&e.__esModule?e:{default:e}}var Di=Ti(bi).default.getRestrictionRect,ki={top:1/0,left:1/0,bottom:-1/0,right:-1/0},Ii={top:-1/0,left:-1/0,bottom:1/0,right:1/0};function zi(e,t){for(var n=["top","left","bottom","right"],r=0;r Date: Wed, 24 Jul 2019 13:30:48 +0800 Subject: [PATCH 111/247] Enable 2.3-SNAPSHOT auto deploy to maven. Updates on recent GMD StatusDisplay positioning --- .travis.yml | 4 ++-- .utility/deploy.sh | 2 +- .../design/addins/client/stepper/MaterialStep.java | 10 ++++++---- .../design/addins/client/stepper/MaterialStepper.java | 6 ++++++ .../incubator/client/toggle/GroupToggleButton.java | 6 ++++-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 87e20877d..1c502780a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,12 +7,12 @@ cache: - $HOME/.m2 before_install: # install the gwt-material-jquery library before we build the demo -- git clone -b release_2.2 https://github.com/GwtMaterialDesign/gwt-material-jquery.git +- git clone -b release_2.3 https://github.com/GwtMaterialDesign/gwt-material-jquery.git - cd gwt-material-jquery - mvn install -DskipTests=true -DdryRun=true - cd .. # install the gwt-material library before we build the demo -- git clone -b release_2.2 https://github.com/GwtMaterialDesign/gwt-material.git +- git clone -b release_2.3 https://github.com/GwtMaterialDesign/gwt-material.git - cd gwt-material - mvn install -DskipTests=true -DdryRun=true - cd .. diff --git a/.utility/deploy.sh b/.utility/deploy.sh index 134c6eeed..7787dfe7d 100644 --- a/.utility/deploy.sh +++ b/.utility/deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash set -ev -if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.2" ]; then +if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.3" ]; then echo "ossrh\${env.OSSRH_USER}\${env.OSSRH_PASS}" > ~/settings.xml mvn deploy -DskipTests --settings ~/settings.xml fi \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java index a0884cf63..0167dcc75 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStep.java @@ -32,10 +32,7 @@ import gwt.material.design.client.base.*; import gwt.material.design.client.base.mixin.ActiveMixin; import gwt.material.design.client.base.mixin.StatusDisplayMixin; -import gwt.material.design.client.constants.Axis; -import gwt.material.design.client.constants.CssName; -import gwt.material.design.client.constants.IconType; -import gwt.material.design.client.constants.StatusDisplayType; +import gwt.material.design.client.constants.*; import gwt.material.design.client.ui.MaterialIcon; import gwt.material.design.client.ui.html.Div; @@ -256,6 +253,11 @@ public void updateStatusDisplay(StatusDisplayMixin.StatusType statusType) { // Nothing for now } + @Override + public void setStatusDisplayPosition(Position position) { + // Nothing for now + } + protected void applyIconStatus(MaterialIcon icon, String description) { iconError.removeFromParent(); iconSuccess.removeFromParent(); diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index fddf4273f..85b9aaef6 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -48,6 +48,7 @@ import gwt.material.design.client.base.mixin.ToggleStyleMixin; import gwt.material.design.client.base.viewport.Resolution; import gwt.material.design.client.constants.Axis; +import gwt.material.design.client.constants.Position; import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; @@ -463,6 +464,11 @@ public void updateStatusDisplay(StatusDisplayMixin.StatusType statusType) { getCurrentStep().updateStatusDisplay(statusType); } + @Override + public void setStatusDisplayPosition(Position position) { + getCurrentStep().setStatusDisplayPosition(position); + } + /** * Get feedback message. */ diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java index 2eef1d29c..08041df71 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java @@ -20,7 +20,10 @@ package gwt.material.design.incubator.client.toggle; import com.google.gwt.dom.client.Document; -import com.google.gwt.event.logical.shared.*; +import com.google.gwt.event.logical.shared.HasSelectionHandlers; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.shared.HandlerRegistration; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.client.MaterialDesignBase; @@ -33,7 +36,6 @@ import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; -import gwt.material.design.jscore.client.api.Array; import java.util.ArrayList; import java.util.Arrays; From 73434258d0c7e0e3aa8de5154cfe4bac28f30b11 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 25 Jul 2019 05:21:54 +0800 Subject: [PATCH 112/247] Date Of Birth ability to hide field labels --- .../client/dob/DateOfBirthPicker.java | 39 ++++++++++++++++++- .../client/dob/resources/css/dob.css | 6 +++ .../client/dob/resources/css/dob.min.css | 8 +--- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 62c621f6e..37765d3a5 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -7,9 +7,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 gwt.material.design.client.base.HasFieldTypes; import gwt.material.design.client.base.HasReadOnly; import gwt.material.design.client.base.mixin.FieldTypeMixin; +import gwt.material.design.client.base.mixin.ToggleStyleMixin; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.FieldType; import gwt.material.design.client.constants.StatusDisplayType; @@ -48,6 +49,7 @@ public class DateOfBirthPicker extends AbstractValueWidget implements HasF } } + private boolean showFieldLabels; private Date value; private DobLocaleDateProvider dataProvider = new DefaultDobLocaleDateProvider(); private MaterialComboBox month = new MaterialComboBox(); @@ -55,6 +57,7 @@ public class DateOfBirthPicker extends AbstractValueWidget implements HasF private MaterialIntegerInputMask year = new MaterialIntegerInputMask(); private FieldTypeMixin fieldTypeMixin; + private ToggleStyleMixin toggleStyleMixin; public DateOfBirthPicker() { super(Document.get().createDivElement(), CssName.ROW); @@ -68,6 +71,7 @@ protected void setupLayout() { // Month month.addStyleName("dob-month"); month.setGrid("s12 m5"); + month.setCloseOnSelect(true); // Day day.addStyleName("dob-day"); @@ -138,6 +142,22 @@ protected void onLoad() { add(month); add(day); add(year); + + if (!showFieldLabels) { + if (month != null) { + month.getLabel().removeFromParent(); + } + + if (day != null) { + day.getLabel().removeFromParent(); + } + + if (year != null) { + year.getLabel().removeFromParent(); + } + } + + getToggleStyleMixin().setOn(!showFieldLabels); } public void reload() { @@ -303,6 +323,14 @@ public void setDataProvider(DobLocaleDateProvider dataProvider) { this.dataProvider = dataProvider; } + public boolean isShowFieldLabels() { + return showFieldLabels; + } + + public void setShowFieldLabels(boolean showFieldLabels) { + this.showFieldLabels = showFieldLabels; + } + public MaterialComboBox getMonth() { return month; } @@ -321,4 +349,11 @@ public FieldTypeMixin getFieldTypeMixin() { } return fieldTypeMixin; } + + public ToggleStyleMixin getToggleStyleMixin() { + if (toggleStyleMixin == null) { + toggleStyleMixin = new ToggleStyleMixin<>(this, "no-labels"); + } + return toggleStyleMixin; + } } diff --git a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css index 9c04550b0..64473d8ae 100644 --- a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css +++ b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.css @@ -4,4 +4,10 @@ .dob-container input { text-align: center; +} + +.dob-container.no-labels .dob-month, +.dob-container.no-labels .dob-day, +.dob-container.no-labels .dob-year { + margin-top: 0px !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css index 9c04550b0..bc082247c 100644 --- a/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/dob/resources/css/dob.min.css @@ -1,7 +1 @@ -.dob-container { - padding: 0px !important; -} - -.dob-container input { - text-align: center; -} \ No newline at end of file +.dob-container{padding:0!important}.dob-container input{text-align:center}.dob-container.no-labels .dob-day,.dob-container.no-labels .dob-month,.dob-container.no-labels .dob-year{margin-top:0!important} \ No newline at end of file From 92914513257ce4b31c1c36f575cf99c6c44a9942 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 1 Aug 2019 18:22:42 +0800 Subject: [PATCH 113/247] Fixed DateOfBirthPicker --- .../client/dob/DateOfBirthPicker.java | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java index 37765d3a5..64af86b32 100644 --- a/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java +++ b/src/main/java/gwt/material/design/incubator/client/dob/DateOfBirthPicker.java @@ -7,9 +7,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. @@ -103,6 +103,7 @@ protected void setupHandlers() { month.setMatcher(DateMonthMatcher.getDefaultMonthMatcher()); month.addValueChangeHandler(event -> { + Date test = value; if (validateDate(true)) { value.setMonth(month.getSingleValue()); } @@ -164,30 +165,44 @@ public void reload() { setupHandlers(); } + @Override + public void reset() { + super.reset(); + + month.reset(); + day.reset(); + year.reset(); + value = null; + } + protected boolean validateDate(boolean showErrors) { boolean valid = true; - if (!(month.getSingleValue() != null && month.getSingleValue() >= 0 && month.getSingleValue() < 12)) { + Integer monthValue = month.getSingleValue(); + Integer yearValue = year.getText() != null && !year.getText().isEmpty() ? Integer.parseInt(year.getText()) : null; + Integer dayValue = day.getText() != null && !day.getText().isEmpty() ? Integer.parseInt(day.getText()) : null; + + if (!(monthValue != null && monthValue >= 0 && monthValue < 12)) { valid = false; if (showErrors) month.setErrorText(dataProvider.getInvalidMonthMessage()); } else { if (showErrors) month.clearErrorText(); } - if (!(year.getValue() != null && year.getValue() >= 1900)) { + if (!(yearValue != null && yearValue >= 1900)) { valid = false; if (showErrors) year.setErrorText(dataProvider.getInvalidYearLabel()); } else { if (showErrors) year.clearErrorText(); } - if (!(day.getValue() != null && day.getValue() > 0 && day.getValue() <= 31)) { + if (!(dayValue != null && dayValue > 0 && dayValue <= 31)) { valid = false; if (showErrors) day.setErrorText(dataProvider.getInvalidDayMessage()); } else { if (showErrors) day.clearErrorText(); } - if (!validateLeapYear(month.getSingleValue(), day.getValue(), year.getValue())) { + if (!validateLeapYear(monthValue, dayValue, yearValue)) { valid = false; if (showErrors) day.setErrorText("Invalid Date"); } else { @@ -201,23 +216,27 @@ public boolean validate() { return super.validate() && validateDate(false); } - public boolean validateLeapYear(int month, int day, int year) { - String dateToValidate = month + 1 + "/" + day + "/" + year; - if (dateToValidate == null) { - return false; - } - DateTimeFormat sdf = DateTimeFormat.getFormat("MM/dd/yyyy"); - try { - Date date = sdf.parse(dateToValidate); - if (date.getMonth() != month) { + public boolean validateLeapYear(Integer month, Integer day, Integer year) { + if (month != null && day != null && year != null) { + String dateToValidate = month + 1 + "/" + day + "/" + year; + if (dateToValidate == null) { return false; } - } catch (Exception e) { - - e.printStackTrace(); - return false; + DateTimeFormat sdf = DateTimeFormat.getFormat("MM/dd/yyyy"); + try { + Date date = sdf.parse(dateToValidate); + if (date.getMonth() != month) { + return false; + } + value = date; + } catch (Exception e) { + + e.printStackTrace(); + return false; + } + return true; } - return true; + return false; } @Override From fe37a1622c3c1b05f2d7db10203f3c3b1e41104b Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 7 Aug 2019 10:16:58 +0800 Subject: [PATCH 114/247] Fixed Travis Build --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1c502780a..d48db7b23 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ sudo: false +dist: trusty language: java jdk: - oraclejdk8 From e0e338050e5472c9c5e8a56487482af810e87ed9 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 10 Sep 2019 09:45:18 +0800 Subject: [PATCH 115/247] Initial working prototype for Kanban Widget. --- .../incubator/client/kanban/Kanban.java | 149 ++ .../client/kanban/KanbanClientBundle.java | 39 + .../kanban/KanbanClientDebugBundle.java | 40 + .../incubator/client/kanban/js/JKanban.java | 48 + .../client/kanban/js/KanbanBoard.java | 65 + .../client/kanban/js/KanbanItem.java | 96 + .../client/kanban/js/KanbanOptions.java | 248 +++ .../client/kanban/resources/css/jkanban.css | 121 ++ .../kanban/resources/css/jkanban.min.css | 1 + .../client/kanban/resources/js/jkanban.js | 1643 +++++++++++++++++ .../client/kanban/resources/js/jkanban.min.js | 1 + 11 files changed, 2451 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.js create mode 100644 src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.min.js diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java b/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java new file mode 100644 index 000000000..6afa545fe --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java @@ -0,0 +1,149 @@ +package gwt.material.design.incubator.client.kanban; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.user.client.DOM; +import gwt.material.design.client.MaterialDesign; +import gwt.material.design.client.base.JsLoader; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.kanban.js.JKanban; +import gwt.material.design.incubator.client.kanban.js.KanbanBoard; +import gwt.material.design.incubator.client.kanban.js.KanbanItem; +import gwt.material.design.incubator.client.kanban.js.KanbanOptions; + +import java.util.Arrays; +import java.util.List; + +/** + * A Kanban Board implementation to easily build and organize your Board and it's Item. + * + * @author kevzlou7979@gmail.com + * @see Documentation + */ +public class Kanban extends MaterialWidget implements JsLoader { + + private JKanban kanban; + private KanbanOptions kanbanOptions = KanbanOptions.create(); + + public Kanban() { + super(Document.get().createDivElement()); + } + + static { + if (AddinsIncubator.isDebug()) { + MaterialDesign.injectDebugJs(KanbanClientDebugBundle.INSTANCE.jkanbanJs()); + MaterialDesign.injectCss(KanbanClientDebugBundle.INSTANCE.jskanbanCss()); + } else { + MaterialDesign.injectJs(KanbanClientBundle.INSTANCE.jkanbanJs()); + MaterialDesign.injectCss(KanbanClientBundle.INSTANCE.jskanbanCss()); + } + } + + @Override + protected void onLoad() { + super.onLoad(); + + load(); + } + + @Override + public void load() { + setId(DOM.createUniqueId()); + kanbanOptions = getOptions(); + kanbanOptions.setElement("#" + getId()); + kanban = new JKanban(getOptions()); + } + + @Override + public void unload() { + + } + + @Override + public void reload() { + + } + + /** + * Sets the options to be used on Kanban + */ + public void setOptions(KanbanOptions kanbanOptions) { + this.kanbanOptions = kanbanOptions; + } + + public KanbanOptions getOptions() { + return kanbanOptions; + } + + /** + * Add KanbanItem in the board with ID boardID, item is the standard format + */ + public void addItem(String boardId, KanbanItem item) { + kanban.addElement(boardId, item); + } + + + /** + * Add formItem as html element into the board with ID boardID + */ + public void addForm(String boardId, Element formElement) { + kanban.addForm(boardId, formElement); + } + + /** + * Add one or more boards in the kanban, boards are in the standard format + */ + public void addBoards(KanbanBoard... boards) { + kanban.addBoards(boards); + } + + /** + * Find board's item by id + */ + public KanbanItem findItem(String id) { + return kanban.findElement(id); + } + + /** + * Replace item by id with element JSON standard format + */ + public void replaceItem(String id, KanbanItem element) { + kanban.replaceElement(id, element); + } + + /** + * Get board ID of item id passed + */ + public String getParentBoardID(String id) { + return kanban.getParentBoardID(id); + } + + /** + * Find board by id + */ + public KanbanBoard findBoard(String id) { + return kanban.findBoard(id); + } + + /** + * Get all item of a board + */ + public List getAllBoardItems(String id) { + return Arrays.asList(kanban.getBoardElements(id)); + } + + /** + * Remove a board's element by id + */ + public void removeItem(String id) { + kanban.removeElement(id); + } + + /** + * Remove a board by id + */ + public void removeBoard(String id) { + kanban.removeBoard(id); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java new file mode 100644 index 000000000..ca56a31f7 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java @@ -0,0 +1,39 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.kanban; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +/** + * Client bundle for {@link Kanban} + * + * @author kevzlou7979@gmail.com + */ +public interface KanbanClientBundle extends ClientBundle { + KanbanClientBundle INSTANCE = GWT.create(KanbanClientBundle.class); + + @Source("resources/js/jkanban.min.js") + TextResource jkanbanJs(); + + @Source("resources/css/jkanban.min.css") + TextResource jskanbanCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java new file mode 100644 index 000000000..823bcbca8 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java @@ -0,0 +1,40 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.kanban; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.jsontable.JsonTable; + +/** + * Client Debug bundle for {@link JsonTable} + * + * @author kevzlou7979@gmail.com + */ +public interface KanbanClientDebugBundle extends ClientBundle { + KanbanClientDebugBundle INSTANCE = GWT.create(KanbanClientDebugBundle.class); + + @Source("resources/js/jkanban.js") + TextResource jkanbanJs(); + + @Source("resources/css/jkanban.css") + TextResource jskanbanCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java new file mode 100644 index 000000000..11ef50a22 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java @@ -0,0 +1,48 @@ +package gwt.material.design.incubator.client.kanban.js; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.jquery.client.api.JQueryElement; +import jsinterop.annotations.JsConstructor; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "jKanban") +public class JKanban extends JQueryElement { + + public JKanban() {} + + @JsConstructor + public JKanban(KanbanOptions options) { + } + + @JsMethod + public native void addElement(String boardId, KanbanItem element); + + @JsMethod + public native void addForm(String boardId, Element formElement); + + @JsMethod + public native void addBoards(KanbanBoard[] boards); + + @JsMethod + public native KanbanItem findElement(String id); + + @JsMethod + public native void replaceElement(String id, KanbanItem element); + + @JsMethod + public native String getParentBoardID(String id); + + @JsMethod + public native KanbanBoard findBoard(String id); + + @JsMethod + public native KanbanItem[] getBoardElements(String id); + + @JsMethod + public native void removeElement(String id); + + @JsMethod + public native void removeBoard(String id); +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java new file mode 100644 index 000000000..f6f6e5cfd --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java @@ -0,0 +1,65 @@ +package gwt.material.design.incubator.client.kanban.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.Arrays; +import java.util.List; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class KanbanBoard { + + @JsProperty + private String id; + + @JsProperty + private String title; + + @JsProperty + private String dragTo; + + @JsProperty + private KanbanItem[] item; + + @JsOverlay + public final String getId() { + return id; + } + + @JsOverlay + public final void setId(String id) { + this.id = id; + } + + @JsOverlay + public final String getTitle() { + return title; + } + + @JsOverlay + public final void setTitle(String title) { + this.title = title; + } + + @JsOverlay + public final String getDragTo() { + return dragTo; + } + + @JsOverlay + public final void setDragTo(String dragTo) { + this.dragTo = dragTo; + } + + @JsOverlay + public final List getItems() { + return Arrays.asList(item); + } + + @JsOverlay + public final void setItems(List items) { + this.item = items.toArray(new KanbanItem[0]); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java new file mode 100644 index 000000000..0e8e6cdb3 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java @@ -0,0 +1,96 @@ +package gwt.material.design.incubator.client.kanban.js; + +import com.google.gwt.user.client.ui.Widget; +import gwt.material.design.jquery.client.api.Functions; +import gwt.material.design.jscore.client.api.core.Element; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class KanbanItem { + + @JsProperty + private String id; + + @JsProperty + private String title; + + @JsProperty + private Functions.Func1 click; + + @JsProperty + private Functions.Func2 drag; + + @JsProperty + private Functions.Func1 dragend; + + @JsProperty + private Functions.Func1 drop; + + @JsOverlay + public final String getId() { + return id; + } + + @JsOverlay + public final void setId(String id) { + this.id = id; + } + + @JsOverlay + public final String getTitle() { + return title; + } + + @JsOverlay + public final void setTitle(String title) { + this.title = title; + } + + @JsOverlay + public final Functions.Func1 getClick() { + return click; + } + + @JsOverlay + public final void setClick(Functions.Func1 click) { + this.click = click; + } + + @JsOverlay + public final Functions.Func2 getDrag() { + return drag; + } + + @JsOverlay + public final void setDrag(Functions.Func2 drag) { + this.drag = drag; + } + + @JsOverlay + public final Functions.Func1 getDragend() { + return dragend; + } + + @JsOverlay + public final void setDragend(Functions.Func1 dragend) { + this.dragend = dragend; + } + + @JsOverlay + public final Functions.Func1 getDrop() { + return drop; + } + + @JsOverlay + public final void setDrop(Functions.Func1 drop) { + this.drop = drop; + } + + @JsOverlay + public final void setWidget(Widget widget) { + setTitle(widget.getElement().getInnerHTML()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java new file mode 100644 index 000000000..c9ebdca9b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java @@ -0,0 +1,248 @@ +package gwt.material.design.incubator.client.kanban.js; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.jquery.client.api.Functions; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +import java.util.Arrays; +import java.util.List; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class KanbanOptions { + + + protected KanbanOptions() { + } + + @JsOverlay + public static final KanbanOptions create() { + String Z_DEPTH_1 = "z-depth-1"; + KanbanOptions options = new KanbanOptions(); + options.setDragEl((element, source) -> { + if (element != null && !element.hasClassName(Z_DEPTH_1)) { + element.addClassName(Z_DEPTH_1); + } + }); + options.setDragendEl(element -> { + if (element != null && element.hasClassName(Z_DEPTH_1)) { + element.removeClassName(Z_DEPTH_1); + } + }); + return options; + } + + @JsProperty + private String element; + + @JsProperty + private String gutter; + + @JsProperty + private String widthBoard; + + @JsProperty + private boolean responsivePercentage; + + @JsProperty + private boolean dragItems; + + @JsProperty + private KanbanBoard[] boards; + + @JsProperty + private boolean dragBoards; + + @JsProperty + private boolean addItemButton; + + @JsProperty + private String buttonContent; + + @JsProperty + private Functions.Func1 click; + + @JsProperty + private Functions.Func2 dragEl; + + @JsProperty + private Functions.Func1 dragendEl; + + @JsProperty + private Func4 dropEl; + + @JsProperty + private Functions.Func2 dragBoard; + + @JsProperty + private Functions.Func1 dragendBoard; + + @JsProperty + private Functions.Func2 buttonClick; + + @JsOverlay + public final String getElement() { + return element; + } + + @JsOverlay + public final void setElement(String element) { + this.element = element; + } + + @JsOverlay + public final String getGutter() { + return gutter; + } + + @JsOverlay + public final void setGutter(String gutter) { + this.gutter = gutter; + } + + @JsOverlay + public final String getWidthBoard() { + return widthBoard; + } + + @JsOverlay + public final void setWidthBoard(String widthBoard) { + this.widthBoard = widthBoard; + } + + @JsOverlay + public final boolean isResponsivePercentage() { + return responsivePercentage; + } + + @JsOverlay + public final void setResponsivePercentage(boolean responsivePercentage) { + this.responsivePercentage = responsivePercentage; + } + + @JsOverlay + public final boolean isDragItems() { + return dragItems; + } + + @JsOverlay + public final void setDragItems(boolean dragItems) { + this.dragItems = dragItems; + } + + @JsOverlay + public final List getBoards() { + return Arrays.asList(boards); + } + + @JsOverlay + public final void setBoards(List boards) { + this.boards = boards.toArray(new KanbanBoard[0]); + } + + @JsOverlay + public final boolean isDragBoards() { + return dragBoards; + } + + @JsOverlay + public final void setDragBoards(boolean dragBoards) { + this.dragBoards = dragBoards; + } + + @JsOverlay + public final boolean isAddItemButton() { + return addItemButton; + } + + @JsOverlay + public final void setAddItemButton(boolean addItemButton) { + this.addItemButton = addItemButton; + } + + @JsOverlay + public final String getButtonContent() { + return buttonContent; + } + + @JsOverlay + public final void setButtonContent(String buttonContent) { + this.buttonContent = buttonContent; + } + + @JsOverlay + public final Functions.Func1 getClick() { + return click; + } + + @JsOverlay + public final void setClick(Functions.Func1 click) { + this.click = click; + } + + @JsOverlay + public final Functions.Func2 getDragEl() { + return dragEl; + } + + @JsOverlay + public final void setDragEl(Functions.Func2 dragEl) { + this.dragEl = dragEl; + } + + @JsOverlay + public final Functions.Func1 getDragendEl() { + return dragendEl; + } + + @JsOverlay + public final void setDragendEl(Functions.Func1 dragendEl) { + this.dragendEl = dragendEl; + } + + @JsOverlay + public final Func4 getDropEl() { + return dropEl; + } + + @JsOverlay + public final void setDropEl(Func4 dropEl) { + this.dropEl = dropEl; + } + + @JsOverlay + public final Functions.Func2 getDragBoard() { + return dragBoard; + } + + @JsOverlay + public final void setDragBoard(Functions.Func2 dragBoard) { + this.dragBoard = dragBoard; + } + + @JsOverlay + public final Functions.Func1 getDragendBoard() { + return dragendBoard; + } + + @JsOverlay + public final void setDragendBoard(Functions.Func1 dragendBoard) { + this.dragendBoard = dragendBoard; + } + + @JsOverlay + public final Functions.Func2 getButtonClick() { + return buttonClick; + } + + @JsOverlay + public final void setButtonClick(Functions.Func2 buttonClick) { + this.buttonClick = buttonClick; + } + + interface Func4 { + void call(A param1, B param2, C param3, D param4); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.css b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.css new file mode 100644 index 000000000..562d8cc40 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.css @@ -0,0 +1,121 @@ +.kanban-container { + position: relative; + box-sizing: border-box; + width: auto; +} + +.kanban-container * { + box-sizing: border-box; +} + +.kanban-container:after { + clear: both; + display: block; + content: ""; +} + +.kanban-board { + position: relative; + float: left; + background: #e2e4e6; + transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); +} + +.kanban-board.disabled-board { + opacity: 0.3; +} + +.kanban-board.is-moving.gu-mirror { + transform: rotate(3deg); +} + +.kanban-board.is-moving.gu-mirror .kanban-drag { + overflow: hidden; + padding-right: 50px; +} + +.kanban-board header { + font-size: 16px; + padding: 15px !important; +} + +.kanban-board header .kanban-title-board { + font-weight: 700; + margin: 0; + padding: 0; + display: inline; +} + +.kanban-board header .kanban-title-button { + float: right; +} + +.kanban-board .kanban-drag { + min-height: 200px; + padding: 20px; +} + +.kanban-board:after { + clear: both; + display: block; + content: ""; +} + +.kanban-item { + background: #fff; + padding: 15px; + margin-bottom: 20px; + transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); +} + +.kanban-item:hover { + cursor: move; +} + +.kanban-item:last-child { + margin: 0; +} + +.kanban-item.is-moving.gu-mirror { + transform: rotate(3deg); + height: auto !important; +} + +/* Dragula CSS */ +.gu-mirror { + position: fixed !important; + margin: 0 !important; + z-index: 9999 !important; +} + +.gu-hide { + display: none !important; +} + +.gu-unselectable { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; +} + +.gu-transit { + opacity: 0.2 !important; + transform: rotate(0deg) !important; +} + +/** Material Design Override **/ +.kanban-board { + background: #ffffff; + border-radius: 4px; + box-shadow: 0 2px 5px 0 rgba(78, 78, 78, 0.16), 0 2px 10px 0 rgba(119, 119, 119, 0.12); +} +.kanban-item { + position: relative; + background: #f3f3f3; + border-radius: 4px; +} + +.kanban-container main { + padding-top: 0px !important; +} diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css new file mode 100644 index 000000000..5748af09c --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css @@ -0,0 +1 @@ +.kanban-container{position:relative;box-sizing:border-box;width:auto}.kanban-container *{box-sizing:border-box}.kanban-container:after{clear:both;display:block;content:""}.kanban-board{position:relative;float:left;background:#e2e4e6;transition:all .3s cubic-bezier(.23,1,.32,1)}.kanban-board.disabled-board{opacity:.3}.kanban-board.is-moving.gu-mirror{transform:rotate(3deg)}.kanban-board.is-moving.gu-mirror .kanban-drag{overflow:hidden;padding-right:50px}.kanban-board header{font-size:16px;padding:15px!important}.kanban-board header .kanban-title-board{font-weight:700;margin:0;padding:0;display:inline}.kanban-board header .kanban-title-button{float:right}.kanban-board .kanban-drag{min-height:200px;padding:20px}.kanban-board:after{clear:both;display:block;content:""}.kanban-item{background:#fff;padding:15px;margin-bottom:20px;transition:all .3s cubic-bezier(.23,1,.32,1)}.kanban-item:hover{cursor:move}.kanban-item:last-child{margin:0}.kanban-item.is-moving.gu-mirror{transform:rotate(3deg);height:auto!important}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2!important;transform:rotate(0)!important}.kanban-board{background:#fff;border-radius:4px;box-shadow:0 2px 5px 0 rgba(78,78,78,.16),0 2px 10px 0 rgba(119,119,119,.12)}.kanban-item{position:relative;background:#f3f3f3;border-radius:4px}.kanban-container main{padding-top:0!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.js b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.js new file mode 100644 index 000000000..606acfdde --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.js @@ -0,0 +1,1643 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i self.options.responsive) { + //Init Drag Board + self.drakeBoard = self + .dragula([self.container], { + moves: function(el, source, handle, sibling) { + if (!self.options.dragBoards) return false; + return ( + handle.classList.contains("kanban-board-header") || + handle.classList.contains("kanban-title-board") + ); + }, + accepts: function(el, target, source, sibling) { + return target.classList.contains("kanban-container"); + }, + revertOnSpill: true, + direction: "horizontal" + }) + .on("drag", function(el, source) { + el.classList.add("is-moving"); + self.options.dragBoard(el, source); + if (typeof el.dragfn === "function") el.dragfn(el, source); + }) + .on("dragend", function(el) { + __updateBoardsOrder(); + el.classList.remove("is-moving"); + self.options.dragendBoard(el); + if (typeof el.dragendfn === "function") el.dragendfn(el); + }) + .on("drop", function(el, target, source, sibling) { + el.classList.remove("is-moving"); + self.options.dropBoard(el, target, source, sibling); + if (typeof el.dropfn === "function") + el.dropfn(el, target, source, sibling); + }); + + //Init Drag Item + self.drake = self + .dragula(self.boardContainer, { + moves: function(el, source, handle, sibling) { + return !!self.options.dragItems; + }, + revertOnSpill: true + }) + .on("cancel", function(el, container, source) { + self.enableAllBoards(); + }) + .on("drag", function(el, source) { + var elClass = el.getAttribute("class"); + if (elClass !== "" && elClass.indexOf("not-draggable") > -1) { + self.drake.cancel(true); + return; + } + + el.classList.add("is-moving"); + var boardJSON = __findBoardJSON(source.parentNode.dataset.id); + if (boardJSON.dragTo !== undefined) { + self.options.boards.map(function(board) { + if ( + boardJSON.dragTo.indexOf(board.id) === -1 && + board.id !== source.parentNode.dataset.id + ) { + self.findBoard(board.id).classList.add("disabled-board"); + } + }); + } + + self.options.dragEl(el, source); + if (el !== null && typeof el.dragfn === "function") + el.dragfn(el, source); + }) + .on("dragend", function(el) { + self.options.dragendEl(el); + if (el !== null && typeof el.dragendfn === "function") + el.dragendfn(el); + }) + .on("drop", function(el, target, source, sibling) { + self.enableAllBoards(); + + var boardJSON = __findBoardJSON(source.parentNode.dataset.id); + if (boardJSON.dragTo !== undefined) { + if ( + boardJSON.dragTo.indexOf(target.parentNode.dataset.id) === -1 && + target.parentNode.dataset.id !== source.parentNode.dataset.id + ) { + self.drake.cancel(true); + } + } + if (el !== null) { + var result = self.options.dropEl(el, target, source, sibling); + if (result === false) { + self.drake.cancel(true); + } + el.classList.remove("is-moving"); + if (typeof el.dropfn === "function") + el.dropfn(el, target, source, sibling); + } + }); + } + }; + + this.enableAllBoards = function() { + var allB = document.querySelectorAll(".kanban-board"); + if (allB.length > 0 && allB !== undefined) { + for (var i = 0; i < allB.length; i++) { + allB[i].classList.remove("disabled-board"); + } + } + }; + + this.addElement = function(boardID, element) { + var board = self.element.querySelector( + '[data-id="' + boardID + '"] .kanban-drag' + ); + var nodeItem = document.createElement("div"); + nodeItem.classList.add("kanban-item"); + console.log(element); + if (typeof element.id !== "undefined" && element.id !== "") { + nodeItem.setAttribute("data-eid", element.id); + } + nodeItem.innerHTML = element.title; + //add function + nodeItem.clickfn = element.click; + nodeItem.dragfn = element.drag; + nodeItem.dragendfn = element.dragend; + nodeItem.dropfn = element.drop; + __appendCustomProperties(nodeItem, element); + __onclickHandler(nodeItem); + board.appendChild(nodeItem); + return self; + }; + + this.addForm = function(boardID, formItem) { + var board = self.element.querySelector( + '[data-id="' + boardID + '"] .kanban-drag' + ); + var _attribute = formItem.getAttribute("class"); + formItem.setAttribute("class", _attribute + " not-draggable"); + board.appendChild(formItem); + return self; + }; + + this.addBoards = function(boards, isInit) { + if (self.options.responsivePercentage) { + self.container.style.width = "100%"; + self.options.gutter = "1%"; + if (window.innerWidth > self.options.responsive) { + var boardWidth = (100 - boards.length * 2) / boards.length; + } else { + var boardWidth = 100 - boards.length * 2; + } + } else { + var boardWidth = self.options.widthBoard; + } + var addButton = self.options.addItemButton; + var buttonContent = self.options.buttonContent; + + //for on all the boards + for (var boardkey in boards) { + // single board + var board = boards[boardkey]; + if (!isInit) { + self.options.boards.push(board); + } + + if (!self.options.responsivePercentage) { + //add width to container + if (self.container.style.width === "") { + self.container.style.width = + parseInt(boardWidth) + parseInt(self.options.gutter) * 2 + "px"; + } else { + self.container.style.width = + parseInt(self.container.style.width) + + parseInt(boardWidth) + + parseInt(self.options.gutter) * 2 + + "px"; + } + } + //create node + var boardNode = document.createElement("div"); + boardNode.dataset.id = board.id; + boardNode.dataset.order = self.container.childNodes.length + 1; + boardNode.classList.add("kanban-board"); + //set style + if (self.options.responsivePercentage) { + boardNode.style.width = boardWidth + "%"; + } else { + boardNode.style.width = boardWidth; + } + boardNode.style.marginLeft = self.options.gutter; + boardNode.style.marginRight = self.options.gutter; + // header board + var headerBoard = document.createElement("header"); + if (board.class !== "" && board.class !== undefined) + var allClasses = board.class.split(","); + else allClasses = []; + headerBoard.classList.add("kanban-board-header"); + allClasses.map(function(value) { + headerBoard.classList.add(value); + }); + headerBoard.innerHTML = + '
' + board.title + "
"; + // if add button is true, add button to the board + if (addButton) { + var btn = document.createElement("BUTTON"); + var t = document.createTextNode(buttonContent); + btn.setAttribute( + "class", + "kanban-title-button btn btn-default btn-xs" + ); + btn.appendChild(t); + //var buttonHtml = '' + headerBoard.appendChild(btn); + __onButtonClickHandler(btn, board.id); + } + //content board + var contentBoard = document.createElement("main"); + contentBoard.classList.add("kanban-drag"); + if (board.bodyClass !== "" && board.bodyClass !== undefined) + var bodyClasses = board.bodyClass.split(","); + else bodyClasses = []; + bodyClasses.map(function(value) { + contentBoard.classList.add(value); + }); + //add drag to array for dragula + self.boardContainer.push(contentBoard); + for (var itemkey in board.item) { + //create item + var itemKanban = board.item[itemkey]; + var nodeItem = document.createElement("div"); + nodeItem.classList.add("kanban-item"); + if (itemKanban.id) { + nodeItem.dataset.eid = itemKanban.id; + } + nodeItem.innerHTML = itemKanban.title; + //add function + nodeItem.clickfn = itemKanban.click; + nodeItem.dragfn = itemKanban.drag; + nodeItem.dragendfn = itemKanban.dragend; + nodeItem.dropfn = itemKanban.drop; + __appendCustomProperties(nodeItem, itemKanban); + //add click handler of item + __onclickHandler(nodeItem); + contentBoard.appendChild(nodeItem); + } + //footer board + var footerBoard = document.createElement("footer"); + //board assembly + boardNode.appendChild(headerBoard); + boardNode.appendChild(contentBoard); + boardNode.appendChild(footerBoard); + //board add + self.container.appendChild(boardNode); + } + return self; + }; + + this.findBoard = function(id) { + var el = self.element.querySelector('[data-id="' + id + '"]'); + return el; + }; + + this.getParentBoardID = function(el) { + if (typeof el === "string") { + el = self.element.querySelector('[data-eid="' + el + '"]'); + } + if (el === null) { + return null; + } + return el.parentNode.parentNode.dataset.id; + }; + + this.moveElement = function(targetBoardID, elementID, element) { + if (targetBoardID === this.getParentBoardID(elementID)) { + return; + } + + this.removeElement(elementID); + return this.addElement(targetBoardID, element); + }; + + this.replaceElement = function(el, element) { + var nodeItem = el; + if (typeof nodeItem === "string") { + nodeItem = self.element.querySelector('[data-eid="' + el + '"]'); + } + nodeItem.innerHTML = element.title; + // add function + nodeItem.clickfn = element.click; + nodeItem.dragfn = element.drag; + nodeItem.dragendfn = element.dragend; + nodeItem.dropfn = element.drop; + __appendCustomProperties(nodeItem, element); + return self; + }; + + this.findElement = function(id) { + var el = self.element.querySelector('[data-eid="' + id + '"]'); + return el; + }; + + this.getBoardElements = function(id) { + var board = self.element.querySelector( + '[data-id="' + id + '"] .kanban-drag' + ); + return board.childNodes; + }; + + this.removeElement = function(el) { + if (typeof el === "string") + el = self.element.querySelector('[data-eid="' + el + '"]'); + if (el !== null) { + el.remove(); + } + return self; + }; + + this.removeBoard = function(board) { + var boardElement = null; + if (typeof board === "string") + boardElement = self.element.querySelector('[data-id="' + board + '"]'); + if (boardElement !== null) { + boardElement.remove(); + } + + // remove thboard in options.boards + for(var i = 0; i < self.options.boards.length; i++) { + if(self.options.boards[i].id === board) { + self.options.boards.splice(i, 1); + break; + } + } + + return self; + }; + + // board button on click function + this.onButtonClick = function(el) {}; + + //PRIVATE FUNCTION + function __extendDefaults(source, properties) { + var property; + for (property in properties) { + if (properties.hasOwnProperty(property)) { + source[property] = properties[property]; + } + } + return source; + } + + function __setBoard() { + self.element = document.querySelector(self.options.element); + //create container + var boardContainer = document.createElement("div"); + boardContainer.classList.add("kanban-container"); + self.container = boardContainer; + //add boards + self.addBoards(self.options.boards, true); + //appends to container + self.element.appendChild(self.container); + } + + function __onclickHandler(nodeItem, clickfn) { + nodeItem.addEventListener("click", function(e) { + e.preventDefault(); + self.options.click(this); + if (typeof this.clickfn === "function") this.clickfn(this); + }); + } + + function __onButtonClickHandler(nodeItem, boardId) { + nodeItem.addEventListener("click", function(e) { + e.preventDefault(); + self.options.buttonClick(this, boardId); + // if(typeof(this.clickfn) === 'function') + // this.clickfn(this); + }); + } + + function __findBoardJSON(id) { + var el = []; + self.options.boards.map(function(board) { + if (board.id === id) { + return el.push(board); + } + }); + return el[0]; + } + + function __appendCustomProperties(element, parentObject) { + for (var propertyName in parentObject) { + if (self._disallowedItemProperties.indexOf(propertyName) > -1) { + continue; + } + + element.setAttribute( + "data-" + propertyName, + parentObject[propertyName] + ); + } + } + + function __updateBoardsOrder() { + var index = 1; + for (var i = 0; i < self.container.childNodes.length; i++) { + self.container.childNodes[i].dataset.order = index++; + } + } + + //init plugin + this.init(); + }; + })(); + + },{"dragula":9}],2:[function(require,module,exports){ + module.exports = function atoa (a, n) { return Array.prototype.slice.call(a, n); } + + },{}],3:[function(require,module,exports){ + 'use strict'; + + var ticky = require('ticky'); + + module.exports = function debounce (fn, args, ctx) { + if (!fn) { return; } + ticky(function run () { + fn.apply(ctx || null, args || []); + }); + }; + + },{"ticky":11}],4:[function(require,module,exports){ + 'use strict'; + + var atoa = require('atoa'); + var debounce = require('./debounce'); + + module.exports = function emitter (thing, options) { + var opts = options || {}; + var evt = {}; + if (thing === undefined) { thing = {}; } + thing.on = function (type, fn) { + if (!evt[type]) { + evt[type] = [fn]; + } else { + evt[type].push(fn); + } + return thing; + }; + thing.once = function (type, fn) { + fn._once = true; // thing.off(fn) still works! + thing.on(type, fn); + return thing; + }; + thing.off = function (type, fn) { + var c = arguments.length; + if (c === 1) { + delete evt[type]; + } else if (c === 0) { + evt = {}; + } else { + var et = evt[type]; + if (!et) { return thing; } + et.splice(et.indexOf(fn), 1); + } + return thing; + }; + thing.emit = function () { + var args = atoa(arguments); + return thing.emitterSnapshot(args.shift()).apply(this, args); + }; + thing.emitterSnapshot = function (type) { + var et = (evt[type] || []).slice(0); + return function () { + var args = atoa(arguments); + var ctx = this || thing; + if (type === 'error' && opts.throws !== false && !et.length) { throw args.length === 1 ? args[0] : args; } + et.forEach(function emitter (listen) { + if (opts.async) { debounce(listen, args, ctx); } else { listen.apply(ctx, args); } + if (listen._once) { thing.off(type, listen); } + }); + return thing; + }; + }; + return thing; + }; + + },{"./debounce":3,"atoa":2}],5:[function(require,module,exports){ + (function (global){ + 'use strict'; + + var customEvent = require('custom-event'); + var eventmap = require('./eventmap'); + var doc = global.document; + var addEvent = addEventEasy; + var removeEvent = removeEventEasy; + var hardCache = []; + + if (!global.addEventListener) { + addEvent = addEventHard; + removeEvent = removeEventHard; + } + + module.exports = { + add: addEvent, + remove: removeEvent, + fabricate: fabricateEvent + }; + + function addEventEasy (el, type, fn, capturing) { + return el.addEventListener(type, fn, capturing); + } + + function addEventHard (el, type, fn) { + return el.attachEvent('on' + type, wrap(el, type, fn)); + } + + function removeEventEasy (el, type, fn, capturing) { + return el.removeEventListener(type, fn, capturing); + } + + function removeEventHard (el, type, fn) { + var listener = unwrap(el, type, fn); + if (listener) { + return el.detachEvent('on' + type, listener); + } + } + + function fabricateEvent (el, type, model) { + var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent(); + if (el.dispatchEvent) { + el.dispatchEvent(e); + } else { + el.fireEvent('on' + type, e); + } + function makeClassicEvent () { + var e; + if (doc.createEvent) { + e = doc.createEvent('Event'); + e.initEvent(type, true, true); + } else if (doc.createEventObject) { + e = doc.createEventObject(); + } + return e; + } + function makeCustomEvent () { + return new customEvent(type, { detail: model }); + } + } + + function wrapperFactory (el, type, fn) { + return function wrapper (originalEvent) { + var e = originalEvent || global.event; + e.target = e.target || e.srcElement; + e.preventDefault = e.preventDefault || function preventDefault () { e.returnValue = false; }; + e.stopPropagation = e.stopPropagation || function stopPropagation () { e.cancelBubble = true; }; + e.which = e.which || e.keyCode; + fn.call(el, e); + }; + } + + function wrap (el, type, fn) { + var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn); + hardCache.push({ + wrapper: wrapper, + element: el, + type: type, + fn: fn + }); + return wrapper; + } + + function unwrap (el, type, fn) { + var i = find(el, type, fn); + if (i) { + var wrapper = hardCache[i].wrapper; + hardCache.splice(i, 1); // free up a tad of memory + return wrapper; + } + } + + function find (el, type, fn) { + var i, item; + for (i = 0; i < hardCache.length; i++) { + item = hardCache[i]; + if (item.element === el && item.type === type && item.fn === fn) { + return i; + } + } + } + + }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + },{"./eventmap":6,"custom-event":7}],6:[function(require,module,exports){ + (function (global){ + 'use strict'; + + var eventmap = []; + var eventname = ''; + var ron = /^on/; + + for (eventname in global) { + if (ron.test(eventname)) { + eventmap.push(eventname.slice(2)); + } + } + + module.exports = eventmap; + + }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + },{}],7:[function(require,module,exports){ + (function (global){ + + var NativeCustomEvent = global.CustomEvent; + + function useNative () { + try { + var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } }); + return 'cat' === p.type && 'bar' === p.detail.foo; + } catch (e) { + } + return false; + } + + /** + * Cross-browser `CustomEvent` constructor. + * + * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent + * + * @public + */ + + module.exports = useNative() ? NativeCustomEvent : + + // IE >= 9 + 'function' === typeof document.createEvent ? function CustomEvent (type, params) { + var e = document.createEvent('CustomEvent'); + if (params) { + e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); + } else { + e.initCustomEvent(type, false, false, void 0); + } + return e; + } : + + // IE <= 8 + function CustomEvent (type, params) { + var e = document.createEventObject(); + e.type = type; + if (params) { + e.bubbles = Boolean(params.bubbles); + e.cancelable = Boolean(params.cancelable); + e.detail = params.detail; + } else { + e.bubbles = false; + e.cancelable = false; + e.detail = void 0; + } + return e; + } + + }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + },{}],8:[function(require,module,exports){ + 'use strict'; + + var cache = {}; + var start = '(?:^|\\s)'; + var end = '(?:\\s|$)'; + + function lookupClass (className) { + var cached = cache[className]; + if (cached) { + cached.lastIndex = 0; + } else { + cache[className] = cached = new RegExp(start + className + end, 'g'); + } + return cached; + } + + function addClass (el, className) { + var current = el.className; + if (!current.length) { + el.className = className; + } else if (!lookupClass(className).test(current)) { + el.className += ' ' + className; + } + } + + function rmClass (el, className) { + el.className = el.className.replace(lookupClass(className), ' ').trim(); + } + + module.exports = { + add: addClass, + rm: rmClass + }; + + },{}],9:[function(require,module,exports){ + (function (global){ + 'use strict'; + + var emitter = require('contra/emitter'); + var crossvent = require('crossvent'); + var classes = require('./classes'); + var doc = document; + var documentElement = doc.documentElement; + + function dragula (initialContainers, options) { + var len = arguments.length; + if (len === 1 && Array.isArray(initialContainers) === false) { + options = initialContainers; + initialContainers = []; + } + var _mirror; // mirror image + var _source; // source container + var _item; // item being dragged + var _offsetX; // reference x + var _offsetY; // reference y + var _moveX; // reference move x + var _moveY; // reference move y + var _initialSibling; // reference sibling when grabbed + var _currentSibling; // reference sibling now + var _copy; // item used for copying + var _renderTimer; // timer for setTimeout renderMirrorImage + var _lastDropTarget = null; // last container item was over + var _grabbed; // holds mousedown context until first mousemove + + var o = options || {}; + if (o.moves === void 0) { o.moves = always; } + if (o.accepts === void 0) { o.accepts = always; } + if (o.invalid === void 0) { o.invalid = invalidTarget; } + if (o.containers === void 0) { o.containers = initialContainers || []; } + if (o.isContainer === void 0) { o.isContainer = never; } + if (o.copy === void 0) { o.copy = false; } + if (o.copySortSource === void 0) { o.copySortSource = false; } + if (o.revertOnSpill === void 0) { o.revertOnSpill = false; } + if (o.removeOnSpill === void 0) { o.removeOnSpill = false; } + if (o.direction === void 0) { o.direction = 'vertical'; } + if (o.ignoreInputTextSelection === void 0) { o.ignoreInputTextSelection = true; } + if (o.mirrorContainer === void 0) { o.mirrorContainer = doc.body; } + + var drake = emitter({ + containers: o.containers, + start: manualStart, + end: end, + cancel: cancel, + remove: remove, + destroy: destroy, + canMove: canMove, + dragging: false + }); + + if (o.removeOnSpill === true) { + drake.on('over', spillOver).on('out', spillOut); + } + + events(); + + return drake; + + function isContainer (el) { + return drake.containers.indexOf(el) !== -1 || o.isContainer(el); + } + + function events (remove) { + var op = remove ? 'remove' : 'add'; + touchy(documentElement, op, 'mousedown', grab); + touchy(documentElement, op, 'mouseup', release); + } + + function eventualMovements (remove) { + var op = remove ? 'remove' : 'add'; + touchy(documentElement, op, 'mousemove', startBecauseMouseMoved); + } + + function movements (remove) { + var op = remove ? 'remove' : 'add'; + crossvent[op](documentElement, 'selectstart', preventGrabbed); // IE8 + crossvent[op](documentElement, 'click', preventGrabbed); + } + + function destroy () { + events(true); + release({}); + } + + function preventGrabbed (e) { + if (_grabbed) { + e.preventDefault(); + } + } + + function grab (e) { + _moveX = e.clientX; + _moveY = e.clientY; + + var ignore = whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey; + if (ignore) { + return; // we only care about honest-to-god left clicks and touch events + } + var item = e.target; + var context = canStart(item); + if (!context) { + return; + } + _grabbed = context; + eventualMovements(); + if (e.type === 'mousedown') { + if (isInput(item)) { // see also: https://github.com/bevacqua/dragula/issues/208 + item.focus(); // fixes https://github.com/bevacqua/dragula/issues/176 + } else { + e.preventDefault(); // fixes https://github.com/bevacqua/dragula/issues/155 + } + } + } + + function startBecauseMouseMoved (e) { + if (!_grabbed) { + return; + } + if (whichMouseButton(e) === 0) { + release({}); + return; // when text is selected on an input and then dragged, mouseup doesn't fire. this is our only hope + } + // truthy check fixes #239, equality fixes #207 + if (e.clientX !== void 0 && e.clientX === _moveX && e.clientY !== void 0 && e.clientY === _moveY) { + return; + } + if (o.ignoreInputTextSelection) { + var clientX = getCoord('clientX', e); + var clientY = getCoord('clientY', e); + var elementBehindCursor = doc.elementFromPoint(clientX, clientY); + if (isInput(elementBehindCursor)) { + return; + } + } + + var grabbed = _grabbed; // call to end() unsets _grabbed + eventualMovements(true); + movements(); + end(); + start(grabbed); + + var offset = getOffset(_item); + _offsetX = getCoord('pageX', e) - offset.left; + _offsetY = getCoord('pageY', e) - offset.top; + + classes.add(_copy || _item, 'gu-transit'); + renderMirrorImage(); + drag(e); + } + + function canStart (item) { + if (drake.dragging && _mirror) { + return; + } + if (isContainer(item)) { + return; // don't drag container itself + } + var handle = item; + while (getParent(item) && isContainer(getParent(item)) === false) { + if (o.invalid(item, handle)) { + return; + } + item = getParent(item); // drag target should be a top element + if (!item) { + return; + } + } + var source = getParent(item); + if (!source) { + return; + } + if (o.invalid(item, handle)) { + return; + } + + var movable = o.moves(item, source, handle, nextEl(item)); + if (!movable) { + return; + } + + return { + item: item, + source: source + }; + } + + function canMove (item) { + return !!canStart(item); + } + + function manualStart (item) { + var context = canStart(item); + if (context) { + start(context); + } + } + + function start (context) { + if (isCopy(context.item, context.source)) { + _copy = context.item.cloneNode(true); + drake.emit('cloned', _copy, context.item, 'copy'); + } + + _source = context.source; + _item = context.item; + _initialSibling = _currentSibling = nextEl(context.item); + + drake.dragging = true; + drake.emit('drag', _item, _source); + } + + function invalidTarget () { + return false; + } + + function end () { + if (!drake.dragging) { + return; + } + var item = _copy || _item; + drop(item, getParent(item)); + } + + function ungrab () { + _grabbed = false; + eventualMovements(true); + movements(true); + } + + function release (e) { + ungrab(); + + if (!drake.dragging) { + return; + } + var item = _copy || _item; + var clientX = getCoord('clientX', e); + var clientY = getCoord('clientY', e); + var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY); + var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY); + if (dropTarget && ((_copy && o.copySortSource) || (!_copy || dropTarget !== _source))) { + drop(item, dropTarget); + } else if (o.removeOnSpill) { + remove(); + } else { + cancel(); + } + } + + function drop (item, target) { + var parent = getParent(item); + if (_copy && o.copySortSource && target === _source) { + parent.removeChild(_item); + } + if (isInitialPlacement(target)) { + drake.emit('cancel', item, _source, _source); + } else { + drake.emit('drop', item, target, _source, _currentSibling); + } + cleanup(); + } + + function remove () { + if (!drake.dragging) { + return; + } + var item = _copy || _item; + var parent = getParent(item); + if (parent) { + parent.removeChild(item); + } + drake.emit(_copy ? 'cancel' : 'remove', item, parent, _source); + cleanup(); + } + + function cancel (revert) { + if (!drake.dragging) { + return; + } + var reverts = arguments.length > 0 ? revert : o.revertOnSpill; + var item = _copy || _item; + var parent = getParent(item); + var initial = isInitialPlacement(parent); + if (initial === false && reverts) { + if (_copy) { + if (parent) { + parent.removeChild(_copy); + } + } else { + _source.insertBefore(item, _initialSibling); + } + } + if (initial || reverts) { + drake.emit('cancel', item, _source, _source); + } else { + drake.emit('drop', item, parent, _source, _currentSibling); + } + cleanup(); + } + + function cleanup () { + var item = _copy || _item; + ungrab(); + removeMirrorImage(); + if (item) { + classes.rm(item, 'gu-transit'); + } + if (_renderTimer) { + clearTimeout(_renderTimer); + } + drake.dragging = false; + if (_lastDropTarget) { + drake.emit('out', item, _lastDropTarget, _source); + } + drake.emit('dragend', item); + _source = _item = _copy = _initialSibling = _currentSibling = _renderTimer = _lastDropTarget = null; + } + + function isInitialPlacement (target, s) { + var sibling; + if (s !== void 0) { + sibling = s; + } else if (_mirror) { + sibling = _currentSibling; + } else { + sibling = nextEl(_copy || _item); + } + return target === _source && sibling === _initialSibling; + } + + function findDropTarget (elementBehindCursor, clientX, clientY) { + var target = elementBehindCursor; + while (target && !accepted()) { + target = getParent(target); + } + return target; + + function accepted () { + var droppable = isContainer(target); + if (droppable === false) { + return false; + } + + var immediate = getImmediateChild(target, elementBehindCursor); + var reference = getReference(target, immediate, clientX, clientY); + var initial = isInitialPlacement(target, reference); + if (initial) { + return true; // should always be able to drop it right back where it was + } + return o.accepts(_item, target, _source, reference); + } + } + + function drag (e) { + if (!_mirror) { + return; + } + e.preventDefault(); + + var clientX = getCoord('clientX', e); + var clientY = getCoord('clientY', e); + var x = clientX - _offsetX; + var y = clientY - _offsetY; + + _mirror.style.left = x + 'px'; + _mirror.style.top = y + 'px'; + + var item = _copy || _item; + var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY); + var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY); + var changed = dropTarget !== null && dropTarget !== _lastDropTarget; + if (changed || dropTarget === null) { + out(); + _lastDropTarget = dropTarget; + over(); + } + var parent = getParent(item); + if (dropTarget === _source && _copy && !o.copySortSource) { + if (parent) { + parent.removeChild(item); + } + return; + } + var reference; + var immediate = getImmediateChild(dropTarget, elementBehindCursor); + if (immediate !== null) { + reference = getReference(dropTarget, immediate, clientX, clientY); + } else if (o.revertOnSpill === true && !_copy) { + reference = _initialSibling; + dropTarget = _source; + } else { + if (_copy && parent) { + parent.removeChild(item); + } + return; + } + if ( + (reference === null && changed) || + reference !== item && + reference !== nextEl(item) + ) { + _currentSibling = reference; + dropTarget.insertBefore(item, reference); + drake.emit('shadow', item, dropTarget, _source); + } + function moved (type) { drake.emit(type, item, _lastDropTarget, _source); } + function over () { if (changed) { moved('over'); } } + function out () { if (_lastDropTarget) { moved('out'); } } + } + + function spillOver (el) { + classes.rm(el, 'gu-hide'); + } + + function spillOut (el) { + if (drake.dragging) { classes.add(el, 'gu-hide'); } + } + + function renderMirrorImage () { + if (_mirror) { + return; + } + var rect = _item.getBoundingClientRect(); + _mirror = _item.cloneNode(true); + _mirror.style.width = getRectWidth(rect) + 'px'; + _mirror.style.height = getRectHeight(rect) + 'px'; + classes.rm(_mirror, 'gu-transit'); + classes.add(_mirror, 'gu-mirror'); + o.mirrorContainer.appendChild(_mirror); + touchy(documentElement, 'add', 'mousemove', drag); + classes.add(o.mirrorContainer, 'gu-unselectable'); + drake.emit('cloned', _mirror, _item, 'mirror'); + } + + function removeMirrorImage () { + if (_mirror) { + classes.rm(o.mirrorContainer, 'gu-unselectable'); + touchy(documentElement, 'remove', 'mousemove', drag); + getParent(_mirror).removeChild(_mirror); + _mirror = null; + } + } + + function getImmediateChild (dropTarget, target) { + var immediate = target; + while (immediate !== dropTarget && getParent(immediate) !== dropTarget) { + immediate = getParent(immediate); + } + if (immediate === documentElement) { + return null; + } + return immediate; + } + + function getReference (dropTarget, target, x, y) { + var horizontal = o.direction === 'horizontal'; + var reference = target !== dropTarget ? inside() : outside(); + return reference; + + function outside () { // slower, but able to figure out any position + var len = dropTarget.children.length; + var i; + var el; + var rect; + for (i = 0; i < len; i++) { + el = dropTarget.children[i]; + rect = el.getBoundingClientRect(); + if (horizontal && (rect.left + rect.width / 2) > x) { return el; } + if (!horizontal && (rect.top + rect.height / 2) > y) { return el; } + } + return null; + } + + function inside () { // faster, but only available if dropped inside a child element + var rect = target.getBoundingClientRect(); + if (horizontal) { + return resolve(x > rect.left + getRectWidth(rect) / 2); + } + return resolve(y > rect.top + getRectHeight(rect) / 2); + } + + function resolve (after) { + return after ? nextEl(target) : target; + } + } + + function isCopy (item, container) { + return typeof o.copy === 'boolean' ? o.copy : o.copy(item, container); + } + } + + function touchy (el, op, type, fn) { + var touch = { + mouseup: 'touchend', + mousedown: 'touchstart', + mousemove: 'touchmove' + }; + var pointers = { + mouseup: 'pointerup', + mousedown: 'pointerdown', + mousemove: 'pointermove' + }; + var microsoft = { + mouseup: 'MSPointerUp', + mousedown: 'MSPointerDown', + mousemove: 'MSPointerMove' + }; + if (global.navigator.pointerEnabled) { + crossvent[op](el, pointers[type], fn); + } else if (global.navigator.msPointerEnabled) { + crossvent[op](el, microsoft[type], fn); + } else { + crossvent[op](el, touch[type], fn); + crossvent[op](el, type, fn); + } + } + + function whichMouseButton (e) { + if (e.touches !== void 0) { return e.touches.length; } + if (e.which !== void 0 && e.which !== 0) { return e.which; } // see https://github.com/bevacqua/dragula/issues/261 + if (e.buttons !== void 0) { return e.buttons; } + var button = e.button; + if (button !== void 0) { // see https://github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575 + return button & 1 ? 1 : button & 2 ? 3 : (button & 4 ? 2 : 0); + } + } + + function getOffset (el) { + var rect = el.getBoundingClientRect(); + return { + left: rect.left + getScroll('scrollLeft', 'pageXOffset'), + top: rect.top + getScroll('scrollTop', 'pageYOffset') + }; + } + + function getScroll (scrollProp, offsetProp) { + if (typeof global[offsetProp] !== 'undefined') { + return global[offsetProp]; + } + if (documentElement.clientHeight) { + return documentElement[scrollProp]; + } + return doc.body[scrollProp]; + } + + function getElementBehindPoint (point, x, y) { + var p = point || {}; + var state = p.className; + var el; + p.className += ' gu-hide'; + el = doc.elementFromPoint(x, y); + p.className = state; + return el; + } + + function never () { return false; } + function always () { return true; } + function getRectWidth (rect) { return rect.width || (rect.right - rect.left); } + function getRectHeight (rect) { return rect.height || (rect.bottom - rect.top); } + function getParent (el) { return el.parentNode === doc ? null : el.parentNode; } + function isInput (el) { return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el); } + function isEditable (el) { + if (!el) { return false; } // no parents were editable + if (el.contentEditable === 'false') { return false; } // stop the lookup + if (el.contentEditable === 'true') { return true; } // found a contentEditable element in the chain + return isEditable(getParent(el)); // contentEditable is set to 'inherit' + } + + function nextEl (el) { + return el.nextElementSibling || manually(); + function manually () { + var sibling = el; + do { + sibling = sibling.nextSibling; + } while (sibling && sibling.nodeType !== 1); + return sibling; + } + } + + function getEventHost (e) { + // on touchend event, we have to use `e.changedTouches` + // see http://stackoverflow.com/questions/7192563/touchend-event-properties + // see https://github.com/bevacqua/dragula/issues/34 + if (e.targetTouches && e.targetTouches.length) { + return e.targetTouches[0]; + } + if (e.changedTouches && e.changedTouches.length) { + return e.changedTouches[0]; + } + return e; + } + + function getCoord (coord, e) { + var host = getEventHost(e); + var missMap = { + pageX: 'clientX', // IE8 + pageY: 'clientY' // IE8 + }; + if (coord in missMap && !(coord in host) && missMap[coord] in host) { + coord = missMap[coord]; + } + return host[coord]; + } + + module.exports = dragula; + + }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + },{"./classes":8,"contra/emitter":4,"crossvent":5}],10:[function(require,module,exports){ +// shim for using process in browser + var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + } ()) + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + +// v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + + process.listeners = function (name) { return [] } + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + },{}],11:[function(require,module,exports){ + (function (setImmediate){ + var si = typeof setImmediate === 'function', tick; + if (si) { + tick = function (fn) { setImmediate(fn); }; + } else { + tick = function (fn) { setTimeout(fn, 0); }; + } + + module.exports = tick; + }).call(this,require("timers").setImmediate) + },{"timers":12}],12:[function(require,module,exports){ + (function (setImmediate,clearImmediate){ + var nextTick = require('process/browser.js').nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + +// DOM APIs, for completeness + + exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); + }; + exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); + }; + exports.clearTimeout = + exports.clearInterval = function(timeout) { timeout.close(); }; + + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function() {}; + Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); + }; + +// Does not start the time, just sets up the members needed. + exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + + exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + + exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } + }; + +// That's not how node.js implements it but the exposed api is the same. + exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; + }; + + exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; + }; + }).call(this,require("timers").setImmediate,require("timers").clearImmediate) + },{"process/browser.js":10,"timers":12}]},{},[1]); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.min.js b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.min.js new file mode 100644 index 000000000..0f601d3d6 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/jkanban.min.js @@ -0,0 +1 @@ +!function i(a,c,d){function u(t,e){if(!c[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(l)return l(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=c[t]={exports:{}};a[t][0].call(o.exports,function(e){return u(a[t][1][e]||e)},o,o.exports,i,a,c,d)}return c[t].exports}for(var l="function"==typeof require&&require,e=0;eb.options.responsive&&(b.drakeBoard=b.dragula([b.container],{moves:function(e,t,n,r){return!!b.options.dragBoards&&(n.classList.contains("kanban-board-header")||n.classList.contains("kanban-title-board"))},accepts:function(e,t,n,r){return t.classList.contains("kanban-container")},revertOnSpill:!0,direction:"horizontal"}).on("drag",function(e,t){e.classList.add("is-moving"),b.options.dragBoard(e,t),"function"==typeof e.dragfn&&e.dragfn(e,t)}).on("dragend",function(e){!function(){for(var e=1,t=0;tb.options.responsive)var n=(100-2*e.length)/e.length;else n=100-2*e.length;else n=b.options.widthBoard;var r=b.options.addItemButton,o=b.options.buttonContent;for(var i in e){var a=e[i];t||b.options.boards.push(a),b.options.responsivePercentage||(""===b.container.style.width?b.container.style.width=parseInt(n)+2*parseInt(b.options.gutter)+"px":b.container.style.width=parseInt(b.container.style.width)+parseInt(n)+2*parseInt(b.options.gutter)+"px");var c=document.createElement("div");c.dataset.id=a.id,c.dataset.order=b.container.childNodes.length+1,c.classList.add("kanban-board"),b.options.responsivePercentage?c.style.width=n+"%":c.style.width=n,c.style.marginLeft=b.options.gutter,c.style.marginRight=b.options.gutter;var d=document.createElement("header");if(""!==a.class&&void 0!==a.class)var u=a.class.split(",");else u=[];if(d.classList.add("kanban-board-header"),u.map(function(e){d.classList.add(e)}),d.innerHTML='
'+a.title+"
",r){var l=document.createElement("BUTTON"),s=document.createTextNode(o);l.setAttribute("class","kanban-title-button btn btn-default btn-xs"),l.appendChild(s),d.appendChild(l),w(l,a.id)}var f=document.createElement("main");if(f.classList.add("kanban-drag"),""!==a.bodyClass&&void 0!==a.bodyClass)var p=a.bodyClass.split(",");else p=[];for(var v in p.map(function(e){f.classList.add(e)}),b.boardContainer.push(f),a.item){var m=a.item[v],g=document.createElement("div");g.classList.add("kanban-item"),m.id&&(g.dataset.eid=m.id),g.innerHTML=m.title,g.clickfn=m.click,g.dragfn=m.drag,g.dragendfn=m.dragend,g.dropfn=m.drop,E(g,m),y(g),f.appendChild(g)}var h=document.createElement("footer");c.appendChild(d),c.appendChild(f),c.appendChild(h),b.container.appendChild(c)}return b},this.findBoard=function(e){return b.element.querySelector('[data-id="'+e+'"]')},this.getParentBoardID=function(e){return"string"==typeof e&&(e=b.element.querySelector('[data-eid="'+e+'"]')),null===e?null:e.parentNode.parentNode.dataset.id},this.moveElement=function(e,t,n){if(e!==this.getParentBoardID(t))return this.removeElement(t),this.addElement(e,n)},this.replaceElement=function(e,t){var n=e;return"string"==typeof n&&(n=b.element.querySelector('[data-eid="'+e+'"]')),n.innerHTML=t.title,n.clickfn=t.click,n.dragfn=t.drag,n.dragendfn=t.dragend,n.dropfn=t.drop,E(n,t),b},this.findElement=function(e){return b.element.querySelector('[data-eid="'+e+'"]')},this.getBoardElements=function(e){return b.element.querySelector('[data-id="'+e+'"] .kanban-drag').childNodes},this.removeElement=function(e){return"string"==typeof e&&(e=b.element.querySelector('[data-eid="'+e+'"]')),null!==e&&e.remove(),b},this.removeBoard=function(e){var t=null;"string"==typeof e&&(t=b.element.querySelector('[data-id="'+e+'"]')),null!==t&&t.remove();for(var n=0;ne.left+$(e)/2);return n(a>e.top+G(e)/2)}():function(){var e,t,n,r=o.children.length;for(e=0;ei)return t;if(!c&&n.top+n.height/2>a)return t}return null}();function n(e){return e?Z(t):t}}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./classes":8,"contra/emitter":4,crossvent:5}],10:[function(e,t,n){var r,o,i=t.exports={};function a(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function d(t){if(r===setTimeout)return setTimeout(t,0);if((r===a||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:a}catch(e){r=a}try{o="function"==typeof clearTimeout?clearTimeout:c}catch(e){o=c}}();var u,l=[],s=!1,f=-1;function p(){s&&u&&(s=!1,u.length?l=u.concat(l):f=-1,l.length&&v())}function v(){if(!s){var e=d(p);s=!0;for(var t=l.length;t;){for(u=l,l=[];++f Date: Tue, 10 Sep 2019 19:10:36 +0800 Subject: [PATCH 116/247] Standardized Kanban Widget --- .../incubator/client/kanban/Kanban.java | 49 ++++++- .../client/kanban/KanbanClientBundle.java | 3 + .../kanban/KanbanClientDebugBundle.java | 3 + .../incubator/client/kanban/js/DataSet.java | 18 +++ .../client/kanban/js/KanbanItem.java | 16 +++ .../client/kanban/js/KanbanOptions.java | 1 + .../kanban/util/KanbanResponsiveLoader.java | 53 +++++++ .../kanban/resources/css/jkanban.min.css | 135 +++++++++++++++++- .../kanban/resources/js/long-press-event.js | 45 ++++++ .../resources/js/long-press-event.min.js | 8 ++ 10 files changed, 329 insertions(+), 2 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java create mode 100644 src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.js create mode 100644 src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.min.js diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java b/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java index 6afa545fe..72a1f3ce7 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java @@ -11,10 +11,13 @@ import gwt.material.design.incubator.client.kanban.js.KanbanBoard; import gwt.material.design.incubator.client.kanban.js.KanbanItem; import gwt.material.design.incubator.client.kanban.js.KanbanOptions; +import gwt.material.design.incubator.client.kanban.util.KanbanResponsiveLoader; import java.util.Arrays; import java.util.List; +import static gwt.material.design.jquery.client.api.JQuery.$; + /** * A Kanban Board implementation to easily build and organize your Board and it's Item. * @@ -23,11 +26,17 @@ */ public class Kanban extends MaterialWidget implements JsLoader { + private boolean responsive = true; private JKanban kanban; private KanbanOptions kanbanOptions = KanbanOptions.create(); + private KanbanResponsiveLoader responsiveLoader; + private List boards; + public Kanban() { - super(Document.get().createDivElement()); + super(Document.get().createDivElement(), "kanban"); + + responsiveLoader = new KanbanResponsiveLoader(this); } static { @@ -53,6 +62,12 @@ public void load() { kanbanOptions = getOptions(); kanbanOptions.setElement("#" + getId()); kanban = new JKanban(getOptions()); + + if (responsive) { + responsiveLoader.load(); + } else { + responsiveLoader.unload(); + } } @Override @@ -95,6 +110,7 @@ public void addForm(String boardId, Element formElement) { * Add one or more boards in the kanban, boards are in the standard format */ public void addBoards(KanbanBoard... boards) { + this.boards = Arrays.asList(boards); kanban.addBoards(boards); } @@ -105,6 +121,13 @@ public KanbanItem findItem(String id) { return kanban.findElement(id); } + /** + * Returns the DOM element of an item + */ + public Element findElementItem(KanbanItem item) { + return $(".kanban-item[data-eid='" + item.getDataset().getId() + "']").asElement(); + } + /** * Replace item by id with element JSON standard format */ @@ -112,6 +135,14 @@ public void replaceItem(String id, KanbanItem element) { kanban.replaceElement(id, element); } + public void moveItem(KanbanItem currentItem, String boardId) { + KanbanItem newItem = new KanbanItem(); + newItem.setId(currentItem.getDataset().getId()); + newItem.setTitle(currentItem.getInnerHTML()); + removeItem(currentItem.getDataset().getId()); + addItem(boardId, newItem); + } + /** * Get board ID of item id passed */ @@ -133,6 +164,10 @@ public List getAllBoardItems(String id) { return Arrays.asList(kanban.getBoardElements(id)); } + public List getAllBoards() { + return boards; + } + /** * Remove a board's element by id */ @@ -146,4 +181,16 @@ public void removeItem(String id) { public void removeBoard(String id) { kanban.removeBoard(id); } + + /** + * Will enable / disable Mobile Responsive support + */ + public void setResponsive(boolean responsive) { + this.responsive = responsive; + } + + public boolean isResponsive() { + return responsiveLoader.isResponsive(); + } + } diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java index ca56a31f7..f1111fa88 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientBundle.java @@ -36,4 +36,7 @@ public interface KanbanClientBundle extends ClientBundle { @Source("resources/css/jkanban.min.css") TextResource jskanbanCss(); + + @Source("resources/js/long-press-event.min.js") + TextResource longPressEventJs(); } diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java index 823bcbca8..2aa13bf35 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/KanbanClientDebugBundle.java @@ -37,4 +37,7 @@ public interface KanbanClientDebugBundle extends ClientBundle { @Source("resources/css/jkanban.css") TextResource jskanbanCss(); + + @Source("resources/js/long-press-event.js") + TextResource longPressEventJs(); } diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java new file mode 100644 index 000000000..ea5509308 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java @@ -0,0 +1,18 @@ +package gwt.material.design.incubator.client.kanban.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class DataSet { + + @JsProperty + private String eid; + + @JsOverlay + public final String getId() { + return eid; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java index 0e8e6cdb3..b62a30ea8 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java @@ -29,6 +29,12 @@ public class KanbanItem { @JsProperty private Functions.Func1 drop; + @JsProperty + public DataSet dataset; + + @JsProperty + public String innerHTML; + @JsOverlay public final String getId() { return id; @@ -93,4 +99,14 @@ public final void setDrop(Functions.Func1 drop) { public final void setWidget(Widget widget) { setTitle(widget.getElement().getInnerHTML()); } + + @JsOverlay + public final DataSet getDataset() { + return dataset; + } + + @JsOverlay + public final String getInnerHTML() { + return innerHTML; + } } diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java index c9ebdca9b..ecffc4e92 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java @@ -21,6 +21,7 @@ protected KanbanOptions() { public static final KanbanOptions create() { String Z_DEPTH_1 = "z-depth-1"; KanbanOptions options = new KanbanOptions(); + options.setWidthBoard("360px"); options.setDragEl((element, source) -> { if (element != null && !element.hasClassName(Z_DEPTH_1)) { element.addClassName(Z_DEPTH_1); diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java b/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java new file mode 100644 index 000000000..b59e95a95 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java @@ -0,0 +1,53 @@ +package gwt.material.design.incubator.client.kanban.util; + +import com.google.gwt.core.client.Scheduler; +import gwt.material.design.client.MaterialDesign; +import gwt.material.design.client.base.mixin.ToggleStyleMixin; +import gwt.material.design.client.ui.MaterialToast; +import gwt.material.design.incubator.client.kanban.Kanban; +import gwt.material.design.incubator.client.kanban.KanbanClientBundle; +import gwt.material.design.jquery.client.api.JQueryElement; + +import java.util.Date; + +import static gwt.material.design.jquery.client.api.JQuery.$; + +public class KanbanResponsiveLoader { + + static { + MaterialDesign.injectJs(KanbanClientBundle.INSTANCE.longPressEventJs()); + } + + private Kanban kanban; + private ToggleStyleMixin toggleStyleMixin; + + protected KanbanResponsiveLoader() { + } + + public KanbanResponsiveLoader(Kanban kanban) { + this.kanban = kanban; + } + + public void load() { + if (kanban != null && kanban.isAttached()) { + getToggleStyleMixin().setOn(true); + } + } + + public void unload() { + if (kanban != null && kanban.isAttached()) { + getToggleStyleMixin().setOn(false); + } + } + + public boolean isResponsive() { + return getToggleStyleMixin().isOn(); + } + + public ToggleStyleMixin getToggleStyleMixin() { + if (toggleStyleMixin == null) { + toggleStyleMixin = new ToggleStyleMixin<>(kanban, "responsive"); + } + return toggleStyleMixin; + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css index 5748af09c..96e35e96f 100644 --- a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/css/jkanban.min.css @@ -1 +1,134 @@ -.kanban-container{position:relative;box-sizing:border-box;width:auto}.kanban-container *{box-sizing:border-box}.kanban-container:after{clear:both;display:block;content:""}.kanban-board{position:relative;float:left;background:#e2e4e6;transition:all .3s cubic-bezier(.23,1,.32,1)}.kanban-board.disabled-board{opacity:.3}.kanban-board.is-moving.gu-mirror{transform:rotate(3deg)}.kanban-board.is-moving.gu-mirror .kanban-drag{overflow:hidden;padding-right:50px}.kanban-board header{font-size:16px;padding:15px!important}.kanban-board header .kanban-title-board{font-weight:700;margin:0;padding:0;display:inline}.kanban-board header .kanban-title-button{float:right}.kanban-board .kanban-drag{min-height:200px;padding:20px}.kanban-board:after{clear:both;display:block;content:""}.kanban-item{background:#fff;padding:15px;margin-bottom:20px;transition:all .3s cubic-bezier(.23,1,.32,1)}.kanban-item:hover{cursor:move}.kanban-item:last-child{margin:0}.kanban-item.is-moving.gu-mirror{transform:rotate(3deg);height:auto!important}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2!important;transform:rotate(0)!important}.kanban-board{background:#fff;border-radius:4px;box-shadow:0 2px 5px 0 rgba(78,78,78,.16),0 2px 10px 0 rgba(119,119,119,.12)}.kanban-item{position:relative;background:#f3f3f3;border-radius:4px}.kanban-container main{padding-top:0!important} \ No newline at end of file +.kanban-container { + position: relative; + box-sizing: border-box; + width: auto; +} + +.kanban-container * { + box-sizing: border-box; +} + +.kanban-container:after { + clear: both; + display: block; + content: ""; +} + +.kanban-board { + position: relative; + float: left; + background: #e2e4e6; + transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); +} + +.kanban-board.disabled-board { + opacity: 0.3; +} + +.kanban-board.is-moving.gu-mirror { + transform: rotate(3deg); +} + +.kanban-board.is-moving.gu-mirror .kanban-drag { + overflow: hidden; + padding-right: 50px; +} + +.kanban-board header { + font-size: 16px; + padding: 15px !important; +} + +.kanban-board header .kanban-title-board { + font-weight: 700; + margin: 0; + padding: 0; + display: inline; +} + +.kanban-board header .kanban-title-button { + float: right; +} + +.kanban-board .kanban-drag { + min-height: 200px; + padding: 20px; +} + +.kanban-board:after { + clear: both; + display: block; + content: ""; +} + +.kanban-item { + background: #fff; + padding: 15px; + margin-bottom: 20px; + transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); +} + +.kanban-item:hover { + cursor: move; +} + +.kanban-item:last-child { + margin: 0; +} + +.kanban-item.is-moving.gu-mirror { + transform: rotate(3deg); + height: auto !important; +} + +/* Dragula CSS */ +.gu-mirror { + position: fixed !important; + margin: 0 !important; + z-index: 9999 !important; +} + +.gu-hide { + display: none !important; +} + +.gu-unselectable { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; +} + +.gu-transit { + opacity: 0.2 !important; + transform: rotate(0deg) !important; +} + +/** Material Design Override **/ +.kanban-board { + background: #ffffff; + border-radius: 4px; + box-shadow: 0 2px 5px 0 rgba(78, 78, 78, 0.16), 0 2px 10px 0 rgba(119, 119, 119, 0.12); +} +.kanban-item { + position: relative; + background: #f3f3f3; + border-radius: 4px; +} + +.kanban-container main { + padding-top: 0px !important; +} + +/** Responsive support **/ +@media screen and (max-width: 600px) { + .kanban.responsive .kanban-container { + width: 100% !important; + } + + .kanban.responsive .kanban-board { + margin: 0px !important; + width: 100% !important; + margin-bottom: 40px !important; + } +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.js b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.js new file mode 100644 index 000000000..b9fe53495 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.js @@ -0,0 +1,45 @@ +/*! + * long-press-event.js + * Pure JavaScript long-press-event + * https://github.com/john-doherty/long-press-event + * @author John Doherty + * @license MIT + */ +!function (e, t) { + "use strict"; + var n = null, a = "ontouchstart" in e || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0, + i = a ? "touchstart" : "mousedown", o = a ? "touchcancel" : "mouseout", m = a ? "touchend" : "mouseup", + u = a ? "touchmove" : "mousemove"; + + function r(t) { + var a; + (a = n) && (e.cancelAnimationFrame ? e.cancelAnimationFrame(a.value) : e.webkitCancelAnimationFrame ? e.webkitCancelAnimationFrame(a.value) : e.webkitCancelRequestAnimationFrame ? e.webkitCancelRequestAnimationFrame(a.value) : e.mozCancelRequestAnimationFrame ? e.mozCancelRequestAnimationFrame(a.value) : e.oCancelRequestAnimationFrame ? e.oCancelRequestAnimationFrame(a.value) : e.msCancelRequestAnimationFrame ? e.msCancelRequestAnimationFrame(a.value) : clearTimeout(a)), n = null + } + + "function" != typeof e.CustomEvent && (e.CustomEvent = function (e, n) { + n = n || {bubbles: !1, cancelable: !1, detail: void 0}; + var a = t.createEvent("CustomEvent"); + return a.initCustomEvent(e, n.bubbles, n.cancelable, n.detail), a + }, e.CustomEvent.prototype = e.Event.prototype), e.requestAnimFrame = e.requestAnimationFrame || e.webkitRequestAnimationFrame || e.mozRequestAnimationFrame || e.oRequestAnimationFrame || e.msRequestAnimationFrame || function (t) { + e.setTimeout(t, 1e3 / 60) + }, t.addEventListener(o, r, !0), t.addEventListener(m, r, !0), t.addEventListener(u, r, !0), t.addEventListener("wheel", r, !0), t.addEventListener("scroll", r, !0), t.addEventListener(i, function (a) { + r(); + var i = a.target, o = parseInt(i.getAttribute("data-long-press-delay") || "1500", 10); + n = function (t, n) { + if (!(e.requestAnimationFrame || e.webkitRequestAnimationFrame || e.mozRequestAnimationFrame && e.mozCancelRequestAnimationFrame || e.oRequestAnimationFrame || e.msRequestAnimationFrame)) return e.setTimeout(t, n); + var a = (new Date).getTime(), i = {}, o = function () { + (new Date).getTime() - a >= n ? t.call() : i.value = requestAnimFrame(o) + }; + return i.value = requestAnimFrame(o), i + }(function () { + r(), this.dispatchEvent(new CustomEvent("long-press", { + bubbles: !0, + cancelable: !0 + })) && t.addEventListener(m, function e(n) { + t.removeEventListener(m, e, !0), function (e) { + e.stopImmediatePropagation(), e.preventDefault(), e.stopPropagation() + }(n) + }, !0) + }.bind(i), o) + }, !0) +}(window, document); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.min.js b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.min.js new file mode 100644 index 000000000..8f05d7018 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/kanban/resources/js/long-press-event.min.js @@ -0,0 +1,8 @@ +/*! + * long-press-event.js + * Pure JavaScript long-press-event + * https://github.com/john-doherty/long-press-event + * @author John Doherty + * @license MIT + */ +!function(e,t){"use strict";var n=null,a="ontouchstart"in e||navigator.MaxTouchPoints>0||navigator.msMaxTouchPoints>0,i=a?"touchstart":"mousedown",o=a?"touchcancel":"mouseout",m=a?"touchend":"mouseup",u=a?"touchmove":"mousemove";function r(t){var a;(a=n)&&(e.cancelAnimationFrame?e.cancelAnimationFrame(a.value):e.webkitCancelAnimationFrame?e.webkitCancelAnimationFrame(a.value):e.webkitCancelRequestAnimationFrame?e.webkitCancelRequestAnimationFrame(a.value):e.mozCancelRequestAnimationFrame?e.mozCancelRequestAnimationFrame(a.value):e.oCancelRequestAnimationFrame?e.oCancelRequestAnimationFrame(a.value):e.msCancelRequestAnimationFrame?e.msCancelRequestAnimationFrame(a.value):clearTimeout(a)),n=null}"function"!=typeof e.CustomEvent&&(e.CustomEvent=function(e,n){n=n||{bubbles:!1,cancelable:!1,detail:void 0};var a=t.createEvent("CustomEvent");return a.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),a},e.CustomEvent.prototype=e.Event.prototype),e.requestAnimFrame=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t){e.setTimeout(t,1e3/60)},t.addEventListener(o,r,!0),t.addEventListener(m,r,!0),t.addEventListener(u,r,!0),t.addEventListener("wheel",r,!0),t.addEventListener("scroll",r,!0),t.addEventListener(i,function(a){r();var i=a.target,o=parseInt(i.getAttribute("data-long-press-delay")||"1500",10);n=function(t,n){if(!(e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame&&e.mozCancelRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame))return e.setTimeout(t,n);var a=(new Date).getTime(),i={},o=function(){(new Date).getTime()-a>=n?t.call():i.value=requestAnimFrame(o)};return i.value=requestAnimFrame(o),i}(function(){r(),this.dispatchEvent(new CustomEvent("long-press",{bubbles:!0,cancelable:!0}))&&t.addEventListener(m,function e(n){t.removeEventListener(m,e,!0),function(e){e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation()}(n)},!0)}.bind(i),o)},!0)}(window,document); \ No newline at end of file From a5fa6d998e17f9a22113682d80b323351aa26a32 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 26 Sep 2019 06:11:00 +0800 Subject: [PATCH 117/247] StepHighlighter feature request for MaterialStepper --- .../stepper/highlight/StepHighlighter.java | 63 +++++++++++++++++++ .../kanban/util/KanbanResponsiveLoader.java | 7 --- .../client/stepper/resources/css/stepper.css | 7 +++ .../stepper/resources/css/stepper.min.css | 2 +- 4 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java diff --git a/src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java b/src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java new file mode 100644 index 000000000..3e836a4a1 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java @@ -0,0 +1,63 @@ +package gwt.material.design.addins.client.stepper.highlight; + +import com.google.gwt.user.client.ui.Widget; + +import java.util.ArrayList; +import java.util.List; + +public class StepHighlighter { + + protected static final String HIGHLIGHT = "highlight"; + protected int currentIndex = 0; + public List widgets = new ArrayList<>(); + + public void start() { + currentIndex = 0; + next(); + } + + public void next() { + if (currentIndex < widgets.size()) { + animate(currentIndex); + currentIndex++; + } + } + + public void previous() { + if (currentIndex > 0) { + animate(currentIndex); + currentIndex--; + } + } + + public void animate(int index) { + clearHighlightStyle(); + Widget widget = widgets.get(index); + if (widget != null) { + widget.addStyleName(HIGHLIGHT); + } + } + + public void clearHighlightStyle() { + for (Widget w : widgets) { + w.removeStyleName(HIGHLIGHT); + } + } + + public void reset() { + currentIndex = 0; + clearHighlightStyle(); + } + + public void register( Widget object) { + widgets.add(object); + } + + public void unregister(Widget widget) { + widgets.remove(widget); + } + + public void unregisterAll() { + widgets.forEach(widget -> unregister(widget)); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java b/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java index b59e95a95..de371ab1e 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java @@ -1,16 +1,9 @@ package gwt.material.design.incubator.client.kanban.util; -import com.google.gwt.core.client.Scheduler; import gwt.material.design.client.MaterialDesign; import gwt.material.design.client.base.mixin.ToggleStyleMixin; -import gwt.material.design.client.ui.MaterialToast; import gwt.material.design.incubator.client.kanban.Kanban; import gwt.material.design.incubator.client.kanban.KanbanClientBundle; -import gwt.material.design.jquery.client.api.JQueryElement; - -import java.util.Date; - -import static gwt.material.design.jquery.client.api.JQuery.$; public class KanbanResponsiveLoader { diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css index 78d00bb50..a1d3581d1 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css @@ -205,4 +205,11 @@ .stepper.vertical .step.active .body { padding-bottom: 0; padding-right: 20px +} + +/** Step Highlight **/ +.highlight:not(.gwt-RadioButton):not(.checkbox), +.highlight [type=radio] + label:before, +.highlight [type=checkbox] + label:after { + animation: shadow-pulse-toggle 800ms infinite !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index d6daa71e2..0b278d49c 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -1 +1 @@ -.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#F6F6F6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#FFF;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#C9C9C9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file +.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#f6f6f6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#fff;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#c9c9c9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px}.highlight [type=checkbox]+label:after,.highlight [type=radio]+label:before,.highlight:not(.gwt-RadioButton):not(.checkbox){animation:shadow-pulse-toggle .8s infinite!important} \ No newline at end of file From 778f1894d001a5b56541ec80f8b838083c1590cd Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 26 Sep 2019 06:29:07 +0800 Subject: [PATCH 118/247] Step Highlighter - Minor updates to separate the stylesheets. --- .../stepper/MaterialStepperClientBundle.java | 3 ++ .../MaterialStepperDebugClientBundle.java | 3 ++ .../StepHighlighter.java | 12 +++++- .../StepHighlighterClientBundle.java | 37 +++++++++++++++++++ .../StepHighlighterDebugClientBundle.java | 37 +++++++++++++++++++ .../resources/css/step-highlighter.css | 6 +++ .../resources/css/step-highlighter.min.css | 1 + .../client/stepper/resources/css/stepper.css | 7 ---- .../stepper/resources/css/stepper.min.css | 2 +- 9 files changed, 99 insertions(+), 9 deletions(-) rename src/main/java/gwt/material/design/addins/client/stepper/{highlight => highlighter}/StepHighlighter.java (73%) create mode 100644 src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterClientBundle.java create mode 100644 src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterDebugClientBundle.java create mode 100644 src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css create mode 100644 src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java index be8012461..12566313e 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java @@ -34,4 +34,7 @@ interface MaterialStepperClientBundle extends ClientBundle { @Source("resources/css/stepper.min.css") TextResource stepperCss(); + + @Source("resources/css/step-highlighter.min.css") + TextResource stepHighlighterCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java index fac76208e..007fe5391 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java @@ -34,4 +34,7 @@ interface MaterialStepperDebugClientBundle extends ClientBundle { @Source("resources/css/stepper.css") TextResource stepperDebugCss(); + + @Source("resources/css/step-highlighter.css") + TextResource stepHighlighterDebugCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java similarity index 73% rename from src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java rename to src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java index 3e836a4a1..4684a91d3 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/highlight/StepHighlighter.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java @@ -1,12 +1,22 @@ -package gwt.material.design.addins.client.stepper.highlight; +package gwt.material.design.addins.client.stepper.highlighter; import com.google.gwt.user.client.ui.Widget; +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.client.MaterialDesignBase; import java.util.ArrayList; import java.util.List; public class StepHighlighter { + static { + if (MaterialAddins.isDebug()) { + MaterialDesignBase.injectCss(StepHighlighterDebugClientBundle.INSTANCE.stepHighlighterDebugCss()); + } else { + MaterialDesignBase.injectCss(StepHighlighterClientBundle.INSTANCE.stepHighlighterCss()); + } + } + protected static final String HIGHLIGHT = "highlight"; protected int currentIndex = 0; public List widgets = new ArrayList<>(); diff --git a/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterClientBundle.java new file mode 100644 index 000000000..533bedb3a --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterClientBundle.java @@ -0,0 +1,37 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.stepper.highlighter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +/** + * Client Bundle for Stepper component + * + * @author kevzlou7979 + */ +interface StepHighlighterClientBundle extends ClientBundle { + + StepHighlighterClientBundle INSTANCE = GWT.create(StepHighlighterClientBundle.class); + + @Source("resources/css/step-highlighter.min.css") + TextResource stepHighlighterCss(); +} diff --git a/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterDebugClientBundle.java new file mode 100644 index 000000000..124b07520 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighterDebugClientBundle.java @@ -0,0 +1,37 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.stepper.highlighter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +/** + * Client Bundle for Stepper component + * + * @author kevzlou7979 + */ +interface StepHighlighterDebugClientBundle extends ClientBundle { + + StepHighlighterDebugClientBundle INSTANCE = GWT.create(StepHighlighterDebugClientBundle.class); + + @Source("resources/css/step-highlighter.css") + TextResource stepHighlighterDebugCss(); +} diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css new file mode 100644 index 000000000..5233f2be5 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css @@ -0,0 +1,6 @@ +/** Step Highlight **/ +.highlight:not(.gwt-RadioButton):not(.checkbox), +.highlight [type=radio] + label:before, +.highlight [type=checkbox] + label:after { + animation: shadow-pulse-toggle 800ms infinite !important; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css new file mode 100644 index 000000000..844c2b9b0 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css @@ -0,0 +1 @@ +.highlight [type=checkbox]+label:after,.highlight [type=radio]+label:before,.highlight:not(.gwt-RadioButton):not(.checkbox){animation:shadow-pulse-toggle .8s infinite!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css index a1d3581d1..78d00bb50 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css @@ -205,11 +205,4 @@ .stepper.vertical .step.active .body { padding-bottom: 0; padding-right: 20px -} - -/** Step Highlight **/ -.highlight:not(.gwt-RadioButton):not(.checkbox), -.highlight [type=radio] + label:before, -.highlight [type=checkbox] + label:after { - animation: shadow-pulse-toggle 800ms infinite !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index 0b278d49c..0964850db 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -1 +1 @@ -.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#f6f6f6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#fff;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#c9c9c9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px}.highlight [type=checkbox]+label:after,.highlight [type=radio]+label:before,.highlight:not(.gwt-RadioButton):not(.checkbox){animation:shadow-pulse-toggle .8s infinite!important} \ No newline at end of file +.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#f6f6f6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#fff;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#c9c9c9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file From 945306ec8a1638caec85951b924f1059605892c5 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 26 Sep 2019 06:45:20 +0800 Subject: [PATCH 119/247] Added missing animation styles. --- .../highlighter/resources/css/step-highlighter.css | 9 +++++++++ .../highlighter/resources/css/step-highlighter.min.css | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css index 5233f2be5..63b9eb549 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.css @@ -3,4 +3,13 @@ .highlight [type=radio] + label:before, .highlight [type=checkbox] + label:after { animation: shadow-pulse-toggle 800ms infinite !important; +} + +@keyframes shadow-pulse-toggle { + 0% { + box-shadow: 0 0 0 0px rgba(66, 165, 245, 0.5); + } + 100% { + box-shadow: 0 0 0 32px rgba(66, 165, 245, 0); + } } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css index 844c2b9b0..e99636d74 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/highlighter/resources/css/step-highlighter.min.css @@ -1 +1 @@ -.highlight [type=checkbox]+label:after,.highlight [type=radio]+label:before,.highlight:not(.gwt-RadioButton):not(.checkbox){animation:shadow-pulse-toggle .8s infinite!important} \ No newline at end of file +.highlight [type=checkbox]+label:after,.highlight [type=radio]+label:before,.highlight:not(.gwt-RadioButton):not(.checkbox){animation:shadow-pulse-toggle .8s infinite!important}@keyframes shadow-pulse-toggle{0%{box-shadow:0 0 0 0 rgba(66,165,245,.5)}100%{box-shadow:0 0 0 32px rgba(66,165,245,0)}} \ No newline at end of file From 21b4b638357687a0626fb4f7ea81094b7150be9f Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 27 Sep 2019 13:59:34 +0800 Subject: [PATCH 120/247] StepHighlighter - multiple registration of objects. --- .../client/stepper/highlighter/StepHighlighter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java index 4684a91d3..eaff9aab1 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java @@ -59,10 +59,16 @@ public void reset() { clearHighlightStyle(); } - public void register( Widget object) { + public void register(Widget object) { widgets.add(object); } + public void register(Widget... objects) { + for (Widget widget : objects) { + widgets.add(widget); + } + } + public void unregister(Widget widget) { widgets.remove(widget); } From c2a2adb5c6a4ea1cb25a7e944713e82bde0310c7 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 29 Sep 2019 13:50:49 +0800 Subject: [PATCH 121/247] Removed unused css files --- .../addins/client/stepper/MaterialStepperClientBundle.java | 3 --- .../client/stepper/MaterialStepperDebugClientBundle.java | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java index 12566313e..be8012461 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java @@ -34,7 +34,4 @@ interface MaterialStepperClientBundle extends ClientBundle { @Source("resources/css/stepper.min.css") TextResource stepperCss(); - - @Source("resources/css/step-highlighter.min.css") - TextResource stepHighlighterCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java index 007fe5391..fac76208e 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java @@ -34,7 +34,4 @@ interface MaterialStepperDebugClientBundle extends ClientBundle { @Source("resources/css/stepper.css") TextResource stepperDebugCss(); - - @Source("resources/css/step-highlighter.css") - TextResource stepHighlighterDebugCss(); } From ebdc726104b567e1d3902956c26e0e536a1462d8 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 7 Nov 2019 11:10:03 +0800 Subject: [PATCH 122/247] Added PasswordStrengthTextBox poc. --- .../password/PasswordStrengthTextBox.java | 40 ++++++ .../PasswordStrengthTextBoxClientBundle.java | 15 +++ ...swordStrengthTextBoxDebugClientBundle.java | 15 +++ .../password/js/JsPasswordStrengthMeter.java | 23 ++++ .../password/js/PasswordStrengthLabel.java | 75 +++++++++++ .../password/js/PasswordStrengthOptions.java | 62 +++++++++ .../password/js/PasswordStrengthProgress.java | 49 +++++++ .../js/PasswordStrengthProgressColor.java | 62 +++++++++ .../resources/css/pwd-strength-meter.css | 24 ++++ .../resources/css/pwd-strength-meter.min.css | 1 + .../resources/js/pwd-strength-meter.js | 125 ++++++++++++++++++ .../resources/js/pwd-strength-meter.min.js | 1 + 12 files changed, 492 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java create mode 100644 src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.min.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js create mode 100644 src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java new file mode 100644 index 000000000..86ffd2053 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java @@ -0,0 +1,40 @@ +package gwt.material.design.incubator.client.password; + +import gwt.material.design.client.MaterialDesignBase; +import gwt.material.design.client.constants.InputType; +import gwt.material.design.client.ui.MaterialTextBox; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.password.js.PasswordStrengthOptions; + +import static gwt.material.design.incubator.client.password.js.JsPasswordStrengthMeter.$; + +public class PasswordStrengthTextBox extends MaterialTextBox { + + static { + if (AddinsIncubator.isDebug()) { + MaterialDesignBase.injectCss(PasswordStrengthTextBoxDebugClientBundle.INSTANCE.pwdStrengthMeterDebugCss()); + MaterialDesignBase.injectDebugJs(PasswordStrengthTextBoxDebugClientBundle.INSTANCE.pwdStrengthMeterDebugJs()); + } else { + MaterialDesignBase.injectCss(PasswordStrengthTextBoxClientBundle.INSTANCE.pwdStrengthMeterCss()); + MaterialDesignBase.injectJs(PasswordStrengthTextBoxClientBundle.INSTANCE.pwdStrengthMeterJs()); + } + } + + protected PasswordStrengthOptions options = new PasswordStrengthOptions(); + + @Override + protected void onLoad() { + super.onLoad(); + + setType(InputType.PASSWORD); + $(valueBoxBase.getElement()).pwdstrength(options); + } + + public PasswordStrengthOptions getOptions() { + return options; + } + + public void setOptions(PasswordStrengthOptions options) { + this.options = options; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java new file mode 100644 index 000000000..8c0612100 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java @@ -0,0 +1,15 @@ +package gwt.material.design.incubator.client.password; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface PasswordStrengthTextBoxClientBundle extends ClientBundle { + PasswordStrengthTextBoxClientBundle INSTANCE = GWT.create(PasswordStrengthTextBoxClientBundle.class); + + @Source("resources/css/pwd-strength-meter.min.css") + TextResource pwdStrengthMeterCss(); + + @Source("resources/js/pwd-strength-meter.min.js") + TextResource pwdStrengthMeterJs(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java new file mode 100644 index 000000000..a821c1e0b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java @@ -0,0 +1,15 @@ +package gwt.material.design.incubator.client.password; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +public interface PasswordStrengthTextBoxDebugClientBundle extends ClientBundle { + PasswordStrengthTextBoxDebugClientBundle INSTANCE = GWT.create(PasswordStrengthTextBoxDebugClientBundle.class); + + @Source("resources/css/pwd-strength-meter.css") + TextResource pwdStrengthMeterDebugCss(); + + @Source("resources/js/pwd-strength-meter.js") + TextResource pwdStrengthMeterDebugJs(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java b/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java new file mode 100644 index 000000000..8e3f061a4 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java @@ -0,0 +1,23 @@ +package gwt.material.design.incubator.client.password.js; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.jquery.client.api.JQueryElement; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType(isNative = true) +public class JsPasswordStrengthMeter { + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsPasswordStrengthMeter $(JQueryElement element); + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsPasswordStrengthMeter $(Element element); + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsPasswordStrengthMeter $(String selector); + + @JsMethod + public native void pwdstrength(PasswordStrengthOptions options); +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java new file mode 100644 index 000000000..144da852c --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java @@ -0,0 +1,75 @@ +package gwt.material.design.incubator.client.password.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class PasswordStrengthLabel { + + @JsProperty + private String strength; + + @JsProperty + private String weak; + + @JsProperty + private String fair; + + @JsProperty + private String good; + + @JsProperty + private String strong; + + @JsOverlay + public final String getStrength() { + return strength; + } + + @JsOverlay + public final void setStrength(String strength) { + this.strength = strength; + } + + @JsOverlay + public final String getWeak() { + return weak; + } + + @JsOverlay + public final void setWeak(String weak) { + this.weak = weak; + } + + @JsOverlay + public final String getFair() { + return fair; + } + + @JsOverlay + public final void setFair(String fair) { + this.fair = fair; + } + + @JsOverlay + public final String getGood() { + return good; + } + + @JsOverlay + public final void setGood(String good) { + this.good = good; + } + + @JsOverlay + public final String getStrong() { + return strong; + } + + @JsOverlay + public final void setStrong(String strong) { + this.strong = strong; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java new file mode 100644 index 000000000..bc061ef1b --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java @@ -0,0 +1,62 @@ +package gwt.material.design.incubator.client.password.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class PasswordStrengthOptions { + + @JsProperty + private int limit; + + @JsProperty + private boolean showSuggestions; + + @JsProperty + private PasswordStrengthLabel label; + + @JsProperty + private PasswordStrengthProgress progress; + + @JsOverlay + public final int getLimit() { + return limit; + } + + @JsOverlay + public final void setLimit(int limit) { + this.limit = limit; + } + + @JsOverlay + public final boolean isShowSuggestions() { + return showSuggestions; + } + + @JsOverlay + public final void setShowSuggestions(boolean showSuggestions) { + this.showSuggestions = showSuggestions; + } + + @JsOverlay + public final PasswordStrengthLabel getLabel() { + return label; + } + + @JsOverlay + public final void setLabel(PasswordStrengthLabel label) { + this.label = label; + } + + @JsOverlay + public final PasswordStrengthProgress getProgress() { + return progress; + } + + @JsOverlay + public final void setProgress(PasswordStrengthProgress progress) { + this.progress = progress; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java new file mode 100644 index 000000000..7feb50b61 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java @@ -0,0 +1,49 @@ +package gwt.material.design.incubator.client.password.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class PasswordStrengthProgress { + + @JsProperty + private String width; + + @JsProperty + private String height; + + @JsProperty + private PasswordStrengthProgressColor color; + + @JsOverlay + public final String getWidth() { + return width; + } + + @JsOverlay + public final void setWidth(String width) { + this.width = width; + } + + @JsOverlay + public final String getHeight() { + return height; + } + + @JsOverlay + public final void setHeight(String height) { + this.height = height; + } + + @JsOverlay + public final PasswordStrengthProgressColor getColor() { + return color; + } + + @JsOverlay + public final void setColor(PasswordStrengthProgressColor color) { + this.color = color; + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java new file mode 100644 index 000000000..06b9c8e50 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java @@ -0,0 +1,62 @@ +package gwt.material.design.incubator.client.password.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class PasswordStrengthProgressColor { + + @JsProperty + private String weak; + + @JsProperty + private String fair; + + @JsProperty + private String good; + + @JsProperty + private String strong; + + @JsOverlay + public final String getWeak() { + return weak; + } + + @JsOverlay + public final void setWeak(String weak) { + this.weak = weak; + } + + @JsOverlay + public final String getFair() { + return fair; + } + + @JsOverlay + public final void setFair(String fair) { + this.fair = fair; + } + + @JsOverlay + public final String getGood() { + return good; + } + + @JsOverlay + public final void setGood(String good) { + this.good = good; + } + + @JsOverlay + public final String getStrong() { + return strong; + } + + @JsOverlay + public final void setStrong(String strong) { + this.strong = strong; + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.css b/src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.css new file mode 100644 index 000000000..9a983b8af --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.css @@ -0,0 +1,24 @@ +.pwd-strength-meter .label-container.row { + margin-bottom: 0px; + margin-top: 12px; +} + +.pwd-strength-meter .strength-label { + margin-right: 12px; +} + +.pwd-strength-meter .progress-label { + float: right; +} + +.pwd-strength-meter .pwd-error-label { + color: red; +} + +.pwd-strength-meter ul.pwd-suggestions li { + list-style-type: disc !important; + margin-bottom: 8px; + color: grey; + margin-left: 16px; + font-size: 15px; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.min.css b/src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.min.css new file mode 100644 index 000000000..f989c87c0 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/css/pwd-strength-meter.min.css @@ -0,0 +1 @@ +.pwd-strength-meter .label-container.row{margin-bottom:0;margin-top:12px}.pwd-strength-meter .strength-label{margin-right:12px}.pwd-strength-meter .progress-label{float:right}.pwd-strength-meter .pwd-error-label{color:red}.pwd-strength-meter ul.pwd-suggestions li{list-style-type:disc!important;margin-bottom:8px;color:grey;margin-left:16px;font-size:15px} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js new file mode 100644 index 000000000..edc8a01e4 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js @@ -0,0 +1,125 @@ +(function ($) { + $.fn.extend({ + pwdstrength: function (options) { + var _this = this; + + // Setup default options + var defaults = { + limit: 4, + showSuggestions: true, + label : { + strength : "Password Strength", + weak : "Weak", + fair : "Fair", + good : "Good", + strong : "Strong" + }, + progress : { + width : "100%", + height : "8px", + color : { + weak : "#f44336", + fair : "#ffc107", + good : "#2196f3", + strong : "#4caf50" + } + } + }; + options = $.extend(defaults, options); + + // Create PWD Strength Container + var container = document.createElement("div"); + container.classList.add("pwd-strength-meter"); + _this.parent().append(container); + + // Create Progress Indicator Label + var labelContainer = document.createElement("div"); + labelContainer.classList.add("row"); + labelContainer.classList.add("label-container"); + container.append(labelContainer); + + var strengthLabel = document.createElement("span"); + strengthLabel.innerHTML = options.label.strength; + strengthLabel.classList.add("strength-label"); + labelContainer.append(strengthLabel); + + var progressLabel = document.createElement("span"); + progressLabel.classList.add("progress-label"); + labelContainer.append(progressLabel); + + // Create ProgressBar + var progressBar = document.createElement("div"); + progressBar.classList.add("progress"); + progressBar.style.height = options.progress.height; + var progressFill = document.createElement("div"); + progressFill.classList.add("determinate"); + progressBar.append(progressFill); + container.append(progressBar); + + // Create Suggestion UL + var suggestionUl = document.createElement("ul"); + suggestionUl.classList.add("pwd-suggestions"); + container.append(suggestionUl); + + // Create Error Label + var errorLabel = document.createElement("span"); + errorLabel.classList.add("pwd-error-label"); + container.append(errorLabel); + + // Assign Input Field change handlers + _this.on("change keyup paste blur", function () { + var value = _this.val(); + var url = location.origin + "/pwd/" + value + "/strength/" + options.limit; + + $.ajax({ + type: "GET", + contentType: "application/json", + url: url, + dataType: 'json', + success: function (data) { + var percent = data.percent; + var suggestions = data.suggestions; + + // Update Progress + var color; + progressFill.style.width = percent + "%"; + if (percent > 0 && percent <= 25) { + color = options.progress.color.weak; + progressLabel.innerText = options.label.weak; + } else if (percent > 25 && percent <= 50) { + color = options.progress.color.fair; + progressLabel.innerText = options.label.fair; + } else if (percent > 50 && percent <= 75) { + color = options.progress.color.good; + progressLabel.innerText = options.label.good; + } else if (percent > 75 && percent <= 100) { + color = options.progress.color.strong; + progressLabel.innerText = options.label.strong; + } else { + progressLabel.innerText = ""; + } + + progressLabel.style.color = color; + progressFill.style.backgroundColor = color; + + // Update Suggestions + if (options.showSuggestions) { + suggestionUl.innerHTML = ""; + for (i = 0; i < suggestions.length; i++) { + var suggestionListItem = document.createElement("li"); + var suggestion = suggestions[i]; + suggestionListItem.innerHTML = "" + suggestion + "" + suggestionUl.append(suggestionListItem) + } + } else { + suggestionUl.remove(); + } + }, + error: function (xhr, status, error) { + errorLabel.innerHTML = error; + } + }); + }); + } + }); +})(jQuery); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js new file mode 100644 index 000000000..7b4fe40d4 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js @@ -0,0 +1 @@ +!function(e){e.fn.extend({pwdstrength:function(t){var n=this;t=e.extend({limit:4,showSuggestions:!0,label:{strength:"Password Strength",weak:"Weak",fair:"Fair",good:"Good",strong:"Strong"},progress:{width:"100%",height:"8px",color:{weak:"#f44336",fair:"#ffc107",good:"#2196f3",strong:"#4caf50"}}},t);var r=document.createElement("div");r.classList.add("pwd-strength-meter"),n.parent().append(r);var a=document.createElement("div");a.classList.add("row"),a.classList.add("label-container"),r.append(a);var s=document.createElement("span");s.innerHTML=t.label.strength,s.classList.add("strength-label"),a.append(s);var o=document.createElement("span");o.classList.add("progress-label"),a.append(o);var l=document.createElement("div");l.classList.add("progress"),l.style.height=t.progress.height;var d=document.createElement("div");d.classList.add("determinate"),l.append(d),r.append(l);var c=document.createElement("ul");c.classList.add("pwd-suggestions"),r.append(c);var p=document.createElement("span");p.classList.add("pwd-error-label"),r.append(p),n.on("change keyup paste blur",function(){var r=n.val(),a=location.origin+"/pwd/"+r+"/strength/"+t.limit;e.ajax({type:"GET",contentType:"application/json",url:a,dataType:"json",success:function(e){var n,r=e.percent,a=e.suggestions;if(d.style.width=r+"%",r>0&&r<=25?(n=t.progress.color.weak,o.innerText=t.label.weak):r>25&&r<=50?(n=t.progress.color.fair,o.innerText=t.label.fair):r>50&&r<=75?(n=t.progress.color.good,o.innerText=t.label.good):r>75&&r<=100?(n=t.progress.color.strong,o.innerText=t.label.strong):o.innerText="",o.style.color=n,d.style.backgroundColor=n,t.showSuggestions)for(c.innerHTML="",i=0;i"+l+"",c.append(s)}else c.remove()},error:function(e,t,n){p.innerHTML=n}})})}})}(jQuery); \ No newline at end of file From a5833768482eca6ef6a28c4c85722e0137494488 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 29 Nov 2019 15:57:37 +0800 Subject: [PATCH 123/247] PWDStrengthMeter - added destroy and reset --- .../password/PasswordStrengthTextBox.java | 22 +++- .../password/js/JsPasswordStrengthMeter.java | 6 + .../resources/js/pwd-strength-meter.js | 106 +++++++++++------- .../resources/js/pwd-strength-meter.min.js | 2 +- 4 files changed, 93 insertions(+), 43 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java index 86ffd2053..d65007a8f 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java @@ -4,6 +4,7 @@ import gwt.material.design.client.constants.InputType; import gwt.material.design.client.ui.MaterialTextBox; import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.password.js.JsPasswordStrengthMeter; import gwt.material.design.incubator.client.password.js.PasswordStrengthOptions; import static gwt.material.design.incubator.client.password.js.JsPasswordStrengthMeter.$; @@ -21,13 +22,32 @@ public class PasswordStrengthTextBox extends MaterialTextBox { } protected PasswordStrengthOptions options = new PasswordStrengthOptions(); + protected JsPasswordStrengthMeter strengthMeter; @Override protected void onLoad() { super.onLoad(); setType(InputType.PASSWORD); - $(valueBoxBase.getElement()).pwdstrength(options); + strengthMeter = $(valueBoxBase.getElement()); + strengthMeter.pwdstrength(options); + } + + @Override + protected void onUnload() { + super.onUnload(); + + destroy(); + } + + @Override + public void reset() { + clear(); + strengthMeter.reset(); + } + + public void destroy() { + strengthMeter.destroy(); } public PasswordStrengthOptions getOptions() { diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java b/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java index 8e3f061a4..579c849db 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java +++ b/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java @@ -20,4 +20,10 @@ public class JsPasswordStrengthMeter { @JsMethod public native void pwdstrength(PasswordStrengthOptions options); + + @JsMethod + public native void destroy(); + + @JsMethod + public native void reset(); } diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js index edc8a01e4..86f5e8eec 100644 --- a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js @@ -1,10 +1,20 @@ (function ($) { + var _container; + var _labelContainer; + var _strengthLabel; + var _progressLabel; + var _progressBar; + var _progressFill; + var _suggestionUl; + var _errorLabel; + $.fn.extend({ pwdstrength: function (options) { var _this = this; // Setup default options var defaults = { + url: location.origin + "/pwd/strength/", limit: 4, showSuggestions: true, label : { @@ -28,53 +38,54 @@ options = $.extend(defaults, options); // Create PWD Strength Container - var container = document.createElement("div"); - container.classList.add("pwd-strength-meter"); - _this.parent().append(container); + _container = document.createElement("div"); + _container.classList.add("pwd-strength-meter"); + _this.parent().append(_container); // Create Progress Indicator Label - var labelContainer = document.createElement("div"); - labelContainer.classList.add("row"); - labelContainer.classList.add("label-container"); - container.append(labelContainer); + _labelContainer = document.createElement("div"); + _labelContainer.classList.add("row"); + _labelContainer.classList.add("label-container"); + _container.append(_labelContainer); - var strengthLabel = document.createElement("span"); - strengthLabel.innerHTML = options.label.strength; - strengthLabel.classList.add("strength-label"); - labelContainer.append(strengthLabel); + _strengthLabel = document.createElement("span"); + _strengthLabel.innerHTML = options.label.strength; + _strengthLabel.classList.add("strength-label"); + _labelContainer.append(_strengthLabel); - var progressLabel = document.createElement("span"); - progressLabel.classList.add("progress-label"); - labelContainer.append(progressLabel); + _progressLabel = document.createElement("span"); + _progressLabel.classList.add("progress-label"); + _labelContainer.append(_progressLabel); // Create ProgressBar - var progressBar = document.createElement("div"); - progressBar.classList.add("progress"); - progressBar.style.height = options.progress.height; - var progressFill = document.createElement("div"); - progressFill.classList.add("determinate"); - progressBar.append(progressFill); - container.append(progressBar); + _progressBar = document.createElement("div"); + _progressBar.classList.add("progress"); + _progressBar.style.height = options.progress.height; + _progressFill = document.createElement("div"); + _progressFill.classList.add("determinate"); + _progressBar.append(_progressFill); + _container.append(_progressBar); // Create Suggestion UL - var suggestionUl = document.createElement("ul"); - suggestionUl.classList.add("pwd-suggestions"); - container.append(suggestionUl); + _suggestionUl = document.createElement("ul"); + _suggestionUl.classList.add("pwd-suggestions"); + _container.append(_suggestionUl); // Create Error Label - var errorLabel = document.createElement("span"); - errorLabel.classList.add("pwd-error-label"); - container.append(errorLabel); + _errorLabel = document.createElement("span"); + _errorLabel.classList.add("pwd-error-label"); + _container.append(_errorLabel); // Assign Input Field change handlers _this.on("change keyup paste blur", function () { var value = _this.val(); - var url = location.origin + "/pwd/" + value + "/strength/" + options.limit; + var url = options.url + options.limit; $.ajax({ - type: "GET", + type: "POST", contentType: "application/json", url: url, + data: value, dataType: 'json', success: function (data) { var percent = data.percent; @@ -82,44 +93,57 @@ // Update Progress var color; - progressFill.style.width = percent + "%"; + _progressFill.style.width = percent + "%"; if (percent > 0 && percent <= 25) { color = options.progress.color.weak; - progressLabel.innerText = options.label.weak; + _progressLabel.innerText = options.label.weak; } else if (percent > 25 && percent <= 50) { color = options.progress.color.fair; - progressLabel.innerText = options.label.fair; + _progressLabel.innerText = options.label.fair; } else if (percent > 50 && percent <= 75) { color = options.progress.color.good; - progressLabel.innerText = options.label.good; + _progressLabel.innerText = options.label.good; } else if (percent > 75 && percent <= 100) { color = options.progress.color.strong; - progressLabel.innerText = options.label.strong; + _progressLabel.innerText = options.label.strong; } else { - progressLabel.innerText = ""; + _progressLabel.innerText = ""; } - progressLabel.style.color = color; - progressFill.style.backgroundColor = color; + _progressLabel.style.color = color; + _progressFill.style.backgroundColor = color; // Update Suggestions if (options.showSuggestions) { - suggestionUl.innerHTML = ""; + _suggestionUl.innerHTML = ""; for (i = 0; i < suggestions.length; i++) { var suggestionListItem = document.createElement("li"); var suggestion = suggestions[i]; suggestionListItem.innerHTML = "" + suggestion + "" - suggestionUl.append(suggestionListItem) + _suggestionUl.append(suggestionListItem) } } else { - suggestionUl.remove(); + _suggestionUl.remove(); } }, error: function (xhr, status, error) { - errorLabel.innerHTML = error; + _errorLabel.innerHTML = error; } }); + + if (value === "") { + $(_this).reset(); + } }); + }, + destroy: function() { + _container.remove(); + }, + reset: function() { + _errorLabel.innerHTML = ""; + _suggestionUl.innerHTML = ""; + _progressLabel.innerText = ""; + _progressFill.style.width = "0%"; } }); })(jQuery); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js index 7b4fe40d4..93af3b84d 100644 --- a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js @@ -1 +1 @@ -!function(e){e.fn.extend({pwdstrength:function(t){var n=this;t=e.extend({limit:4,showSuggestions:!0,label:{strength:"Password Strength",weak:"Weak",fair:"Fair",good:"Good",strong:"Strong"},progress:{width:"100%",height:"8px",color:{weak:"#f44336",fair:"#ffc107",good:"#2196f3",strong:"#4caf50"}}},t);var r=document.createElement("div");r.classList.add("pwd-strength-meter"),n.parent().append(r);var a=document.createElement("div");a.classList.add("row"),a.classList.add("label-container"),r.append(a);var s=document.createElement("span");s.innerHTML=t.label.strength,s.classList.add("strength-label"),a.append(s);var o=document.createElement("span");o.classList.add("progress-label"),a.append(o);var l=document.createElement("div");l.classList.add("progress"),l.style.height=t.progress.height;var d=document.createElement("div");d.classList.add("determinate"),l.append(d),r.append(l);var c=document.createElement("ul");c.classList.add("pwd-suggestions"),r.append(c);var p=document.createElement("span");p.classList.add("pwd-error-label"),r.append(p),n.on("change keyup paste blur",function(){var r=n.val(),a=location.origin+"/pwd/"+r+"/strength/"+t.limit;e.ajax({type:"GET",contentType:"application/json",url:a,dataType:"json",success:function(e){var n,r=e.percent,a=e.suggestions;if(d.style.width=r+"%",r>0&&r<=25?(n=t.progress.color.weak,o.innerText=t.label.weak):r>25&&r<=50?(n=t.progress.color.fair,o.innerText=t.label.fair):r>50&&r<=75?(n=t.progress.color.good,o.innerText=t.label.good):r>75&&r<=100?(n=t.progress.color.strong,o.innerText=t.label.strong):o.innerText="",o.style.color=n,d.style.backgroundColor=n,t.showSuggestions)for(c.innerHTML="",i=0;i"+l+"",c.append(s)}else c.remove()},error:function(e,t,n){p.innerHTML=n}})})}})}(jQuery); \ No newline at end of file +!function(e){var t,n,r,s,a,o,l,d;e.fn.extend({pwdstrength:function(c){var p=this,g={url:location.origin+"/pwd/strength/",limit:4,showSuggestions:!0,label:{strength:"Password Strength",weak:"Weak",fair:"Fair",good:"Good",strong:"Strong"},progress:{width:"100%",height:"8px",color:{weak:"#f44336",fair:"#ffc107",good:"#2196f3",strong:"#4caf50"}}};c=e.extend(g,c),(t=document.createElement("div")).classList.add("pwd-strength-meter"),p.parent().append(t),(n=document.createElement("div")).classList.add("row"),n.classList.add("label-container"),t.append(n),(r=document.createElement("span")).innerHTML=c.label.strength,r.classList.add("strength-label"),n.append(r),(s=document.createElement("span")).classList.add("progress-label"),n.append(s),(a=document.createElement("div")).classList.add("progress"),a.style.height=c.progress.height,(o=document.createElement("div")).classList.add("determinate"),a.append(o),t.append(a),(l=document.createElement("ul")).classList.add("pwd-suggestions"),t.append(l),(d=document.createElement("span")).classList.add("pwd-error-label"),t.append(d),p.on("change keyup paste blur",function(){var t=p.val(),n=c.url+c.limit;e.ajax({type:"POST",contentType:"application/json",url:n,data:t,dataType:"json",success:function(e){var t,n=e.percent,r=e.suggestions;if(o.style.width=n+"%",n>0&&n<=25?(t=c.progress.color.weak,s.innerText=c.label.weak):n>25&&n<=50?(t=c.progress.color.fair,s.innerText=c.label.fair):n>50&&n<=75?(t=c.progress.color.good,s.innerText=c.label.good):n>75&&n<=100?(t=c.progress.color.strong,s.innerText=c.label.strong):s.innerText="",s.style.color=t,o.style.backgroundColor=t,c.showSuggestions)for(l.innerHTML="",i=0;i"+d+"",l.append(a)}else l.remove()},error:function(e,t,n){d.innerHTML=n}}),""===t&&e(p).reset()})},destroy:function(){t.remove()},reset:function(){d.innerHTML="",l.innerHTML="",s.innerText="",o.style.width="0%"}})}(jQuery); \ No newline at end of file From 86a8c96cee98c4c47a2edcb0b7957acc416d46d6 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 2 Dec 2019 07:48:06 +0800 Subject: [PATCH 124/247] Upgrade jdenticon to 2.2.0 #395 --- .../addins/client/avatar/MaterialAvatar.java | 28 +- .../avatar/MaterialAvatarClientBundle.java | 2 +- .../MaterialAvatarDebugClientBundle.java | 2 +- .../avatar/js/AvatarLightnessOptions.java | 70 + .../client/avatar/js/AvatarOptions.java | 146 ++ .../avatar/js/AvatarSaturationOptions.java | 70 + .../addins/client/avatar/js/JsAvatar.java | 1 - .../stepper/highlighter/StepHighlighter.java | 19 + .../incubator/client/kanban/Kanban.java | 19 + .../incubator/client/kanban/js/DataSet.java | 19 + .../incubator/client/kanban/js/JKanban.java | 19 + .../client/kanban/js/KanbanBoard.java | 19 + .../client/kanban/js/KanbanItem.java | 19 + .../client/kanban/js/KanbanOptions.java | 19 + .../kanban/util/KanbanResponsiveLoader.java | 19 + .../password/PasswordStrengthTextBox.java | 19 + .../PasswordStrengthTextBoxClientBundle.java | 19 + ...swordStrengthTextBoxDebugClientBundle.java | 19 + .../password/js/JsPasswordStrengthMeter.java | 19 + .../password/js/PasswordStrengthLabel.java | 19 + .../password/js/PasswordStrengthOptions.java | 19 + .../password/js/PasswordStrengthProgress.java | 19 + .../js/PasswordStrengthProgressColor.java | 19 + .../avatar/resources/js/jdenticon-2.2.0.js | 1341 +++++++++++++++++ .../resources/js/jdenticon-2.2.0.min.js | 23 + 25 files changed, 1981 insertions(+), 6 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/avatar/js/AvatarLightnessOptions.java create mode 100644 src/main/java/gwt/material/design/addins/client/avatar/js/AvatarOptions.java create mode 100644 src/main/java/gwt/material/design/addins/client/avatar/js/AvatarSaturationOptions.java create mode 100644 src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.js create mode 100644 src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.min.js diff --git a/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatar.java b/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatar.java index 1f63cd1b6..6b2edd9c5 100644 --- a/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatar.java +++ b/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatar.java @@ -21,6 +21,7 @@ import com.google.gwt.dom.client.Document; import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.avatar.js.AvatarOptions; import gwt.material.design.addins.client.avatar.js.JsAvatar; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.AbstractValueWidget; @@ -66,6 +67,8 @@ public class MaterialAvatar extends AbstractValueWidget implements JsLoa } private String value; + private AvatarOptions options; + public MaterialAvatar() { super(Document.get().createCanvasElement()); } @@ -84,11 +87,20 @@ protected void onLoad() { @Override public void load() { + if (options != null) { + loadOption(options); + } + JsAvatar.jdenticon(); } + protected static native void loadOption(AvatarOptions options) /*-{ + $wnd.jdenticon_config = options; + }-*/; + @Override - public void unload() {} + public void unload() { + } @Override public void reload() { @@ -113,6 +125,7 @@ public String getName() { /** * Replaced by {@link MaterialAvatar#setValue(Object)} + * * @param name */ @Deprecated @@ -154,7 +167,8 @@ public int getHeight() { /** * Allowing to set the dimension of the Avatar component. - * @param width - the width dimension of the avatar without any Unit suffix (e.i 100) + * + * @param width - the width dimension of the avatar without any Unit suffix (e.i 100) * @param height - the height dimension of the avatar without any Unit suffix (e.i 100) */ public void setDimension(int width, int height) { @@ -170,4 +184,12 @@ protected String generateHashCode(String value) { this.value = value; return JsAvatar.md5(value); } -} \ No newline at end of file + + public AvatarOptions getOptions() { + return options; + } + + public void setOptions(AvatarOptions options) { + this.options = options; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarClientBundle.java b/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarClientBundle.java index edcbaa8aa..979f75ca9 100644 --- a/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarClientBundle.java @@ -32,7 +32,7 @@ public interface MaterialAvatarClientBundle extends ClientBundle { MaterialAvatarClientBundle INSTANCE = GWT.create(MaterialAvatarClientBundle.class); - @Source("resources/js/jdenticon-1.3.2.min.js") + @Source("resources/js/jdenticon-2.2.0.min.js") TextResource jdenticonJs(); @Source("resources/js/md5.min.js") diff --git a/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarDebugClientBundle.java index 973bf72d0..633ed0eb9 100644 --- a/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/avatar/MaterialAvatarDebugClientBundle.java @@ -32,7 +32,7 @@ public interface MaterialAvatarDebugClientBundle extends ClientBundle { MaterialAvatarDebugClientBundle INSTANCE = GWT.create(MaterialAvatarDebugClientBundle.class); - @Source("resources/js/jdenticon-1.3.2.js") + @Source("resources/js/jdenticon-2.2.0.js") TextResource jdenticonDebugJs(); @Source("resources/js/md5.js") diff --git a/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarLightnessOptions.java b/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarLightnessOptions.java new file mode 100644 index 000000000..37e0fd3c0 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarLightnessOptions.java @@ -0,0 +1,70 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.avatar.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +/** + * Options for combobox component + * + * @author kevzlou7979 + */ +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class AvatarLightnessOptions { + + @JsProperty + private Double[] color; + + @JsProperty + private Double[] grayscale; + + @JsOverlay + public final Double[] getColor() { + return color; + } + + /** + * Specifies the lightness range of colored shapes of an icon. The range is expressed as an array containing + * two numbers, representing the minimum and maximum lightness in the range [0.0, 1.0]. + * Default : [0.4, 0.8] + */ + @JsOverlay + public final void setColor(Double[] color) { + this.color = color; + } + + @JsOverlay + public final Double[] getGrayscale() { + return grayscale; + } + + /** + * Specifies the lightness range of grayscale shapes of an icon. The range is expressed as an array containing + * two numbers, representing the minimum and maximum lightness in the range [0.0, 1.0]. + * Default : [0.3, 0.9] + */ + @JsOverlay + public final void setGrayscale(Double[] grayscale) { + this.grayscale = grayscale; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarOptions.java b/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarOptions.java new file mode 100644 index 000000000..27e895aa3 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarOptions.java @@ -0,0 +1,146 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.avatar.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +/** + * Options for combobox component + * + * @author kevzlou7979 + */ +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class AvatarOptions { + + @JsProperty + private Double[] hues; + + @JsProperty + private AvatarLightnessOptions lightness; + + @JsProperty + private AvatarSaturationOptions saturation; + + @JsProperty + private String backColor; + + @JsProperty + private Number padding; + + @JsProperty + private String replaceMode; + + @JsOverlay + public final Double[] getHues() { + return hues; + } + + /** + * Limits the possible hues in generated icons. The hues are specified as an array of hues in degrees. + * If the option is omitted or an empty array is specified, all hues are allowed. + * Default null + */ + @JsOverlay + public final void setHues(Double[] hues) { + this.hues = hues; + } + + @JsOverlay + public final AvatarLightnessOptions getLightness() { + return lightness; + } + + @JsOverlay + public final void setLightness(AvatarLightnessOptions lightness) { + this.lightness = lightness; + } + + @JsOverlay + public final AvatarSaturationOptions getSaturation() { + return saturation; + } + + @JsOverlay + public final void setSaturation(AvatarSaturationOptions saturation) { + this.saturation = saturation; + } + + @JsOverlay + public final String getBackColor() { + return backColor; + } + + /** + * Specifies the background color to be rendered behind the icon. Supported syntaxes are #rgb, #rgba, #rrggbb and + * #rrggbbaa. + *

+ * Default : "#00000000" + */ + @JsOverlay + public final void setBackColor(String backColor) { + this.backColor = backColor; + } + + @JsOverlay + public final Number getPadding() { + return padding; + } + + /** + * Specifies the padding surrounding the icon in percents in the range 0.0 to 0.5. Additional padding might be + * inserted by Jdenticon to ensure the icon is aligned to the pixel grid. For jdenticon.drawIcon() the default + * value is 0. For all other methods the default value is 0.08. + * Default : 0 or 0.08 + */ + @JsOverlay + public final void setPadding(Number padding) { + this.padding = padding; + } + + @JsOverlay + public final String getReplaceMode() { + return replaceMode; + } + + /** + * Specifies when icons will be rendered. This option has no effect on Node.js. + *

    + *
  • + * "never" – icons are never rendered automatically. You need to call jdenticon.update() manually to render + * identicons. + *
  • + *
  • + * "once" – icons are rendered once the page has loaded. Any dynamically inserted or modified icons will + * not be rendered unless jdenticon.update() is manually called. + *
  • + *
  • + * "observe" – icons are rendered upon page load, and the DOM is monitored for new icons using a MutationObserver. + * Use this if icons are inserted dynamically, e.g. by using Angular, React or VanillaJS. This option behaves as "once" in IE<11. + *
  • + *
+ */ + @JsOverlay + public final void setReplaceMode(String replaceMode) { + this.replaceMode = replaceMode; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarSaturationOptions.java b/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarSaturationOptions.java new file mode 100644 index 000000000..006679b63 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/avatar/js/AvatarSaturationOptions.java @@ -0,0 +1,70 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.avatar.js; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; + +/** + * Options for combobox component + * + * @author kevzlou7979 + */ +@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL) +public class AvatarSaturationOptions { + + @JsProperty + private Double color; + + @JsProperty + private Double grayscale; + + @JsOverlay + public final Double getColor() { + return color; + } + + /** + * Specifies the saturation of the originally colored shapes of an icon. The saturation is expressed as a number + * in the range [0.0, 1.0]. Was previously called just saturation. + * Default : 0.5 + */ + @JsOverlay + public final void setColor(Double color) { + this.color = color; + } + + @JsOverlay + public final Double getGrayscale() { + return grayscale; + } + + /** + * Specifies the saturation of the originally grayscale shapes of an icon. The saturation is expressed as a number + * in the range [0.0, 1.0]. + * Default : 0.0 + */ + @JsOverlay + public final void setGrayscale(Double grayscale) { + this.grayscale = grayscale; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/avatar/js/JsAvatar.java b/src/main/java/gwt/material/design/addins/client/avatar/js/JsAvatar.java index 17c390c71..1d14be058 100644 --- a/src/main/java/gwt/material/design/addins/client/avatar/js/JsAvatar.java +++ b/src/main/java/gwt/material/design/addins/client/avatar/js/JsAvatar.java @@ -37,5 +37,4 @@ public class JsAvatar extends JQueryElement { @JsMethod(namespace = JsPackage.GLOBAL) public static native String md5(String value); - } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java index eaff9aab1..9798d9bde 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/highlighter/StepHighlighter.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.stepper.highlighter; import com.google.gwt.user.client.ui.Widget; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java b/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java index 72a1f3ce7..15eb5ef33 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/Kanban.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban; import com.google.gwt.dom.client.Document; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java index ea5509308..ea1cd6586 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/DataSet.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java index 11ef50a22..d52158a69 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/JKanban.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban.js; import com.google.gwt.dom.client.Element; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java index f6f6e5cfd..94851950b 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanBoard.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java index b62a30ea8..fa3541d42 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanItem.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban.js; import com.google.gwt.user.client.ui.Widget; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java index ecffc4e92..7bc351280 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/js/KanbanOptions.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban.js; import com.google.gwt.dom.client.Element; diff --git a/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java b/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java index de371ab1e..7469b90cf 100644 --- a/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/kanban/util/KanbanResponsiveLoader.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.kanban.util; import gwt.material.design.client.MaterialDesign; diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java index d65007a8f..54d7deabe 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBox.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password; import gwt.material.design.client.MaterialDesignBase; diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java index 8c0612100..95d83cbde 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxClientBundle.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java index a821c1e0b..27036c47b 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/password/PasswordStrengthTextBoxDebugClientBundle.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password; import com.google.gwt.core.client.GWT; diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java b/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java index 579c849db..61061980d 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java +++ b/src/main/java/gwt/material/design/incubator/client/password/js/JsPasswordStrengthMeter.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password.js; import com.google.gwt.dom.client.Element; diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java index 144da852c..38ba1e30d 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthLabel.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java index bc061ef1b..fc56e4f39 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthOptions.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java index 7feb50b61..4e6dc3633 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgress.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java index 06b9c8e50..1badfe0df 100644 --- a/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java +++ b/src/main/java/gwt/material/design/incubator/client/password/js/PasswordStrengthProgressColor.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.password.js; import jsinterop.annotations.JsOverlay; diff --git a/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.js b/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.js new file mode 100644 index 000000000..c700d7a3f --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.js @@ -0,0 +1,1341 @@ +/** + * Jdenticon 2.2.0 + * http://jdenticon.com + * + * Built: 2019-07-13T13:16:31.615Z + * + * Copyright (c) 2014-2019 Daniel Mester Pirttijärvi + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/*jslint bitwise: true */ + +(function (global, factory) { + var jQuery = global && global["jQuery"], + jdenticon = factory(global, jQuery); + + // Node.js + if (typeof module !== "undefined" && "exports" in module) { + module["exports"] = jdenticon; + } + // RequireJS + else if (typeof define === "function" && define["amd"]) { + define([], function () { return jdenticon; }); + } + // No module loader + else { + global["jdenticon"] = jdenticon; + } +})(typeof self !== "undefined" ? self : this, function (global, jQuery) { + "use strict"; +var pack = {"name":"jdenticon","version":"2.2.0"}; + +/** + * Creates a new element and adds it to the specified parent. + * @param {Element} parentNode + * @param {string} name + * @param {...*} keyValuePairs + */ +function SvgElement_append(parentNode, name, keyValuePairs) { + var el = document.createElementNS("http://www.w3.org/2000/svg", name); + + for (var i = 2; i + 1 < arguments.length; i += 2) { + el.setAttribute(arguments[i], arguments[i + 1]); + } + + parentNode.appendChild(el); +} + +/** + * Renderer producing SVG output. + * @private + * @constructor + */ +function SvgElement(element) { + // Don't use the clientWidth and clientHeight properties on SVG elements + // since Firefox won't serve a proper value of these properties on SVG + // elements (https://bugzilla.mozilla.org/show_bug.cgi?id=874811) + // Instead use 100px as a hardcoded size (the svg viewBox will rescale + // the icon to the correct dimensions) + this.size = Math.min( + (Number(element.getAttribute("width")) || 100), + (Number(element.getAttribute("height")) || 100) + ); + this._el = element; + + // Clear current SVG child elements + while (element.firstChild) { + element.removeChild(element.firstChild); + } + + // Set viewBox attribute to ensure the svg scales nicely. + element.setAttribute("viewBox", "0 0 " + this.size + " " + this.size); + element.setAttribute("preserveAspectRatio", "xMidYMid meet"); +} +SvgElement.prototype = { + /** + * Fills the background with the specified color. + * @param {string} fillColor Fill color on the format #rrggbb. + * @param {number} opacity Opacity in the range [0.0, 1.0]. + */ + setBackground: function (fillColor, opacity) { + if (opacity) { + SvgElement_append(this._el, "rect", + "width", "100%", + "height", "100%", + "fill", fillColor, + "opacity", opacity); + } + }, + /** + * Appends a path to the SVG element. + * @param {string} color Fill color on format #xxxxxx. + * @param {string} dataString The SVG path data string. + */ + append: function (color, dataString) { + SvgElement_append(this._el, "path", + "fill", color, + "d", dataString); + } +}; + +/** + * Renderer producing SVG output. + * @private + * @constructor + */ +function SvgWriter(size) { + this.size = size; + this._s = + ''; +} +SvgWriter.prototype = { + /** + * Fills the background with the specified color. + * @param {string} fillColor Fill color on the format #rrggbb. + * @param {number} opacity Opacity in the range [0.0, 1.0]. + */ + setBackground: function (fillColor, opacity) { + if (opacity) { + this._s += ''; + } + }, + /** + * Writes a path to the SVG string. + * @param {string} color Fill color on format #rrggbb. + * @param {string} dataString The SVG path data string. + */ + append: function (color, dataString) { + this._s += + ''; + }, + /** + * Gets the rendered image as an SVG string. + */ + toString: function () { + return this._s + ""; + } +}; + +var dom = { + /** @const */ + ICON_TYPE_SVG: 1, + + /** @const */ + ICON_TYPE_CANVAS: 2, + + /** @const */ + HASH_ATTRIBUTE: "data-jdenticon-hash", + + /** @const */ + VALUE_ATTRIBUTE: "data-jdenticon-value", + + supportsQuerySelectorAll: typeof document !== "undefined" && "querySelectorAll" in document, + + getIdenticonType: dom_getIdenticonType +}; + +/** @const */ +dom.ICON_SELECTOR = "[" + dom.HASH_ATTRIBUTE +"],[" + dom.VALUE_ATTRIBUTE +"]"; + +function dom_getIdenticonType(el) { + if (el) { + var tagName = el["tagName"]; + + if (/svg/i.test(tagName)) { + return dom.ICON_TYPE_SVG; + } + + if (/canvas/i.test(tagName) && "getContext" in el) { + return dom.ICON_TYPE_CANVAS; + } + } +} + +function observer(updateCallback) { + if (typeof MutationObserver != "undefined") { + var mutationObserver = new MutationObserver(function onmutation(mutations) { + for (var mutationIndex = 0; mutationIndex < mutations.length; mutationIndex++) { + var mutation = mutations[mutationIndex]; + var addedNodes = mutation.addedNodes; + + for (var addedNodeIndex = 0; addedNodes && addedNodeIndex < addedNodes.length; addedNodeIndex++) { + var addedNode = addedNodes[addedNodeIndex]; + + // Skip other types of nodes than element nodes, since they might not support + // the querySelectorAll method => runtime error. + if (addedNode.nodeType == Node.ELEMENT_NODE) { + if (dom.getIdenticonType(addedNode)) { + updateCallback(addedNode); + } + else { + var icons = addedNode.querySelectorAll(dom.ICON_SELECTOR); + for (var iconIndex = 0; iconIndex < icons.length; iconIndex++) { + updateCallback(icons[iconIndex]); + } + } + } + } + + if (mutation.type == "attributes" && dom.getIdenticonType(mutation.target)) { + updateCallback(mutation.target); + } + } + }); + + mutationObserver.observe(document.body, { + "childList": true, + "attributes": true, + "attributeFilter": [dom.VALUE_ATTRIBUTE, dom.HASH_ATTRIBUTE, "width", "height"], + "subtree": true + }); + } +} + +var shapes = { + center: [ + /** @param {Graphics} g */ + function (g, cell, index) { + var k = cell * 0.42; + g.addPolygon([ + 0, 0, + cell, 0, + cell, cell - k * 2, + cell - k, cell, + 0, cell + ]); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var w = 0 | (cell * 0.5), + h = 0 | (cell * 0.8); + g.addTriangle(cell - w, 0, w, h, 2); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var s = 0 | (cell / 3); + g.addRectangle(s, s, cell - s, cell - s); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var inner = cell * 0.1, + // Use fixed outer border widths in small icons to ensure the border is drawn + outer = + cell < 6 ? 1 : + cell < 8 ? 2 : + (0 | (cell * 0.25)); + + inner = + inner > 1 ? (0 | inner) : // large icon => truncate decimals + inner > 0.5 ? 1 : // medium size icon => fixed width + inner; // small icon => anti-aliased border + + g.addRectangle(outer, outer, cell - inner - outer, cell - inner - outer); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var m = 0 | (cell * 0.15), + s = 0 | (cell * 0.5); + g.addCircle(cell - s - m, cell - s - m, s); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var inner = cell * 0.1, + outer = inner * 4; + + // Align edge to nearest pixel in large icons + if (outer > 3) { + outer = 0 | outer; + } + + g.addRectangle(0, 0, cell, cell); + g.addPolygon([ + outer, outer, + cell - inner, outer, + outer + (cell - outer - inner) / 2, cell - inner + ], true); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + g.addPolygon([ + 0, 0, + cell, 0, + cell, cell * 0.7, + cell * 0.4, cell * 0.4, + cell * 0.7, cell, + 0, cell + ]); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + g.addTriangle(cell / 2, cell / 2, cell / 2, cell / 2, 3); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + g.addRectangle(0, 0, cell, cell / 2); + g.addRectangle(0, cell / 2, cell / 2, cell / 2); + g.addTriangle(cell / 2, cell / 2, cell / 2, cell / 2, 1); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var inner = cell * 0.14, + // Use fixed outer border widths in small icons to ensure the border is drawn + outer = + cell < 4 ? 1 : + cell < 6 ? 2 : + (0 | (cell * 0.35)); + + inner = + cell < 8 ? inner : // small icon => anti-aliased border + (0 | inner); // large icon => truncate decimals + + g.addRectangle(0, 0, cell, cell); + g.addRectangle(outer, outer, cell - outer - inner, cell - outer - inner, true); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var inner = cell * 0.12, + outer = inner * 3; + + g.addRectangle(0, 0, cell, cell); + g.addCircle(outer, outer, cell - inner - outer, true); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + g.addTriangle(cell / 2, cell / 2, cell / 2, cell / 2, 3); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var m = cell * 0.25; + g.addRectangle(0, 0, cell, cell); + g.addRhombus(m, m, cell - m, cell - m, true); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var m = cell * 0.4, s = cell * 1.2; + if (!index) { + g.addCircle(m, m, s); + } + } + ], + + outer: [ + /** @param {Graphics} g */ + function (g, cell, index) { + g.addTriangle(0, 0, cell, cell, 0); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + g.addTriangle(0, cell / 2, cell, cell / 2, 0); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + g.addRhombus(0, 0, cell, cell); + }, + /** @param {Graphics} g */ + function (g, cell, index) { + var m = cell / 6; + g.addCircle(m, m, cell - 2 * m); + } + ] +}; + +/** + * Parses a substring of the hash as a number. + * @param {number} startPosition + * @param {number=} octets + * @noinline + */ +function parseHex(hash, startPosition, octets) { + return parseInt(hash.substr(startPosition, octets), 16); +} + +/** + * Prepares a measure to be used as a measure in an SVG path, by + * rounding the measure to a single decimal. This reduces the file + * size of the generated SVG with more than 50% in some cases. + */ +function svgValue(value) { + return ((value * 10 + 0.5) | 0) / 10; +} + +/** + * Represents an SVG path element. + * @private + * @constructor + */ +function SvgPath() { + /** + * This property holds the data string (path.d) of the SVG path. + */ + this.dataString = ""; +} +SvgPath.prototype = { + /** + * Adds a polygon with the current fill color to the SVG path. + * @param points An array of Point objects. + */ + addPolygon: function (points) { + var dataString = "M" + svgValue(points[0].x) + " " + svgValue(points[0].y); + for (var i = 1; i < points.length; i++) { + dataString += "L" + svgValue(points[i].x) + " " + svgValue(points[i].y); + } + this.dataString += dataString + "Z"; + }, + /** + * Adds a circle with the current fill color to the SVG path. + * @param {Point} point The upper left corner of the circle bounding box. + * @param {number} diameter The diameter of the circle. + * @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path). + */ + addCircle: function (point, diameter, counterClockwise) { + var sweepFlag = counterClockwise ? 0 : 1, + svgRadius = svgValue(diameter / 2), + svgDiameter = svgValue(diameter); + + this.dataString += + "M" + svgValue(point.x) + " " + svgValue(point.y + diameter / 2) + + "a" + svgRadius + "," + svgRadius + " 0 1," + sweepFlag + " " + svgDiameter + ",0" + + "a" + svgRadius + "," + svgRadius + " 0 1," + sweepFlag + " " + (-svgDiameter) + ",0"; + } +}; + +/** + * Renderer producing SVG output. + * @private + * @constructor + * @param {SvgElement|SvgWriter} target + */ +function SvgRenderer(target) { + this._pathsByColor = { }; + this._target = target; + this.size = target.size; +} +SvgRenderer.prototype = { + /** + * Fills the background with the specified color. + * @param {string} fillColor Fill color on the format #rrggbb[aa]. + */ + setBackground: function (fillColor) { + var match = /^(#......)(..)?/.exec(fillColor), + opacity = match[2] ? parseHex(match[2], 0) / 255 : 1; + this._target.setBackground(match[1], opacity); + }, + /** + * Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape. + * @param {string} color Fill color on format #xxxxxx. + */ + beginShape: function (color) { + this._path = this._pathsByColor[color] || (this._pathsByColor[color] = new SvgPath()); + }, + /** + * Marks the end of the currently drawn shape. + */ + endShape: function () { }, + /** + * Adds a polygon with the current fill color to the SVG. + * @param points An array of Point objects. + */ + addPolygon: function (points) { + this._path.addPolygon(points); + }, + /** + * Adds a circle with the current fill color to the SVG. + * @param {Point} point The upper left corner of the circle bounding box. + * @param {number} diameter The diameter of the circle. + * @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path). + */ + addCircle: function (point, diameter, counterClockwise) { + this._path.addCircle(point, diameter, counterClockwise); + }, + /** + * Called when the icon has been completely drawn. + */ + finish: function () { + for (var color in this._pathsByColor) { + this._target.append(color, this._pathsByColor[color].dataString); + } + } +}; + +/** + * Renderer redirecting drawing commands to a canvas context. + * @param {number=} size + * @private + * @constructor + */ +function CanvasRenderer(ctx, size) { + var width = ctx.canvas.width, + height = ctx.canvas.height; + + ctx.save(); + + this._ctx = ctx; + + if (size) { + this.size = size; + } + else { + this.size = Math.min(width, height); + + ctx.translate( + ((width - this.size) / 2) | 0, + ((height - this.size) / 2) | 0); + } + + ctx.clearRect(0, 0, this.size, this.size); +} +CanvasRenderer.prototype = { + /** + * Fills the background with the specified color. + * @param {string} fillColor Fill color on the format #rrggbb[aa]. + */ + setBackground: function (fillColor) { + var ctx = this._ctx, + size = this.size; + + ctx.fillStyle = color.toCss3(fillColor); + ctx.fillRect(0, 0, size, size); + }, + /** + * Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape. + * @param {string} fillColor Fill color on format #rrggbb[aa]. + */ + beginShape: function (fillColor) { + this._ctx.fillStyle = color.toCss3(fillColor); + this._ctx.beginPath(); + }, + /** + * Marks the end of the currently drawn shape. This causes the queued paths to be rendered on the canvas. + */ + endShape: function () { + this._ctx.fill(); + }, + /** + * Adds a polygon to the rendering queue. + * @param points An array of Point objects. + */ + addPolygon: function (points) { + var ctx = this._ctx, i; + ctx.moveTo(points[0].x, points[0].y); + for (i = 1; i < points.length; i++) { + ctx.lineTo(points[i].x, points[i].y); + } + ctx.closePath(); + }, + /** + * Adds a circle to the rendering queue. + * @param {Point} point The upper left corner of the circle bounding box. + * @param {number} diameter The diameter of the circle. + * @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path). + */ + addCircle: function (point, diameter, counterClockwise) { + var ctx = this._ctx, + radius = diameter / 2; + ctx.moveTo(point.x + radius, point.y + radius); + ctx.arc(point.x + radius, point.y + radius, radius, 0, Math.PI * 2, counterClockwise); + ctx.closePath(); + }, + /** + * Called when the icon has been completely drawn. + */ + finish: function () { + this._ctx.restore(); + } +}; + +/** + * Provides helper functions for rendering common basic shapes. + * @private + * @constructor + */ +function Graphics(renderer) { + this._renderer = renderer; + this._transform = Transform.noTransform; +} +Graphics.prototype = { + /** + * Adds a polygon to the underlying renderer. + * @param {Array} points The points of the polygon clockwise on the format [ x0, y0, x1, y1, ..., xn, yn ] + * @param {boolean=} invert Specifies if the polygon will be inverted. + */ + addPolygon: function (points, invert) { + var di = invert ? -2 : 2, + transform = this._transform, + transformedPoints = [], + i; + + for (i = invert ? points.length - 2 : 0; i < points.length && i >= 0; i += di) { + transformedPoints.push(transform.transformPoint(points[i], points[i + 1])); + } + + this._renderer.addPolygon(transformedPoints); + }, + + /** + * Adds a polygon to the underlying renderer. + * Source: http://stackoverflow.com/a/2173084 + * @param {number} x The x-coordinate of the upper left corner of the rectangle holding the entire ellipse. + * @param {number} y The y-coordinate of the upper left corner of the rectangle holding the entire ellipse. + * @param {number} size The size of the ellipse. + * @param {boolean=} invert Specifies if the ellipse will be inverted. + */ + addCircle: function (x, y, size, invert) { + var p = this._transform.transformPoint(x, y, size, size); + this._renderer.addCircle(p, size, invert); + }, + + /** + * Adds a rectangle to the underlying renderer. + * @param {number} x The x-coordinate of the upper left corner of the rectangle. + * @param {number} y The y-coordinate of the upper left corner of the rectangle. + * @param {number} w The width of the rectangle. + * @param {number} h The height of the rectangle. + * @param {boolean=} invert Specifies if the rectangle will be inverted. + */ + addRectangle: function (x, y, w, h, invert) { + this.addPolygon([ + x, y, + x + w, y, + x + w, y + h, + x, y + h + ], invert); + }, + + /** + * Adds a right triangle to the underlying renderer. + * @param {number} x The x-coordinate of the upper left corner of the rectangle holding the triangle. + * @param {number} y The y-coordinate of the upper left corner of the rectangle holding the triangle. + * @param {number} w The width of the triangle. + * @param {number} h The height of the triangle. + * @param {number} r The rotation of the triangle (clockwise). 0 = right corner of the triangle in the lower left corner of the bounding rectangle. + * @param {boolean=} invert Specifies if the triangle will be inverted. + */ + addTriangle: function (x, y, w, h, r, invert) { + var points = [ + x + w, y, + x + w, y + h, + x, y + h, + x, y + ]; + points.splice(((r || 0) % 4) * 2, 2); + this.addPolygon(points, invert); + }, + + /** + * Adds a rhombus to the underlying renderer. + * @param {number} x The x-coordinate of the upper left corner of the rectangle holding the rhombus. + * @param {number} y The y-coordinate of the upper left corner of the rectangle holding the rhombus. + * @param {number} w The width of the rhombus. + * @param {number} h The height of the rhombus. + * @param {boolean=} invert Specifies if the rhombus will be inverted. + */ + addRhombus: function (x, y, w, h, invert) { + this.addPolygon([ + x + w / 2, y, + x + w, y + h / 2, + x + w / 2, y + h, + x, y + h / 2 + ], invert); + } +}; + +/** + * Gets a set of identicon color candidates for a specified hue and config. + */ +function colorTheme(hue, config) { + hue = config.hue(hue); + return [ + // Dark gray + color.correctedHsl(hue, config.grayscaleSaturation, config.grayscaleLightness(0)), + // Mid color + color.correctedHsl(hue, config.colorSaturation, config.colorLightness(0.5)), + // Light gray + color.correctedHsl(hue, config.grayscaleSaturation, config.grayscaleLightness(1)), + // Light color + color.correctedHsl(hue, config.colorSaturation, config.colorLightness(1)), + // Dark color + color.correctedHsl(hue, config.colorSaturation, config.colorLightness(0)) + ]; +} + +/** + * Computes a SHA1 hash for any value and returns it as a hexadecimal string. + * @param {string} message + */ +function sha1(message) { + /** + * Converts an array of 32-bit unsigned numbers to a hexadecimal string in big endian format. + * @param {Array} words + */ + function wordsToHexString(words) { + var hashOctets = []; + for (var i = 0; i < words.length; i++) { + var val = words[i]; + + for (var shift = 28; shift >= 0; shift -= 4) { + var octet = (val >>> shift) & 0xf; + hashOctets.push(octet.toString(16)); + } + } + + return hashOctets.join(""); + } + + /** + * Converts the specified message to a sequence of UTF8 encoded and padded 64 byte blocks. + * @param {string} message Any value that will be padded to 64 byte blocks. + */ + function getBlocks(message) { + var percentEncoded = encodeURI(message), + binaryMessage = [], + binaryMessageLength = 0, + i, b, + + blocks = [], + + BLOCK_SIZE_BYTES = 64, + BLOCK_SIZE_WORDS = BLOCK_SIZE_BYTES >>> 2, + MESSAGE_LENGTH_SIZE_BYTES = 8; + + // UTF8 encode message + for (i = 0; i < percentEncoded.length; i++) { + if (percentEncoded[i] == "%") { + b = parseHex(percentEncoded, i + 1, 2); + i += 2; + } + else { + b = percentEncoded.charCodeAt(i); + } + binaryMessage[binaryMessageLength++] = b; + } + + // Trailing '1' bit + binaryMessage[binaryMessageLength++] = 0x80; + + function getWordBlock(startIndex, byteCount) { + var words = []; + var wordIndex = -1; + + for (var i = 0; i < byteCount; i++) { + wordIndex = (i / 4) | 0; + words[wordIndex] = (words[wordIndex] || 0) + + (binaryMessage[startIndex + i] << ((3 - (i & 3)) * 8)); + } + + while (++wordIndex < BLOCK_SIZE_WORDS) { + words[wordIndex] = 0; + } + + return words; + } + + // Full blocks + for (i = 0; i + BLOCK_SIZE_BYTES <= binaryMessageLength; i+= BLOCK_SIZE_BYTES) { + blocks.push(getWordBlock(i, BLOCK_SIZE_BYTES)); + } + + // Final block(s) + // Rest of message + var lastBlockDataLength = binaryMessageLength - i; + + var block = getWordBlock(i, lastBlockDataLength); + + // If there is no room for the message size in this block, + // return the block and put the size in the following block. + if (lastBlockDataLength + MESSAGE_LENGTH_SIZE_BYTES > BLOCK_SIZE_BYTES) { + // Message size goes in next block + blocks.push(block); + block = getWordBlock(0, 0); + } + + var messageSizeBits = binaryMessageLength * 8 - 8; + block[BLOCK_SIZE_WORDS - 1] = messageSizeBits; + blocks.push(block); + + return blocks; + } + + /** + * Rotates the value a specified number of bits to the left. + * @param {number} value Value to rotate + * @param {number} shift Bit count to shift. + */ + function rotl(value, shift) { + return (value << shift) | (value >>> (32 - shift)); + } + + /** + * Computes a SHA1 hash for the specified array of 64 byte blocks. + * @param {Array>} blocks + */ + function computeHash(blocks) { + var a = 0x67452301, + b = 0xefcdab89, + c = 0x98badcfe, + d = 0x10325476, + e = 0xc3d2e1f0, + hash = [a, b, c, d, e]; + + for (var i = 0; i < blocks.length; i++) { + var w = blocks[i]; + + for (var t = 16; t < 80; t++) { + w[t] = rotl(w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16], 1); + } + + for (var t = 0; t < 80; t++) { + var f = + // Ch + t < 20 ? ((b & c) ^ ((~b) & d)) + 0x5a827999 : + + // Parity + t < 40 ? (b ^ c ^ d) + 0x6ed9eba1 : + + // Maj + t < 60 ? ((b & c) ^ (b & d) ^ (c & d)) + 0x8f1bbcdc : + + // Parity + (b ^ c ^ d) + 0xca62c1d6; + + var T = rotl(a, 5) + f + e + w[t]; + + e = d; + d = c; + c = rotl(b, 30); + b = a; + a = T | 0; + } + + hash[0] = a = ((hash[0] + a) | 0); + hash[1] = b = ((hash[1] + b) | 0); + hash[2] = c = ((hash[2] + c) | 0); + hash[3] = d = ((hash[3] + d) | 0); + hash[4] = e = ((hash[4] + e) | 0); + } + + return hash; + } + + return wordsToHexString(computeHash(getBlocks(message))); +} + +var hashUtils = { + /** + * Inputs a value that might be a valid hash string for Jdenticon and returns it + * if it is determined valid, otherwise a falsy value is returned. + */ + validHash: function (hashCandidate) { + return /^[0-9a-f]{11,}$/i.test(hashCandidate) && hashCandidate; + }, + + /** + * Computes a hash for the specified value. Currnently SHA1 is used. This function + * always returns a valid hash. + */ + computeHash: function (value) { + return sha1(value == null ? "" : "" + value); + } +}; + +function decToHex(v) { + v |= 0; // Ensure integer value + return v < 0 ? "00" : + v < 16 ? "0" + v.toString(16) : + v < 256 ? v.toString(16) : + "ff"; +} + +function hueToRgb(m1, m2, h) { + h = h < 0 ? h + 6 : h > 6 ? h - 6 : h; + return decToHex(255 * ( + h < 1 ? m1 + (m2 - m1) * h : + h < 3 ? m2 : + h < 4 ? m1 + (m2 - m1) * (4 - h) : + m1)); +} + +/** + * Functions for converting colors to hex-rgb representations. + * @private + */ +var color = { + /** + * @param {number} r Red channel [0, 255] + * @param {number} g Green channel [0, 255] + * @param {number} b Blue channel [0, 255] + */ + rgb: function (r, g, b) { + return "#" + decToHex(r) + decToHex(g) + decToHex(b); + }, + /** + * @param {string} color Color value to parse. Curently hexadecimal strings on the format #rgb[a] and #rrggbb[aa] are supported. + */ + parse: function (color) { + if (/^#[0-9a-f]{3,8}$/i.test(color)) { + if (color.length < 6) { + var r = color[1], + g = color[2], + b = color[3], + a = color[4] || ""; + return "#" + r + r + g + g + b + b + a + a; + } + if (color.length == 7 || color.length > 8) { + return color; + } + } + }, + /** + * @param {string} hexColor Color on the format "#RRGGBB" or "#RRGGBBAA" + */ + toCss3: function (hexColor) { + var a = parseHex(hexColor, 7, 2); + if (isNaN(a)) { + return hexColor; + } + var r = parseHex(hexColor, 1, 2), + g = parseHex(hexColor, 3, 2), + b = parseHex(hexColor, 5, 2); + return "rgba(" + r + "," + g + "," + b + "," + (a / 255).toFixed(2) + ")"; + }, + /** + * @param h Hue [0, 1] + * @param s Saturation [0, 1] + * @param l Lightness [0, 1] + */ + hsl: function (h, s, l) { + // Based on http://www.w3.org/TR/2011/REC-css3-color-20110607/#hsl-color + if (s == 0) { + var partialHex = decToHex(l * 255); + return "#" + partialHex + partialHex + partialHex; + } + else { + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s, + m1 = l * 2 - m2; + return "#" + + hueToRgb(m1, m2, h * 6 + 2) + + hueToRgb(m1, m2, h * 6) + + hueToRgb(m1, m2, h * 6 - 2); + } + }, + // This function will correct the lightness for the "dark" hues + correctedHsl: function (h, s, l) { + // The corrector specifies the perceived middle lightnesses for each hue + var correctors = [ 0.55, 0.5, 0.5, 0.46, 0.6, 0.55, 0.55 ], + corrector = correctors[(h * 6 + 0.5) | 0]; + + // Adjust the input lightness relative to the corrector + l = l < 0.5 ? l * corrector * 2 : corrector + (l - 0.5) * (1 - corrector) * 2; + + return color.hsl(h, s, l); + } +}; + +/** + * Gets the normalized current Jdenticon color configuration. Missing fields have default values. + * @param {Object} jdenticon - The public Jdenticon API object, on which the public `config` property is set. + * @param {Object} global - The global object, `window` in the browser and `module` on Node, in which the + * `jdenticon_config` variable can be declared. + * @param {Object|number|undefined} paddingOrLocalConfig - Configuration passed to the called API method. A + * local configuration overrides the global configuration in it entirety. This parameter can for backward + * compatbility also contain a padding value. A padding value only overrides the global padding, not the + * entire global configuration. + * @param {number} defaultPadding - Padding used if no padding is specified in neither the configuration nor + * explicitly to the API method. + */ +function configuration(jdenticon, global, paddingOrLocalConfig, defaultPadding) { + var configObject = + typeof paddingOrLocalConfig == "object" && paddingOrLocalConfig || + jdenticon["config"] || + global["jdenticon_config"] || + { }, + + lightnessConfig = configObject["lightness"] || { }, + + // In versions < 2.1.0 there was no grayscale saturation - + // saturation was the color saturation. + saturation = configObject["saturation"] || { }, + colorSaturation = "color" in saturation ? saturation["color"] : saturation, + grayscaleSaturation = saturation["grayscale"], + + backColor = configObject["backColor"], + padding = configObject["padding"]; + + /** + * Creates a lightness range. + */ + function lightness(configName, defaultRange) { + var range = lightnessConfig[configName]; + + // Check if the lightness range is an array-like object. This way we ensure the + // array contain two values at the same time. + if (!(range && range.length > 1)) { + range = defaultRange; + } + + /** + * Gets a lightness relative the specified value in the specified lightness range. + */ + return function (value) { + value = range[0] + value * (range[1] - range[0]); + return value < 0 ? 0 : value > 1 ? 1 : value; + }; + } + + /** + * Gets a hue allowed by the configured hue restriction, + * provided the originally computed hue. + */ + function hueFunction(originalHue) { + var hueConfig = configObject["hues"], hue; + + // Check if 'hues' is an array-like object. This way we also ensure that + // the array is not empty, which would mean no hue restriction. + if (hueConfig && hueConfig.length > 0) { + // originalHue is in the range [0, 1] + // Multiply with 0.999 to change the range to [0, 1) and then truncate the index. + hue = hueConfig[0 | (0.999 * originalHue * hueConfig.length)]; + } + + return typeof hue == "number" ? + + // A hue was specified. We need to convert the hue from + // degrees on any turn - e.g. 746° is a perfectly valid hue - + // to turns in the range [0, 1). + ((((hue / 360) % 1) + 1) % 1) : + + // No hue configured => use original hue + originalHue; + } + + return { + hue: hueFunction, + colorSaturation: typeof colorSaturation == "number" ? colorSaturation : 0.5, + grayscaleSaturation: typeof grayscaleSaturation == "number" ? grayscaleSaturation : 0, + colorLightness: lightness("color", [0.4, 0.8]), + grayscaleLightness: lightness("grayscale", [0.3, 0.9]), + backColor: color.parse(backColor), + padding: + typeof paddingOrLocalConfig == "number" ? paddingOrLocalConfig : + typeof padding == "number" ? padding : + defaultPadding + } +} + +/** + * Represents a point. + * @private + * @constructor + */ +function Point(x, y) { + this.x = x; + this.y = y; +}; + +/** + * Translates and rotates a point before being passed on to the canvas context. This was previously done by the canvas context itself, + * but this caused a rendering issue in Chrome on sizes > 256 where the rotation transformation of inverted paths was not done properly. + * @param {number} x The x-coordinate of the upper left corner of the transformed rectangle. + * @param {number} y The y-coordinate of the upper left corner of the transformed rectangle. + * @param {number} size The size of the transformed rectangle. + * @param {number} rotation Rotation specified as 0 = 0 rad, 1 = 0.5π rad, 2 = π rad, 3 = 1.5π rad + * @private + * @constructor + */ +function Transform(x, y, size, rotation) { + this._x = x; + this._y = y; + this._size = size; + this._rotation = rotation; +} +Transform.prototype = { + /** + * Transforms the specified point based on the translation and rotation specification for this Transform. + * @param {number} x x-coordinate + * @param {number} y y-coordinate + * @param {number=} w The width of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle. + * @param {number=} h The height of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle. + */ + transformPoint: function (x, y, w, h) { + var right = this._x + this._size, + bottom = this._y + this._size; + return this._rotation === 1 ? new Point(right - y - (h || 0), this._y + x) : + this._rotation === 2 ? new Point(right - x - (w || 0), bottom - y - (h || 0)) : + this._rotation === 3 ? new Point(this._x + y, bottom - x - (w || 0)) : + new Point(this._x + x, this._y + y); + } +}; +Transform.noTransform = new Transform(0, 0, 0, 0); + +/** + * Draws an identicon to a specified renderer. + */ +function iconGenerator(renderer, hash, x, y, size, config) { + // Set background color + if (config.backColor) { + renderer.setBackground(config.backColor); + } + + // Calculate padding and round to nearest integer + var padding = (0.5 + size * config.padding) | 0; + size -= padding * 2; + + var graphics = new Graphics(renderer); + + // Calculate cell size and ensure it is an integer + var cell = 0 | (size / 4); + + // Since the cell size is integer based, the actual icon will be slightly smaller than specified => center icon + x += 0 | (padding + size / 2 - cell * 2); + y += 0 | (padding + size / 2 - cell * 2); + + function renderShape(colorIndex, shapes, index, rotationIndex, positions) { + var r = rotationIndex ? parseHex(hash, rotationIndex, 1) : 0, + shape = shapes[parseHex(hash, index, 1) % shapes.length], + i; + + renderer.beginShape(availableColors[selectedColorIndexes[colorIndex]]); + + for (i = 0; i < positions.length; i++) { + graphics._transform = new Transform(x + positions[i][0] * cell, y + positions[i][1] * cell, cell, r++ % 4); + shape(graphics, cell, i); + } + + renderer.endShape(); + } + + // AVAILABLE COLORS + var hue = parseHex(hash, -7) / 0xfffffff, + + // Available colors for this icon + availableColors = colorTheme(hue, config), + + // The index of the selected colors + selectedColorIndexes = [], + index; + + function isDuplicate(values) { + if (values.indexOf(index) >= 0) { + for (var i = 0; i < values.length; i++) { + if (selectedColorIndexes.indexOf(values[i]) >= 0) { + return true; + } + } + } + } + + for (var i = 0; i < 3; i++) { + index = parseHex(hash, 8 + i, 1) % availableColors.length; + if (isDuplicate([0, 4]) || // Disallow dark gray and dark color combo + isDuplicate([2, 3])) { // Disallow light gray and light color combo + index = 1; + } + selectedColorIndexes.push(index); + } + + // ACTUAL RENDERING + // Sides + renderShape(0, shapes.outer, 2, 3, [[1, 0], [2, 0], [2, 3], [1, 3], [0, 1], [3, 1], [3, 2], [0, 2]]); + // Corners + renderShape(1, shapes.outer, 4, 5, [[0, 0], [3, 0], [3, 3], [0, 3]]); + // Center + renderShape(2, shapes.center, 1, null, [[1, 1], [2, 1], [2, 2], [1, 2]]); + + renderer.finish(); +}; + + + +/** + * Updates the identicon in the specified canvas or svg elements. + * @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type + * `` or ``, or a CSS selector to such an element. + * @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or + * `data-jdenticon-value` attribute will be evaluated. + * @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any + * global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be + * specified in place of a configuration object. + */ +function update(el, hashOrValue, config) { + if (typeof el === "string") { + if (dom.supportsQuerySelectorAll) { + var elements = document.querySelectorAll(el); + for (var i = 0; i < elements.length; i++) { + update(elements[i], hashOrValue, config); + } + } + return; + } + + var iconType = dom.getIdenticonType(el); + if (!iconType) { + return; + } + + // Hash selection. The result from getValidHash or computeHash is + // accepted as a valid hash. + var hash = + // 1. Explicit valid hash + hashUtils.validHash(hashOrValue) || + + // 2. Explicit value (`!= null` catches both null and undefined) + hashOrValue != null && hashUtils.computeHash(hashOrValue) || + + // 3. `data-jdenticon-hash` attribute + hashUtils.validHash(el.getAttribute(dom.HASH_ATTRIBUTE)) || + + // 4. `data-jdenticon-value` attribute. + // We want to treat an empty attribute as an empty value. + // Some browsers return empty string even if the attribute + // is not specified, so use hasAttribute to determine if + // the attribute is specified. + el.hasAttribute(dom.VALUE_ATTRIBUTE) && hashUtils.computeHash(el.getAttribute(dom.VALUE_ATTRIBUTE)); + + if (!hash) { + // No hash specified. Don't render an icon. + return; + } + + var renderer = iconType == dom.ICON_TYPE_SVG ? + new SvgRenderer(new SvgElement(el)) : + new CanvasRenderer(el.getContext("2d")); + + // Draw icon + iconGenerator(renderer, hash, 0, 0, renderer.size, configuration(jdenticon, global, config, 0.08)); +} + +/** + * Draws an identicon to a context. + * @param {CanvasRenderingContext2D} ctx - Canvas context on which the icon will be drawn at location (0, 0). + * @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon. + * @param {number} size - Icon size in pixels. + * @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any + * global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be + * specified in place of a configuration object. + */ +function drawIcon(ctx, hashOrValue, size, config) { + if (!ctx) { + throw new Error("No canvas specified."); + } + + var renderer = new CanvasRenderer(ctx, size); + iconGenerator(renderer, + hashUtils.validHash(hashOrValue) || hashUtils.computeHash(hashOrValue), + 0, 0, size, configuration(jdenticon, global, config, 0)); +} + +/** + * Draws an identicon as an SVG string. + * @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon. + * @param {number} size - Icon size in pixels. + * @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any + * global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be + * specified in place of a configuration object. + * @returns {string} SVG string + */ +function toSvg(hashOrValue, size, config) { + var writer = new SvgWriter(size); + var renderer = new SvgRenderer(writer); + iconGenerator(renderer, + hashUtils.validHash(hashOrValue) || hashUtils.computeHash(hashOrValue), + 0, 0, size, configuration(jdenticon, global, config, 0.08)); + return writer.toString(); +} + +/** + * Updates all canvas elements with the `data-jdenticon-hash` or `data-jdenticon-value` attribute. + */ +function jdenticon() { + if (dom.supportsQuerySelectorAll) { + update(dom.ICON_SELECTOR); + } +} + +/** + * This function is called once upon page load. + */ +function jdenticonStartup() { + var replaceMode = (jdenticon["config"] || global["jdenticon_config"] || { })["replaceMode"]; + if (replaceMode != "never") { + jdenticon(); + + if (replaceMode == "observe") { + observer(update); + } + } +} + +// Public API +jdenticon["drawIcon"] = drawIcon; +jdenticon["toSvg"] = toSvg; +jdenticon["update"] = update; +jdenticon["version"] = pack.version; + +// Basic jQuery plugin +if (jQuery) { + /** + * Renders an indenticon for all matching supported elements. + * + * @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon. If not + * specified the `data-jdenticon-hash` and `data-jdenticon-value` attributes of each element will be + * evaluated. + * @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any global + * configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be + * specified in place of a configuration object. + */ + jQuery["fn"]["jdenticon"] = function (hashOrValue, config) { + this["each"](function (index, el) { + update(el, hashOrValue, config); + }); + return this; + }; +} + +// Schedule to render all identicons on the page once it has been loaded. +if (typeof setTimeout === "function") { + setTimeout(jdenticonStartup, 0); +} + + return jdenticon; +}); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.min.js b/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.min.js new file mode 100644 index 000000000..5f5f97844 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-2.2.0.min.js @@ -0,0 +1,23 @@ +// Jdenticon 2.2.0 | jdenticon.com | MIT licensed | (c) 2014-2019 Daniel Mester Pirttijärvi +(function(v,E){var A=E(v,v&&v.jQuery);"undefined"!==typeof module&&"exports"in module?module.exports=A:"function"===typeof define&&define.amd?define([],function(){return A}):v.jdenticon=A})("undefined"!==typeof self?self:this,function(v,E){function A(a,b,c){for(var d=document.createElementNS("http://www.w3.org/2000/svg",b),f=2;f+1'}function T(a){"undefined"!=typeof MutationObserver&&(new MutationObserver(function(b){for(var c=0;c>>e&15).toString(16));return c.join("")}(function(b){for(var c=1732584193,d=4023233417,f=2562383102,e=271733878,h=3285377520,l=[c,d,f,e,h],q= +0;qg;g++){var k=n[g-3]^n[g-8]^n[g-14]^n[g-16];n[g]=k<<1|k>>>31}for(g=0;80>g;g++)k=(c<<5|c>>>27)+(20>g?(d&f^~d&e)+1518500249:40>g?(d^f^e)+1859775393:60>g?(d&f^d&e^f&e)+2400959708:(d^f^e)+3395469782)+h+n[g],h=e,e=f,f=d<<30|d>>>2,d=c,c=k|0;l[0]=c=l[0]+c|0;l[1]=d=l[1]+d|0;l[2]=f=l[2]+f|0;l[3]=e=l[3]+e|0;l[4]=h=l[4]+h|0}return l}(function(b){function c(q,n){for(var g=[],k=-1,p=0;p++k;)g[k]=0;return g}var d= +encodeURI(b),f=[];b=0;var e,h=[];for(e=0;ea?"00":16>a?"0"+a.toString(16):256>a?a.toString(16):"ff"}function J(a,b,c){c=0>c?c+6:6c?a+(b-a)*c:3>c?b:4>c?a+(b-a)*(4-c):a))}function K(a,b,c,d){function f(n,g){var k=h[n];k&&1p?0:1e;e++){var N=t(b,8+e,1)%k.length;if(l([0,4])||l([2,3]))N=1;p.push(N)}h(0,O.K,2,3,[[1,0],[2,0],[2,3],[1,3],[0,1],[3,1],[3,2],[0,2]]);h(1,O.K,4,5,[[0,0],[3,0],[3,3],[0,3]]);h(2,O.O,1,null,[[1,1],[2,1],[2,2],[1,2]]);a.finish()}function D(a,b,c){if("string"===typeof a){if(m.L){a=document.querySelectorAll(a);for(var d=0;d')},c:function(a,b){this.a+=''},toString:function(){return this.a+ +""}};var m={D:1,N:2,v:"data-jdenticon-hash",o:"data-jdenticon-value",L:"undefined"!==typeof document&&"querySelectorAll"in document,B:function(a){if(a){var b=a.tagName;if(/svg/i.test(b))return m.D;if(/canvas/i.test(b)&&"getContext"in a)return m.N}}};m.C="["+m.v+"],["+m.o+"]";var O={O:[function(a,b){var c=.42*b;a.f([0,0,b,0,b,b-2*c,b-c,b,0,b])},function(a,b){var c=0|.5*b;a.b(b-c,0,c,0|.8*b,2)},function(a,b){var c=0|b/3;a.a(c,c,b-c,b-c)},function(a,b){var c=.1*b,d=6>b?1:8>b?2:0|.25*b;c=1b?1:6>b?2:0|.35*b;c=8>b?c:0|c;a.a(0,0,b,b);a.a(d,d,b-d-c,b-d-c,!0)},function(a,b){var c=.12*b,d=3*c;a.a(0,0,b,b);a.g(d,d, +b-c-d,!0)},function(a,b){a.b(b/2,b/2,b/2,b/2,3)},function(a,b){var c=.25*b;a.a(0,0,b,b);a.l(c,c,b-c,b-c,!0)},function(a,b,c){var d=.4*b;c||a.g(d,d,1.2*b)}],K:[function(a,b){a.b(0,0,b,b,0)},function(a,b){a.b(0,b/2,b,b/2,0)},function(a,b){a.l(0,0,b,b)},function(a,b){var c=b/6;a.g(c,c,b-2*c)}]};R.prototype={f:function(a){for(var b="M"+x(a[0].x)+" "+x(a[0].y),c=1;ca.length){var b=a[1],c=a[2],d=a[3];a=a[4]||"";return"#"+b+b+c+c+d+d+a+a}if(7==a.length||8=c?c*(b+1):c+b-c*b;c=2*c-b;return"#"+J(c,b,6*a+2)+J(c,b,6*a)+J(c,b,6*a-2)},i:function(a,b,c){var d=[.55,.5,.5,.46,.6,.55,.55][6*a+.5|0];return w.P(a,b,.5>c?c*d*2:d+(c-.5)*(1-d)*2)}};B.prototype={l:function(a,b,c,d){var f=this.b+this.h,e=this.c+this.h;return 1===this.a?new F(f-b-(d||0),this.c+a):2=== +this.a?new F(f-a-(c||0),e-b-(d||0)):3===this.a?new F(this.b+b,e-a-(c||0)):new F(this.b+a,this.c+b)}};B.a=new B(0,0,0,0);u.drawIcon=function(a,b,c,d){if(!a)throw Error("No canvas specified.");a=new I(a,c);L(a,z.u(b)||z.s(b),0,0,c,K(u,v,d,0))};u.toSvg=function(a,b,c){var d=new Q(b),f=new H(d);L(f,z.u(a)||z.s(a),0,0,b,K(u,v,c,.08));return d.toString()};u.update=D;u.version="2.2.0";E&&(E.fn.jdenticon=function(a,b){this.each(function(c,d){D(d,a,b)});return this});"function"===typeof setTimeout&&setTimeout(X, +0);return u}); +//# sourceMappingURL=jdenticon.min.js.map + +//# sourceMappingURL=jdenticon-2.2.0.min.js.map From 2dde93b953bce1e6c8175d4b4672c7a17fe49e6e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 4 Dec 2019 15:57:21 +0800 Subject: [PATCH 125/247] WIP : Dark Theme support for ComboBox --- .../addins/client/AddinsDarkThemeLoader.java | 33 ++++++++++++ .../bubble/MaterialBubbleClientBundle.java | 3 ++ .../bubble/MaterialBubbleDarkTheme.java | 30 +++++++++++ .../MaterialBubbleDebugClientBundle.java | 3 ++ .../MaterialComboBoxClientBundle.java | 2 + .../combobox/MaterialComboBoxDarkTheme.java | 30 +++++++++++ .../MaterialComboBoxDebugClientBundle.java | 3 ++ .../bubble/resources/css/bubble-dark.css | 18 +++++++ .../bubble/resources/css/bubble-dark.min.css | 1 + .../client/bubble/resources/css/bubble.css | 6 ++- .../bubble/resources/css/bubble.min.css | 2 +- .../combobox/resources/css/select2-dark.css | 52 +++++++++++++++++++ .../resources/css/select2-dark.min.css | 1 + .../client/combobox/resources/css/select2.css | 13 +++++ .../combobox/resources/css/select2.min.css | 2 +- .../resources/js/pwd-strength-meter.js | 3 +- .../resources/js/pwd-strength-meter.min.js | 2 +- 17 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java create mode 100644 src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java create mode 100644 src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.min.css create mode 100644 src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java new file mode 100644 index 000000000..eb172d40f --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java @@ -0,0 +1,33 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client; + +import gwt.material.design.addins.client.bubble.MaterialBubbleDarkTheme; +import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; +import gwt.material.design.client.theme.dark.DarkThemeLoader; + +// TODO: Fixed Conflict with static imports of Light Mode Css resource +public class AddinsDarkThemeLoader extends DarkThemeLoader { + + public AddinsDarkThemeLoader() { + super(new MaterialBubbleDarkTheme(), + new MaterialComboBoxDarkTheme()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleClientBundle.java b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleClientBundle.java index ab4b5068c..e1cea3b74 100644 --- a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleClientBundle.java @@ -37,4 +37,7 @@ interface MaterialBubbleClientBundle extends ClientBundle { @Source("resources/css/bubble.min.css") TextResource bubbleCss(); + + @Source("resources/css/bubble-dark.min.css") + TextResource bubbleDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java new file mode 100644 index 000000000..b2ec765d3 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java @@ -0,0 +1,30 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.bubble; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.client.theme.dark.DarkThemeLoader; + +public class MaterialBubbleDarkTheme extends DarkThemeLoader { + + public MaterialBubbleDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialBubbleDebugClientBundle.INSTANCE.bubbleDarkDebugCss() : MaterialBubbleClientBundle.INSTANCE.bubbleDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDebugClientBundle.java index 0ca9f634b..4a66af945 100644 --- a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDebugClientBundle.java @@ -37,4 +37,7 @@ interface MaterialBubbleDebugClientBundle extends ClientBundle { @Source("resources/css/bubble.css") TextResource bubbleCssDebug(); + + @Source("resources/css/bubble-dark.css") + TextResource bubbleDarkDebugCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxClientBundle.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxClientBundle.java index e38045bf1..3f4023588 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxClientBundle.java @@ -38,4 +38,6 @@ public interface MaterialComboBoxClientBundle extends ClientBundle { @Source("resources/css/select2.min.css") TextResource select2Css(); + @Source("resources/css/select2-dark.min.css") + TextResource select2DarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java new file mode 100644 index 000000000..914f58fb2 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java @@ -0,0 +1,30 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.combobox; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.client.theme.dark.DarkThemeLoader; + +public class MaterialComboBoxDarkTheme extends DarkThemeLoader { + + public MaterialComboBoxDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialComboBoxDebugClientBundle.INSTANCE.select2DarkDebugCss() : MaterialComboBoxClientBundle.INSTANCE.select2DarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDebugClientBundle.java index fc2570c7f..058b6290d 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDebugClientBundle.java @@ -37,4 +37,7 @@ public interface MaterialComboBoxDebugClientBundle extends ClientBundle { @Source("resources/css/select2.css") TextResource select2DebugCss(); + + @Source("resources/css/select2-dark.css") + TextResource select2DarkDebugCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.css b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.css new file mode 100644 index 000000000..21b6bb8fc --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.css @@ -0,0 +1,18 @@ +.bubble { + background: #424242; + color: #ffffff; +} + +.bubble .triangle.left { + border-right-color: #424242; +} +.bubble .triangle.right { + border-left-color: #424242; +} +.bubble .triangle.top { + border-bottom-color: #424242; +} + +.bubble .triangle.bottom { + border-top-color: #424242; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.min.css b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.min.css new file mode 100644 index 000000000..5d7e8564f --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble-dark.min.css @@ -0,0 +1 @@ +.bubble{background:#424242;color:#fff}.bubble .triangle.left{border-right-color:#424242}.bubble .triangle.right{border-left-color:#424242}.bubble .triangle.top{border-bottom-color:#424242}.bubble .triangle.bottom{border-top-color:#424242} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.css b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.css index ef7581e97..336cac15b 100644 --- a/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.css +++ b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.css @@ -1,7 +1,7 @@ .bubble{ margin-left: 60px; float: left; - background: #fff; + background: #f3f3f3; color: #263238; position: relative; margin: 8px 0 15px 0; @@ -24,17 +24,21 @@ .triangle.right{ top: 15px; right: -12px; + border-left-color: #f3f3f3; } .triangle.left{ top: 15px; left: -12px; + border-right-color: #f3f3f3; } .triangle.top, .triangle.bottom{ left: calc(50% - 4px); } .triangle.top{ top: -12px; + border-bottom-color: #f3f3f3; } .triangle.bottom{ bottom: -12px; + border-top-color: #f3f3f3; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.min.css b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.min.css index 5f6af33ae..06d4bf131 100644 --- a/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.min.css +++ b/src/main/resources/gwt/material/design/addins/client/bubble/resources/css/bubble.min.css @@ -1 +1 @@ -.bubble{margin-left: 60px; float: left; background: #fff; color: #263238; position: relative; margin: 8px 0 15px 0; height: auto; padding: 8px 10px; display: block; word-wrap: break-word; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; z-index: 1; font-size: 0.9rem; } .triangle{position: absolute; z-index: 998; border: 6px solid transparent; opacity: 0.8; } .triangle.right{top: 15px; right: -12px; } .triangle.left{top: 15px; left: -12px; } .triangle.top, .triangle.bottom{left: calc(50% - 4px); } .triangle.top{top: -12px; } .triangle.bottom{bottom: -12px; } \ No newline at end of file +.bubble{margin-left:60px;float:left;background:#f3f3f3;color:#263238;position:relative;margin:8px 0 15px 0;height:auto;padding:8px 10px;display:block;word-wrap:break-word;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;z-index:1;font-size:.9rem}.triangle{position:absolute;z-index:998;border:6px solid transparent;opacity:.8}.triangle.right{top:15px;right:-12px;border-left-color:#d0d0d0}.triangle.left{top:15px;left:-12px;border-right-color:#d0d0d0}.triangle.bottom,.triangle.top{left:calc(50% - 4px)}.triangle.top{top:-12px;border-bottom-color:#d0d0d0}.triangle.bottom{bottom:-12px;border-top-color:#d0d0d0} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css new file mode 100644 index 000000000..47001d088 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css @@ -0,0 +1,52 @@ +span.select2-dropdown { + background-color: #2f2f2f; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #fff; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #1e1e1e; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected=false], div.tagsinput span.tag { + background-color: #353535; +} + +.input-field.combobox .select2-container--focus .select2-selection { + border-bottom: 1px solid #BB86FC; + box-shadow: 0 1px 0 0 #BB86FC; +} + +.input-field input[type=search]:focus { + background-color: transparent; + border-bottom: none !important; + box-shadow: none !important; +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after { + border: 2px solid #BB86FC; + background-color: #BB86FC; +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before { + border-right: 2px solid #000000; + border-bottom: 2px solid #000000; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #2f2f2f; + color: #ffffff; +} + +.select2-container--disabled .select2-selection__rendered, +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #ffffff !important; +} + +.select2-container--disabled .select2-selection__rendered {} + +.select2-container--default.select2-container--disabled .select2-selection--single { + border-bottom: 1px dotted rgba(255,255,255,.26) !important; +} diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css new file mode 100644 index 000000000..af72d2474 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css @@ -0,0 +1 @@ +span.select2-dropdown{background-color:#2f2f2f}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#1e1e1e}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#353535} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 1e3f837e6..6c22c0fb9 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -788,6 +788,11 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio z-index: 1 } +.select2-container--default .select2-results__group { + opacity: 0.6; + font-size: 1em; +} + /** Aligned Label **/ .input-field.aligned-label.combobox .select2-container { width: 70% !important; @@ -800,6 +805,14 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio font-size: 1em !important } +/** Disabled **/ +.input-field.combobox .select2-container--focus .select2-selection, +.select2-container--default.select2-container--disabled .select2-selection--single { + color: rgba(0,0,0,.26); + border-bottom: 1px dotted rgba(0,0,0,.26); + box-shadow: none !important; +} + /** Outlined **/ .input-field.outlined.combobox .select2-selection { border: 1px solid #e9e9e9; diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 2013eee84..bbfb47e84 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1 +1 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{min-height:52px;user-select:none;-webkit-user-select:none}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px;position:absolute;top:1px;right:1px;width:20px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #F44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox .select2-container.select2-container--disabled{background:0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection{border:none}.input-field.combobox select.disabled+span+label.required:before,.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{padding:1rem;min-height:52px}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c transparent!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7 transparent!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default .select2-selection--single .select2-selection__arrow{position:absolute;top:1px;right:1px;width:20px}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.select2-container--default .select2-results__group{opacity:.6;font-size:1em}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.combobox .select2-container--focus .select2-selection,.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26);box-shadow:none!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #f44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox .select2-container.select2-container--disabled{background:0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection{border:none}.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none}.input-field.combobox select.disabled+span+label.required:before{display:none} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js index 86f5e8eec..2e03344b0 100644 --- a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.js @@ -94,9 +94,10 @@ // Update Progress var color; _progressFill.style.width = percent + "%"; - if (percent > 0 && percent <= 25) { + if (percent >= 0 && percent <= 25) { color = options.progress.color.weak; _progressLabel.innerText = options.label.weak; + _progressFill.style.width = "25%"; } else if (percent > 25 && percent <= 50) { color = options.progress.color.fair; _progressLabel.innerText = options.label.fair; diff --git a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js index 93af3b84d..5f1fdd628 100644 --- a/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js +++ b/src/main/resources/gwt/material/design/incubator/client/password/resources/js/pwd-strength-meter.min.js @@ -1 +1 @@ -!function(e){var t,n,r,s,a,o,l,d;e.fn.extend({pwdstrength:function(c){var p=this,g={url:location.origin+"/pwd/strength/",limit:4,showSuggestions:!0,label:{strength:"Password Strength",weak:"Weak",fair:"Fair",good:"Good",strong:"Strong"},progress:{width:"100%",height:"8px",color:{weak:"#f44336",fair:"#ffc107",good:"#2196f3",strong:"#4caf50"}}};c=e.extend(g,c),(t=document.createElement("div")).classList.add("pwd-strength-meter"),p.parent().append(t),(n=document.createElement("div")).classList.add("row"),n.classList.add("label-container"),t.append(n),(r=document.createElement("span")).innerHTML=c.label.strength,r.classList.add("strength-label"),n.append(r),(s=document.createElement("span")).classList.add("progress-label"),n.append(s),(a=document.createElement("div")).classList.add("progress"),a.style.height=c.progress.height,(o=document.createElement("div")).classList.add("determinate"),a.append(o),t.append(a),(l=document.createElement("ul")).classList.add("pwd-suggestions"),t.append(l),(d=document.createElement("span")).classList.add("pwd-error-label"),t.append(d),p.on("change keyup paste blur",function(){var t=p.val(),n=c.url+c.limit;e.ajax({type:"POST",contentType:"application/json",url:n,data:t,dataType:"json",success:function(e){var t,n=e.percent,r=e.suggestions;if(o.style.width=n+"%",n>0&&n<=25?(t=c.progress.color.weak,s.innerText=c.label.weak):n>25&&n<=50?(t=c.progress.color.fair,s.innerText=c.label.fair):n>50&&n<=75?(t=c.progress.color.good,s.innerText=c.label.good):n>75&&n<=100?(t=c.progress.color.strong,s.innerText=c.label.strong):s.innerText="",s.style.color=t,o.style.backgroundColor=t,c.showSuggestions)for(l.innerHTML="",i=0;i"+d+"",l.append(a)}else l.remove()},error:function(e,t,n){d.innerHTML=n}}),""===t&&e(p).reset()})},destroy:function(){t.remove()},reset:function(){d.innerHTML="",l.innerHTML="",s.innerText="",o.style.width="0%"}})}(jQuery); \ No newline at end of file +!function(e){var t,n,r,s,a,o,l,d;e.fn.extend({pwdstrength:function(c){var p=this,g={url:location.origin+"/pwd/strength/",limit:4,showSuggestions:!0,label:{strength:"Password Strength",weak:"Weak",fair:"Fair",good:"Good",strong:"Strong"},progress:{width:"100%",height:"8px",color:{weak:"#f44336",fair:"#ffc107",good:"#2196f3",strong:"#4caf50"}}};c=e.extend(g,c),(t=document.createElement("div")).classList.add("pwd-strength-meter"),p.parent().append(t),(n=document.createElement("div")).classList.add("row"),n.classList.add("label-container"),t.append(n),(r=document.createElement("span")).innerHTML=c.label.strength,r.classList.add("strength-label"),n.append(r),(s=document.createElement("span")).classList.add("progress-label"),n.append(s),(a=document.createElement("div")).classList.add("progress"),a.style.height=c.progress.height,(o=document.createElement("div")).classList.add("determinate"),a.append(o),t.append(a),(l=document.createElement("ul")).classList.add("pwd-suggestions"),t.append(l),(d=document.createElement("span")).classList.add("pwd-error-label"),t.append(d),p.on("change keyup paste blur",function(){var t=p.val(),n=c.url+c.limit;e.ajax({type:"POST",contentType:"application/json",url:n,data:t,dataType:"json",success:function(e){var t,n=e.percent,r=e.suggestions;if(o.style.width=n+"%",n>=0&&n<=25?(t=c.progress.color.weak,s.innerText=c.label.weak,o.style.width="25%"):n>25&&n<=50?(t=c.progress.color.fair,s.innerText=c.label.fair):n>50&&n<=75?(t=c.progress.color.good,s.innerText=c.label.good):n>75&&n<=100?(t=c.progress.color.strong,s.innerText=c.label.strong):s.innerText="",s.style.color=t,o.style.backgroundColor=t,c.showSuggestions)for(l.innerHTML="",i=0;i"+d+"",l.append(a)}else l.remove()},error:function(e,t,n){d.innerHTML=n}}),""===t&&e(p).reset()})},destroy:function(){t.remove()},reset:function(){d.innerHTML="",l.innerHTML="",s.innerText="",o.style.width="0%"}})}(jQuery); \ No newline at end of file From 01f26f2008b16de69b1e9e89fe35dd2d561e4b12 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 7 Dec 2019 13:13:23 +0800 Subject: [PATCH 126/247] More updates --- .../client/base/constants/AddinsCssName.java | 2 + .../addins/client/bubble/MaterialBubble.java | 8 +- .../bubble/MaterialBubbleDarkTheme.java | 4 +- .../client/combobox/MaterialComboBox.java | 4 +- .../combobox/MaterialComboBoxDarkTheme.java | 4 +- .../{ => dark}/AddinsDarkThemeLoader.java | 7 +- .../client/dark/AddinsDarkThemeReloader.java | 45 + .../client/dark/AddinsWidgetDarkTheme.java | 44 + .../client/range/ContinuousRangeSlider.java | 130 + .../ContinuousRangeSliderClientBundle.java | 41 + ...ontinuousRangeSliderDebugClientBundle.java | 40 + .../range/ContinuousRangeSliderType.java | 44 + .../client/range/js/JsContinuousRange.java | 42 + .../client/timepicker/MaterialTimePicker.java | 3 + .../MaterialTimePickerClientBundle.java | 3 + .../MaterialTimePickerDarkTheme.java | 31 + .../MaterialTimePickerDebugClientBundle.java | 3 + .../combobox/resources/css/select2-dark.css | 24 + .../resources/css/select2-dark.min.css | 2 +- .../client/combobox/resources/css/select2.css | 29 +- .../combobox/resources/css/select2.min.css | 900 +++- .../range/resources/css/continuous-range.css | 156 + .../resources/css/continuous-range.min.css | 1 + .../range/resources/js/continuous-range.js | 172 + .../resources/js/continuous-range.min.js | 1 + .../resources/css/timepicker-dark.css | 43 + .../resources/css/timepicker-dark.min.css | 1 + .../resources/css/fontawesome-all.css | 3932 ----------------- .../resources/css/fontawesome-all.min.css | 3932 ----------------- .../incubator/public/css/fontawesome-all.css | 3 +- .../public/css/fontawesome-all.min.css | 2 +- 31 files changed, 1772 insertions(+), 7881 deletions(-) rename src/main/java/gwt/material/design/addins/client/{ => dark}/AddinsDarkThemeLoader.java (82%) create mode 100644 src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeReloader.java create mode 100644 src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java create mode 100644 src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java create mode 100644 src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderClientBundle.java create mode 100644 src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderType.java create mode 100644 src/main/java/gwt/material/design/addins/client/range/js/JsContinuousRange.java create mode 100644 src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.css create mode 100644 src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.min.css create mode 100644 src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js create mode 100644 src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js create mode 100644 src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css delete mode 100644 src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css delete mode 100644 src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css diff --git a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java index f7f570d64..754416b26 100644 --- a/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java +++ b/src/main/java/gwt/material/design/addins/client/base/constants/AddinsCssName.java @@ -124,4 +124,6 @@ public interface AddinsCssName { String BRIDGE_PATH = "bridge-path"; String INTERACT_IGNORED_CONTENT = "interact-ignored-content"; String FIXED_STEP_WIDTH = "fixed-step-width"; + String CONTINUOUS_SLIDER = "rkmd-slider slider-continuous"; + } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubble.java b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubble.java index bd9b804b6..aea53bd7d 100644 --- a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubble.java +++ b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubble.java @@ -23,6 +23,8 @@ import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; import gwt.material.design.addins.client.bubble.js.JsBubbleOptions; +import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.HasPosition; import gwt.material.design.client.base.JsLoader; @@ -105,6 +107,7 @@ protected void onLoad() { @Override public void load() { $(getElement()).bubble(options); + AddinsDarkThemeReloader.get().reload(MaterialBubbleDarkTheme.class); } @Override @@ -115,7 +118,8 @@ protected void onUnload() { } @Override - public void unload() {} + public void unload() { + } @Override public void reload() { @@ -152,4 +156,4 @@ protected CssNameMixin getPositionMixin() { } return positionMixin; } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java index b2ec765d3..40ab0b79a 100644 --- a/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/bubble/MaterialBubbleDarkTheme.java @@ -20,9 +20,9 @@ package gwt.material.design.addins.client.bubble; import gwt.material.design.addins.client.MaterialAddins; -import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; -public class MaterialBubbleDarkTheme extends DarkThemeLoader { +public class MaterialBubbleDarkTheme extends AddinsWidgetDarkTheme { public MaterialBubbleDarkTheme() { super(MaterialAddins.isDebug() ? MaterialBubbleDebugClientBundle.INSTANCE.bubbleDarkDebugCss() : MaterialBubbleClientBundle.INSTANCE.bubbleDarkCss()); diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 8493d2af0..96de1a3af 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -39,6 +39,7 @@ import gwt.material.design.addins.client.combobox.js.LanguageOptions; import gwt.material.design.addins.client.combobox.js.options.Data; import gwt.material.design.addins.client.combobox.js.options.Params; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.async.AsyncWidgetCallback; import gwt.material.design.client.async.IsAsyncWidget; @@ -95,7 +96,7 @@ */ //@formatter:on public class MaterialComboBox extends AbstractValueWidget> implements JsLoader, HasPlaceholder, - HasComboBoxHandlers, HasReadOnly, HasFieldTypes, IsAsyncWidget> { + HasComboBoxHandlers, HasReadOnly, HasFieldTypes, IsAsyncWidget> { static { if (MaterialAddins.isDebug()) { @@ -215,6 +216,7 @@ public void load() { } getStatusTextMixin().getStatusDisplayMixin().setContainer(new MaterialWidget($(getElement()))); + AddinsDarkThemeReloader.get().reload(MaterialComboBoxDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java index 914f58fb2..45e523ea0 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBoxDarkTheme.java @@ -20,9 +20,9 @@ package gwt.material.design.addins.client.combobox; import gwt.material.design.addins.client.MaterialAddins; -import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; -public class MaterialComboBoxDarkTheme extends DarkThemeLoader { +public class MaterialComboBoxDarkTheme extends AddinsWidgetDarkTheme { public MaterialComboBoxDarkTheme() { super(MaterialAddins.isDebug() ? MaterialComboBoxDebugClientBundle.INSTANCE.select2DarkDebugCss() : MaterialComboBoxClientBundle.INSTANCE.select2DarkCss()); diff --git a/src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java similarity index 82% rename from src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java rename to src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index eb172d40f..70826b695 100644 --- a/src/main/java/gwt/material/design/addins/client/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -17,17 +17,18 @@ * limitations under the License. * #L% */ -package gwt.material.design.addins.client; +package gwt.material.design.addins.client.dark; import gwt.material.design.addins.client.bubble.MaterialBubbleDarkTheme; import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; +import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; -// TODO: Fixed Conflict with static imports of Light Mode Css resource public class AddinsDarkThemeLoader extends DarkThemeLoader { public AddinsDarkThemeLoader() { super(new MaterialBubbleDarkTheme(), - new MaterialComboBoxDarkTheme()); + new MaterialComboBoxDarkTheme(), + new MaterialTimePickerDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeReloader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeReloader.java new file mode 100644 index 000000000..f87ca94ec --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeReloader.java @@ -0,0 +1,45 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.dark; + +import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.client.theme.dark.DarkThemeManager; + +public class AddinsDarkThemeReloader { + + static AddinsDarkThemeReloader instance; + + public void reload(Class widgetLoader) { + DarkThemeLoader addinsLoader = DarkThemeManager.get().getLoader(AddinsDarkThemeLoader.class); + if (addinsLoader != null) { + DarkThemeLoader child = addinsLoader.getChild(widgetLoader); + if (child != null && child instanceof AddinsWidgetDarkTheme) { + ((AddinsWidgetDarkTheme) child).suppressReload(); + } + } + } + + public static AddinsDarkThemeReloader get() { + if (instance == null) { + instance = new AddinsDarkThemeReloader(); + } + return instance; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java new file mode 100644 index 000000000..1c8f3504f --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java @@ -0,0 +1,44 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.dark; + +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.client.theme.dark.DarkThemeLoader; + +public class AddinsWidgetDarkTheme extends DarkThemeLoader { + + private boolean suppressReload; + + public AddinsWidgetDarkTheme(TextResource resource) { + super(resource, false); + } + + public void suppressReload() { + if (!suppressReload) { + setInjectResource(true); + reload(); + suppressReload = true; + } + } + + public boolean isSuppressReload() { + return suppressReload; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java new file mode 100644 index 000000000..24fe5246c --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java @@ -0,0 +1,130 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.range; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.range.js.JsContinuousRange; +import gwt.material.design.client.MaterialDesign; +import gwt.material.design.client.base.HasType; +import gwt.material.design.client.base.mixin.CssTypeMixin; +import gwt.material.design.client.ui.MaterialPanel; +import gwt.material.design.client.ui.MaterialRange; +import gwt.material.design.jquery.client.api.JQueryElement; + +import static gwt.material.design.jquery.client.api.JQuery.$; + + +public class ContinuousRangeSlider extends MaterialRange implements HasType { + + static { + if (MaterialAddins.isDebug()) { + MaterialDesign.injectCss(ContinuousRangeSliderDebugClientBundle.INSTANCE.continuousRangeCss()); + MaterialDesign.injectDebugJs(ContinuousRangeSliderDebugClientBundle.INSTANCE.continuousRangeJs()); + + } else { + MaterialDesign.injectCss(ContinuousRangeSliderClientBundle.INSTANCE.continuousRangeCss()); + MaterialDesign.injectDebugJs(ContinuousRangeSliderDebugClientBundle.INSTANCE.continuousRangeJs()); + } + } + + protected CssTypeMixin typeMixin; + + public ContinuousRangeSlider() { + super(); + } + + @Override + protected void onLoad() { + super.onLoad(); + + setType(ContinuousRangeSliderType.SCALE); + $(getElement()).on("slider-change", (event, o) -> { + setValue(Integer.parseInt(getRangeInputElement().getValue()), true, false); + return true; + }); + getThumb().removeFromParent(); + updateClassName(false); + JsContinuousRange.$(getRangeContainer().getElement()).rkmd_rangeSlider(); + } + + @Override + protected void onUnload() { + super.onUnload(); + + updateClassName(true); + } + + protected void updateClassName(boolean remove) { + String styleName = AddinsCssName.CONTINUOUS_SLIDER; + MaterialPanel rangeContainer = getRangeContainer(); + if (rangeContainer != null && rangeContainer.isAttached()) { + if (remove) { + if (rangeContainer.getElement().hasClassName(styleName)) { + rangeContainer.removeStyleName(styleName); + } + } else { + if (!rangeContainer.getElement().hasClassName(styleName)) { + rangeContainer.addStyleName(styleName); + } + } + } + } + + @Override + public void setType(ContinuousRangeSliderType type) { + getTypeMixin().setType(type); + } + + @Override + public void setValue(Integer value, boolean fireEvents) { + super.setValue(value, fireEvents); + updateDom(value); + } + + public void setValue(Integer value, boolean fireEvents, boolean updateDom) { + if (updateDom) { + updateDom(value); + } + super.setValue(value, fireEvents); + } + + protected void updateDom(Integer value) { + JQueryElement sliderFill = $(getElement()).find(".slider-fill"); + JQueryElement sliderHandler = $(getElement()).find(".slider-handle"); + double percent = (value * 1.0 / getMax()) * 100; + if (sliderFill != null && sliderHandler != null) { + sliderFill.css("width", percent + "%"); + sliderHandler.css("left", percent + "%"); + } + } + + @Override + public ContinuousRangeSliderType getType() { + return getTypeMixin().getType(); + } + + public CssTypeMixin getTypeMixin() { + if (typeMixin == null) { + typeMixin = new CssTypeMixin<>(this, getRangeContainer()); + } + return typeMixin; + } +} diff --git a/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderClientBundle.java b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderClientBundle.java new file mode 100644 index 000000000..449353825 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderClientBundle.java @@ -0,0 +1,41 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.range; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +/** + * Client Bundle for PathAnimator component + * + * @author kevzlou7979 + */ +interface ContinuousRangeSliderClientBundle extends ClientBundle { + + ContinuousRangeSliderClientBundle INSTANCE = GWT.create(ContinuousRangeSliderClientBundle.class); + + @Source("resources/js/continuous-range.min.js") + TextResource continuousRangeJs(); + + + @Source("resources/css/continuous-range.min.css") + TextResource continuousRangeCss(); +} diff --git a/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderDebugClientBundle.java new file mode 100644 index 000000000..aea7b8aff --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderDebugClientBundle.java @@ -0,0 +1,40 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.range; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +/** + * Client Bundle for PathAnimator component + * + * @author kevzlou7979 + */ +interface ContinuousRangeSliderDebugClientBundle extends ClientBundle { + + ContinuousRangeSliderDebugClientBundle INSTANCE = GWT.create(ContinuousRangeSliderDebugClientBundle.class); + + @Source("resources/js/continuous-range.js") + TextResource continuousRangeJs(); + + @Source("resources/css/continuous-range.css") + TextResource continuousRangeCss(); +} diff --git a/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderType.java b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderType.java new file mode 100644 index 000000000..06516fcd8 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSliderType.java @@ -0,0 +1,44 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.range; + +import gwt.material.design.client.base.helper.EnumHelper; +import gwt.material.design.client.constants.CssType; + +public enum ContinuousRangeSliderType implements CssType { + DEFAULT(""), + SCALE("slider-scale"), + SHADOW("slider-shadow"); + + private final String cssClass; + + ContinuousRangeSliderType(final String cssClass) { + this.cssClass = cssClass; + } + + @Override + public String getCssName() { + return cssClass; + } + + public static ContinuousRangeSliderType fromStyleName(final String styleName) { + return EnumHelper.fromStyleName(styleName, ContinuousRangeSliderType.class, DEFAULT); + } + } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/range/js/JsContinuousRange.java b/src/main/java/gwt/material/design/addins/client/range/js/JsContinuousRange.java new file mode 100644 index 000000000..5a488d956 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/range/js/JsContinuousRange.java @@ -0,0 +1,42 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.range.js; + +import com.google.gwt.dom.client.Element; +import gwt.material.design.jquery.client.api.JQueryElement; +import jsinterop.annotations.JsMethod; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType(isNative = true) +public class JsContinuousRange { + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsContinuousRange $(JQueryElement element); + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsContinuousRange $(Element element); + + @JsMethod(name = "$", namespace = JsPackage.GLOBAL) + public static native JsContinuousRange $(String selector); + + @JsMethod + public native JQueryElement rkmd_rangeSlider(); +} diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java index b4266256e..f72dd6341 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePicker.java @@ -30,6 +30,8 @@ import com.google.gwt.user.client.DOM; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.timepicker.js.JsTimePicker; import gwt.material.design.addins.client.timepicker.js.JsTimePickerOptions; import gwt.material.design.client.MaterialDesignBase; @@ -139,6 +141,7 @@ public void load() { registerHandler(addOrientationChangeHandler(event -> { JsTimePicker.$(timeInput.getElement()).lolliclock("setOrientation", event.getOrientation().getCssName()); })); + AddinsDarkThemeReloader.get().reload(MaterialTimePickerDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerClientBundle.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerClientBundle.java index 50541eeb8..5d98beaa0 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerClientBundle.java @@ -37,4 +37,7 @@ interface MaterialTimePickerClientBundle extends ClientBundle { @Source("resources/css/timepicker.min.css") TextResource timepickerCss(); + + @Source("resources/css/timepicker-dark.min.css") + TextResource timepickerDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java new file mode 100644 index 000000000..669dc3d34 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java @@ -0,0 +1,31 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.timepicker; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialTimePickerDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialTimePickerDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialTimePickerDebugClientBundle.INSTANCE.timepickerDarkCssDebug() : + MaterialTimePickerClientBundle.INSTANCE.timepickerDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDebugClientBundle.java index a8a2b6440..562bedbdc 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDebugClientBundle.java @@ -37,4 +37,7 @@ interface MaterialTimePickerDebugClientBundle extends ClientBundle { @Source("resources/css/timepicker.css") TextResource timepickerCssDebug(); + + @Source("resources/css/timepicker-dark.css") + TextResource timepickerDarkCssDebug(); } diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css index 47001d088..c251801ab 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.css @@ -50,3 +50,27 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio .select2-container--default.select2-container--disabled .select2-selection--single { border-bottom: 1px dotted rgba(255,255,255,.26) !important; } + +.select2-container--default .select2-search--inline .select2-search__field:focus { + background: transparent; + border-bottom: none; + box-shadow: none; +} + +/** Outlined **/ +.input-field.outlined.combobox label.select2label { + background-color: #292929; +} + +.input-field.outlined.combobox .select2-selection { + border: 1px solid #7b7b7b; +} + +/** Filled **/ +.input-field.filled.combobox .select2-container { + background: #2f2f2f; +} + +.input-field.filled.combobox .select2-container:focus { + background: #484848; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css index af72d2474..e1eee31e0 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2-dark.min.css @@ -1 +1 @@ -span.select2-dropdown{background-color:#2f2f2f}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#1e1e1e}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#353535} \ No newline at end of file +span.select2-dropdown{background-color:#2f2f2f}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#1e1e1e}.select2-container--default .select2-results__option--highlighted[aria-selected=false],div.tagsinput span.tag{background-color:#353535}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #bb86fc;box-shadow:0 1px 0 0 #bb86fc}.input-field input[type=search]:focus{background-color:transparent;border-bottom:none!important;box-shadow:none!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{border:2px solid #bb86fc;background-color:#bb86fc}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{border-right:2px solid #000;border-bottom:2px solid #000}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#2f2f2f;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove,.select2-container--disabled .select2-selection__rendered{color:#fff!important}.select2-container--default.select2-container--disabled .select2-selection--single{border-bottom:1px dotted rgba(255,255,255,.26)!important}.select2-container--default .select2-search--inline .select2-search__field:focus{background:0 0;border-bottom:none;box-shadow:none}.input-field.outlined.combobox label.select2label{background-color:#292929}.input-field.outlined.combobox .select2-selection{border:1px solid #7b7b7b}.input-field.filled.combobox .select2-container{background:#2f2f2f}.input-field.filled.combobox .select2-container:focus{background:#484848} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 6c22c0fb9..881bcd7a0 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -214,7 +214,7 @@ } .select2-container--default .select2-selection--multiple { - cursor: text + cursor: text; } .select2-container--default .select2-selection--multiple .select2-selection__rendered { @@ -245,7 +245,7 @@ cursor: default; float: left; margin-right: 5px; - margin-top: 5px + margin-top: 8px } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { @@ -278,7 +278,7 @@ -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; - border-bottom: 1px solid rgba(0, 0, 0, .14) + border-bottom: 1px solid rgba(0, 0, 0, .14); } .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single { @@ -411,6 +411,11 @@ header nav .select2-container--default .select2-selection--single .select2-selec bottom: 17px; } +.combobox.outlined .select2-container .select2-search--inline .select2-search__field { + margin-top: 8px; + margin-bottom: 0px !important; +} + .combobox .select2-container--disabled .select2-selection__arrow b { border-color: transparent transparent #c7c7c7 transparent !important; } @@ -820,6 +825,15 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio height: 3em } +.input-field.outlined.combobox .select2-container--default .select2-search--inline .select2-search__field:focus { + border: none !important; +} + +.input-field.outlined.combobox .select2-container--default .select2-selection--multiple { + height: auto; + padding-left: 20px; +} + .input-field.outlined.combobox label.select2label { top: 16px; margin-left: 8px; @@ -853,6 +867,10 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio box-shadow: none; } +.input-field.outlined.combobox .select2-container--default .select2-selection--multiple{ + padding-left: 12px !important; +} + /** Filled **/ .input-field.filled.combobox .select2-container { background: rgba(0, 0, 0, .04); @@ -864,13 +882,18 @@ ul.select2-results__options[aria-multiselectable=true] li.select2-results__optio } .input-field.filled.combobox label.select2label { + margin-top: 14px; margin-left: 12px } +.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered, .input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { padding-left: 12px; padding-top: 4px } +.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered { + padding-top: 12px; +} /** Focus **/ .input-field.combobox .select2-container--focus .select2-selection { diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index bbfb47e84..45e9fd3b7 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1 +1,899 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{padding:1rem;min-height:52px}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c transparent!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7 transparent!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default .select2-selection--single .select2-selection__arrow{position:absolute;top:1px;right:1px;width:20px}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.select2-container--default .select2-results__group{opacity:.6;font-size:1em}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.combobox .select2-container--focus .select2-selection,.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26);box-shadow:none!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #f44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox .select2-container.select2-container--disabled{background:0 0}.input-field.filled.combobox label.select2label{margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection{border:none}.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none}.input-field.combobox select.disabled+span+label.required:before{display:none} \ No newline at end of file +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle +} + +.select2 { + width: 100% !important +} + +.select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none +} + +.select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.select2-container .select2-selection--single .select2-selection__clear { + position: relative +} + +.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px +} + +.select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none +} + +.select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap +} + +.select2-container .select2-search--inline { + float: left +} + +.select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; + width: inherit !important; + padding-left: 0 !important +} + +.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none +} + +.select2-dropdown { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051 +} + +.select2-results { + display: block +} + +.select2-results__option { + padding: 1rem; + min-height: 52px +} + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0 +} + +.select2-results__option { + user-select: none; + -webkit-user-select: none +} + +.select2-results__option[aria-selected] { + cursor: pointer +} + +.select2-container--open .select2-dropdown { + left: 0 +} + +.select2-container--open .select2-dropdown--above { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.select2-container--open .select2-dropdown--below { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.select2-search--dropdown { + display: block; + padding: 0 +} + +.select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; + margin-bottom: 0 +} + +.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none +} + +.select2-search--dropdown.select2-search--hide { + display: none +} + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff +} + +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear, .select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none +} + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important +} + +.select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444 +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-size: 2em; + font-weight: 400; + color: #b5b5b5 +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #ccc +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + color: rgba(0, 0, 0, .3); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + border-bottom: 1px solid rgba(0, 0, 0, .14) +} + +.select2-container--disabled .select2-selection__rendered { + color: rgba(0, 0, 0, .4) !important +} + +.select2-container--default .select2-selection--multiple { + cursor: text +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0; + width: 100% +} + +.select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #ccc; + margin-top: 5px; + float: left +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + margin-top: 0; + margin-right: 10px; + font-size: 2em; + margin-bottom: -4px; + color: #9e9e9e !important +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + cursor: default; + float: left; + margin-right: 5px; + margin-top: 8px +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + font-size: 20px; + font-weight: 300; + float: right; + color: rgba(0, 0, 0, .6); + line-height: 28px; + padding-left: 8px; + cursor: pointer +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder { + float: right +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + color: rgba(0, 0, 0, .3); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + border-bottom: 1px solid rgba(0, 0, 0, .14) +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--below .select2-selection--single { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa +} + +.select2-container--default .select2-search--inline .select2-search__field { + background: 0 0; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield +} + +.select2-container--default .select2-results__option[role=group] { + padding: 0 +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999 +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd +} + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0 +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px +} + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, #fff 50%, #eee 100%); + background-image: -o-linear-gradient(top, #fff 50%, #eee 100%); + background-image: linear-gradient(to bottom, #fff 50%, #eee 100%); + background-repeat: repeat-x +} + +.select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb +} + +.select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px +} + +.select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: 700; + margin-right: 10px +} + +.select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #ccc +} + +header nav .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent rgba(255, 255, 255, .5) !important +} + +.combobox .select2-container--open .select2-selection__arrow b, .combobox .select2-selection__arrow b { + content: ""; + position: absolute; + right: 8px; + bottom: 12px; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 12px 12px; + border-color: transparent transparent #9c9c9c transparent !important +} + +.combobox.outlined .select2-container--open .select2-selection__arrow b, .combobox.outlined .select2-selection__arrow b { + bottom: 17px +} + +.combobox.outlined .select2-container .select2-search--inline .select2-search__field { + margin-top: 8px; + margin-bottom: 0 !important +} + +.combobox .select2-container--disabled .select2-selection__arrow b { + border-color: transparent transparent #c7c7c7 transparent !important +} + +.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 4px 0 0 4px; + left: 1px; + right: auto +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 46px +} + +.read-only.combobox .select2-selection__arrow { + display: none !important +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + position: absolute; + top: 1px; + right: 1px; + width: 20px +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eee 50%, #ccc 100%); + background-image: -o-linear-gradient(top, #eee 50%, #ccc 100%); + background-image: linear-gradient(to bottom, #eee 50%, #ccc 100%); + background-repeat: repeat-x +} + +.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left +} + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, #fff 0, #eee 50%); + background-image: -o-linear-gradient(top, #fff 0, #eee 50%); + background-image: linear-gradient(to bottom, #fff 0, #eee 50%); + background-repeat: repeat-x +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eee 50%, #fff 100%); + background-image: -o-linear-gradient(top, #eee 50%, #fff 100%); + background-image: linear-gradient(to bottom, #eee 50%, #fff 100%); + background-repeat: repeat-x +} + +.select2-container--classic .select2-selection--multiple { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0 +} + +.select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb +} + +.select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px +} + +.select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: 700; + margin-right: 2px +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555 +} + +.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto +} + +.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto +} + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0 +} + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none +} + +.select2-container--classic .select2-dropdown { + background-color: #fff; + border: 1px solid transparent +} + +.select2-container--classic .select2-dropdown--above { + border-bottom: none +} + +.select2-container--classic .select2-dropdown--below { + border-top: none +} + +.select2-container--classic .select2-results__option[role=group] { + padding: 0 +} + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey +} + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: #fff +} + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px +} + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb +} + +.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single, .select2-container--default.select2-container--focus .select2-selection--multiple { + height: 46px; + border: none; + border-bottom: 1px solid #9e9e9e; + border-radius: 0; + outline: 0 +} + +.select2-container--default .select2-selection--multiple, .select2-container--default.select2-container--focus .select2-selection--multiple { + height: auto +} + +.select2-container--default .select2-search--inline .select2-search__field { + height: 30px +} + +.select2-container--default .select2-selection--multiple input { + margin: 0 +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, .6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4 +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 46px; + padding-left: 0 +} + +.select2-container--open .select2-dropdown--above, .select2-container--open .select2-dropdown--below { + border: none; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12) +} + +.select2-results__option { + padding: 1rem +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border-top: none; + border-right: none; + border-left: none +} + +.field-error.combobox, .field-success.combobox { + border: none !important; + box-shadow: none !important +} + +.field-error.combobox .select2-selection { + border-bottom: 1px solid #f44336; + box-shadow: 0 1px 0 0 #f44336 +} + +.field-success.combobox .select2-selection { + border-bottom: 1px solid #4caf50; + box-shadow: 0 1px 0 0 #4caf50 +} + +.read-only.combobox .select2-selection { + border: none !important +} + +.select2-container--default .select2-results__option--highlighted[aria-selected], div.tagsinput span.tag { + background-color: #eee; + transition: .3s ease +} + +.select2label { + left: 0 !important; + font-size: .8rem !important; + transform: translateY(-140%) +} + +.combobox { + margin-bottom: 15px +} + +.select2-container--default { + font-size: 1rem +} + +.field-success .select2label { + color: #4caf50 !important +} + +.field-error .select2label { + color: #f44336 !important +} + +.col.combobox .select2label { + left: 12px !important +} + +.read-only .select2-selection__rendered { + color: #000 !important +} + +header nav .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #fff !important +} + +header nav .select2-container--default .select2-selection--multiple, header nav .select2-container--default .select2-selection--single, header nav .select2-container--default.select2-container--focus .select2-selection--multiple { + border-bottom: none +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]) { + position: relative; + padding-left: 3rem !important +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before { + content: ''; + position: absolute; + z-index: 0; + border-radius: 1px; + transition: .2s; + margin: 1rem; + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 20% 40%; + transform-origin: 100% 100% +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0; + content: ''; + left: 0; + position: absolute; + transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s; + z-index: 1; + border-radius: 2px; + margin: 1rem +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid #26a69a; + background-color: #26a69a; + z-index: 0 +} + +ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before { + top: 2px; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + z-index: 1 +} + +.select2-container--default .select2-results__group { + opacity: .6; + font-size: 1em +} + +.input-field.aligned-label.combobox .select2-container { + width: 70% !important; + display: inline-block; + position: relative; + vertical-align: middle +} + +.input-field.aligned-label.combobox label.select2label { + font-size: 1em !important +} + +.input-field.combobox .select2-container--focus .select2-selection, .select2-container--default.select2-container--disabled .select2-selection--single { + color: rgba(0, 0, 0, .26); + border-bottom: 1px dotted rgba(0, 0, 0, .26); + box-shadow: none !important +} + +.input-field.outlined.combobox .select2-selection { + border: 1px solid #e9e9e9; + border-radius: 4px; + height: 3em +} + +.input-field.outlined.combobox .select2-container--default .select2-search--inline .select2-search__field:focus { + border: none !important +} + +.input-field.outlined.combobox .select2-container--default .select2-selection--multiple { + height: auto; + padding-left: 20px +} + +.input-field.outlined.combobox label.select2label { + top: 16px; + margin-left: 8px; + padding-left: 4px; + padding-right: 4px; + background: #fff +} + +.modal .input-field.outlined.combobox label.select2label { + background-color: #fafafa +} + +.input-field.outlined.combobox .select2-container--open .select2-selection { + border: 2px solid #42a5f5; + box-shadow: none +} + +.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { + padding-left: 12px +} + +.input-field.outlined.field-error.combobox .select2-container--open .select2-selection, .input-field.outlined.field-error.combobox .select2-selection { + border: 2px solid #f44336; + box-shadow: none +} + +.input-field.outlined.field-success.combobox .select2-container--open .select2-selection, .input-field.outlined.field-success.combobox .select2-selection { + border: 2px solid #4caf50; + box-shadow: none +} + +.input-field.outlined.combobox .select2-container--default .select2-selection--multiple { + padding-left: 12px !important +} + +.input-field.filled.combobox .select2-container { + background: rgba(0, 0, 0, .04); + border-radius: 4px 4px 0 0 +} + +.input-field.filled.combobox .select2-container.select2-container--disabled { + background: 0 0 +} + +.input-field.filled.combobox label.select2label { + margin-top: 14px; + margin-left: 12px +} + +.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered, .input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { + padding-left: 12px; + padding-top: 4px +} + +.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered { + padding-top: 12px +} + +.input-field.combobox .select2-container--focus .select2-selection { + border-bottom: 1px solid #42a5f5; + box-shadow: 0 1px 0 0 #42a5f5 +} + +.input-field.outlined.combobox .select2-container--focus .select2-selection { + border: 2px solid #42a5f5; + box-shadow: none +} + +.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection { + border: none +} + +.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow, .input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow { + display: none +} + +.input-field.combobox select.disabled + span + label.required:before { + display: none +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.css b/src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.css new file mode 100644 index 000000000..5a08b2bdd --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.css @@ -0,0 +1,156 @@ +.rkmd-slider { + display: block; + position: relative; + font-size: 16px; + font-family: 'Roboto', sans-serif; +} +.rkmd-slider input[type="range"] { + overflow: hidden; + position: absolute; + width: 1px; + height: 1px; + opacity: 0; +} +.rkmd-slider input[type="range"] + .slider { + display: block; + position: relative; + width: 100%; + height: 4px; + background-color: #bebebe; + margin: 15px 0; +} +.rkmd-slider input[type="range"] + .slider .slider-fill { + display: block; + position: absolute; + width: 0%; + height: 100%; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 1; +} +.rkmd-slider input[type="range"] + .slider .slider-handle { + cursor: pointer; + position: absolute; + top: -5.5px; + left: 0%; + width: 15px; + height: 15px; + margin-left: -8px; + border-radius: 50%; + transition: all .2s ease; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 2; +} +.rkmd-slider input[type="range"]:disabled + .slider { + background-color: #b0b0b0 !important; +} +.rkmd-slider input[type="range"]:disabled + .slider .slider-fill, +.rkmd-slider input[type="range"]:disabled + .slider .slider-handle { + cursor: default !important; + background-color: #b0b0b0 !important; +} +.rkmd-slider input[type="range"]:disabled + .slider .slider-fill .slider-label, +.rkmd-slider input[type="range"]:disabled + .slider .slider-handle .slider-label { + display: none; + background-color: #b0b0b0 !important; +} +.rkmd-slider input[type="range"]:disabled + .slider .slider-fill.is-active, +.rkmd-slider input[type="range"]:disabled + .slider .slider-handle.is-active { + top: -5.5px; + width: 15px; + height: 15px; + margin-left: -8px; +} +.rkmd-slider input[type="range"]:disabled + .slider .slider-fill.is-active .slider-label, +.rkmd-slider input[type="range"]:disabled + .slider .slider-handle.is-active .slider-label { + display: none; + border-radius: 50%; + -webkit-transform: none; + transform: none; +} +.rkmd-slider input[type="range"]:disabled + .slider .slider-handle:active { + box-shadow: none !important; + -webkit-transform: scale(1) !important; + transform: scale(1) !important; +} +.rkmd-slider.slider-light input[type="range"] + .slider { + background-color: #5c5c5c; +} +.rkmd-slider.slider-light input[type="range"]:disabled + .slider { + background-color: #5c5c5c !important; +} +.rkmd-slider.slider-light input[type="range"]:disabled + .slider .slider-fill, +.rkmd-slider.slider-light input[type="range"]:disabled + .slider .slider-handle { + background-color: #5c5c5c !important; +} + +.rkmd-slider.slider-continuous.slider-scale .slider-handle:active { + -webkit-transform: scale(1.4); + transform: scale(1.4); +} +.rkmd-slider.slider-continuous.slider-shadow .slider-handle:active { + box-shadow: 0 0 0 10px rgba(3, 169, 244, 0.26); +} + +.rkmd-slider.slider-discrete .slider .slider-handle { + position: relative; + z-index: 1; +} +.rkmd-slider.slider-discrete .slider .slider-handle .slider-label { + position: absolute; + top: -17.5px; + left: -2px; + width: 30px; + height: 30px; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + border-radius: 50%; + -webkit-transform: scale(0.5) rotate(-45deg); + transform: scale(0.5) rotate(-45deg); + transition: all .2s ease; +} +.rkmd-slider.slider-discrete .slider .slider-handle .slider-label span { + position: absolute; + top: 7px; + left: 0px; + width: 100%; + color: #fff; + font-size: 12px; + text-align: center; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.rkmd-slider.slider-discrete .slider .slider-handle.is-active { + top: 0px; + margin-left: -2px; + width: 4px; + height: 4px; +} +.rkmd-slider.slider-discrete .slider .slider-handle.is-active .slider-label { + top: -15px; + left: -2px; + border-radius: 15px 15px 15px 0; + -webkit-transform: rotate(-45deg) translate(23px, -25px); + transform: rotate(-45deg) translate(23px, -25px); +} +.rkmd-slider.slider-discrete .slider .slider-handle.is-active .slider-label span { + opacity: 1; +} +.rkmd-slider.slider-discrete .slider-label { + background-color: #03a9f4; +} + +.rkmd-slider .slider-fill, +.rkmd-slider .slider-handle { + background-color: #03a9f4; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.min.css b/src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.min.css new file mode 100644 index 000000000..f7980dfee --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/range/resources/css/continuous-range.min.css @@ -0,0 +1 @@ +.rkmd-slider{display:block;position:relative;font-size:16px;font-family:Roboto,sans-serif}.rkmd-slider input[type=range]{overflow:hidden;position:absolute;width:1px;height:1px;opacity:0}.rkmd-slider input[type=range]+.slider{display:block;position:relative;width:100%;height:4px;background-color:#bebebe;margin:15px 0}.rkmd-slider input[type=range]+.slider .slider-fill{display:block;position:absolute;width:0%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.rkmd-slider input[type=range]+.slider .slider-handle{cursor:pointer;position:absolute;top:-5.5px;left:0;width:15px;height:15px;margin-left:-8px;border-radius:50%;transition:all .2s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.rkmd-slider input[type=range]:disabled+.slider{background-color:#b0b0b0!important}.rkmd-slider input[type=range]:disabled+.slider .slider-fill,.rkmd-slider input[type=range]:disabled+.slider .slider-handle{cursor:default!important;background-color:#b0b0b0!important}.rkmd-slider input[type=range]:disabled+.slider .slider-fill .slider-label,.rkmd-slider input[type=range]:disabled+.slider .slider-handle .slider-label{display:none;background-color:#b0b0b0!important}.rkmd-slider input[type=range]:disabled+.slider .slider-fill.is-active,.rkmd-slider input[type=range]:disabled+.slider .slider-handle.is-active{top:-5.5px;width:15px;height:15px;margin-left:-8px}.rkmd-slider input[type=range]:disabled+.slider .slider-fill.is-active .slider-label,.rkmd-slider input[type=range]:disabled+.slider .slider-handle.is-active .slider-label{display:none;border-radius:50%;-webkit-transform:none;transform:none}.rkmd-slider input[type=range]:disabled+.slider .slider-handle:active{box-shadow:none!important;-webkit-transform:scale(1)!important;transform:scale(1)!important}.rkmd-slider.slider-light input[type=range]+.slider{background-color:#5c5c5c}.rkmd-slider.slider-light input[type=range]:disabled+.slider{background-color:#5c5c5c!important}.rkmd-slider.slider-light input[type=range]:disabled+.slider .slider-fill,.rkmd-slider.slider-light input[type=range]:disabled+.slider .slider-handle{background-color:#5c5c5c!important}.rkmd-slider.slider-continuous.slider-scale .slider-handle:active{-webkit-transform:scale(1.4);transform:scale(1.4)}.rkmd-slider.slider-continuous.slider-shadow .slider-handle:active{box-shadow:0 0 0 10px rgba(3,169,244,.26)}.rkmd-slider.slider-discrete .slider .slider-handle{position:relative;z-index:1}.rkmd-slider.slider-discrete .slider .slider-handle .slider-label{position:absolute;top:-17.5px;left:-2px;width:30px;height:30px;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;border-radius:50%;-webkit-transform:scale(.5) rotate(-45deg);transform:scale(.5) rotate(-45deg);transition:all .2s ease}.rkmd-slider.slider-discrete .slider .slider-handle .slider-label span{position:absolute;top:7px;left:0;width:100%;color:#fff;font-size:12px;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rkmd-slider.slider-discrete .slider .slider-handle.is-active{top:0;margin-left:-2px;width:4px;height:4px}.rkmd-slider.slider-discrete .slider .slider-handle.is-active .slider-label{top:-15px;left:-2px;border-radius:15px 15px 15px 0;-webkit-transform:rotate(-45deg) translate(23px,-25px);transform:rotate(-45deg) translate(23px,-25px)}.rkmd-slider.slider-discrete .slider .slider-handle.is-active .slider-label span{opacity:1}.rkmd-slider.slider-discrete .slider-label{background-color:#03a9f4}.rkmd-slider .slider-fill,.rkmd-slider .slider-handle{background-color:#03a9f4} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js new file mode 100644 index 000000000..47123a537 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js @@ -0,0 +1,172 @@ +/* ----------------------------------------------------- + Material Design Sliders + CodePen URL: https://codepen.io/rkchauhan/pen/xVGGpR + By: Ravikumar Chauhan + + Find me on:- + * Twitter: https://twitter.com/rkchauhan01 + * Facebook: https://www.facebook.com/ravi032chauhan + * GitHub: https://github.com/rkchauhan + * CodePen: https://codepen.io/rkchauhan + * UpLabs: http://uplabs.com/rkchauhan01 + + Thanks to:- + * Google Material design - https://www.google.com/design/spec/material-design/introduction.html + * Google Material Color - https://www.google.com/design/spec/style/color.html + * Google Material Icons - https://design.google.com/icons/ + * Roboto Font - https://google.com/fonts/specimen/Roboto + * jQuery - https://jquery.com +-------------------------------------------------------- */ +/* Range Slider Function */ +(function($) { + + $.fn.rkmd_rangeSlider = function() { + var self, slider_width, slider_offset, curnt, sliderContinuous, sliderDiscrete, range, slider; + self = $(this); + slider_width = self.outerWidth(); + slider_offset = self.offset().left; + + sliderContinuous = $('.slider-continuous'); + sliderDiscrete = $('.slider-discrete'); + + if(self.hasClass('slider-continuous') === true) { + + sliderContinuous.each(function(i, v) { + curnt = $(this); + curnt.append(sliderContinuous_tmplt()); + range = curnt.find('input[type="range"]'); + slider = curnt.find('.slider'); + slider_fill = slider.find('.slider-fill'); + slider_handle = slider.find('.slider-handle'); + max = range.attr("max"); + var range_val = (range.val() / max) * 100; + slider_fill.css('width', range_val +'%'); + slider_handle.css('left', range_val +'%'); + + }); + } + + if(self.hasClass('slider-discrete') === true) { + + sliderDiscrete.each(function(i, v) { + curnt = $(this); + curnt.append(sliderDiscrete_tmplt()); + range = curnt.find('input[type="range"]'); + slider = curnt.find('.slider'); + slider_fill = slider.find('.slider-fill'); + slider_handle = slider.find('.slider-handle'); + slider_label = slider.find('.slider-label'); + max = range.attr("max"); + var range_val = (range.val() / max) * 100; + slider_fill.css('width', range_val +'%'); + slider_handle.css('left', range_val +'%'); + slider_label.find('span').text(range_val); + }); + } + + self.on('mousedown', '.slider-handle', function(e) { + if(e.button === 2) { + return false; + } + + var parents = $(this).parents('.rkmd-slider'); + var slider_width = parents.outerWidth(); + var slider_offset = parents.offset().left; + var check_range = parents.find('input[type="range"]').is(':disabled'); + + if(check_range === true) { + return false; + } + + if(parents.hasClass('slider-discrete') === true) { + $(this).addClass('is-active'); + } + var handlers = { + mousemove: function(e) { + var slider_new_width = e.pageX - slider_offset; + + if(slider_new_width <= slider_width && !(slider_new_width < '0')) { + slider_move(parents, slider_new_width, slider_width); + } + }, + mouseup: function(e) { + $(this).off(handlers); + + if(parents.hasClass('slider-discrete') === true) { + parents.find('.is-active').removeClass('is-active'); + } + } + }; + $(document).on(handlers); + }); + + self.on('mousedown', '.slider', function(e) { + if(e.button === 2) { + return false; + } + + var parents = $(this).parents('.rkmd-slider'); + var slider_width = parents.outerWidth(); + var slider_offset = parents.offset().left; + var check_range = parents.find('input[type="range"]').is(':disabled'); + + if(check_range === true) { + return false; + } + + var slider_new_width = e.pageX - slider_offset; + if(slider_new_width <= slider_width && !(slider_new_width < '0')) { + slider_move(parents, slider_new_width, slider_width); + } + + var handlers = { + mouseup: function(e) { + $(this).off(handlers); + } + }; + $(document).on(handlers); + + }); + }; + + function sliderContinuous_tmplt() { + var tmplt = '
' + + '
' + + '
' + + '
'; + + return tmplt; + } + function sliderDiscrete_tmplt() { + var tmplt = '
' + + '
' + + '
0
' + + '
'; + + return tmplt; + } + function slider_move(parents, newW, sliderW) { + var slider_new_val = parseInt(Math.round(newW / sliderW * 100)); + + var slider_fill = parents.find('.slider-fill'); + var slider_handle = parents.find('.slider-handle'); + var range = parents.find('input[type="range"]'); + + slider_fill.css('width', slider_new_val +'%'); + slider_handle.css({ + 'left': slider_new_val +'%', + 'transition': 'none', + '-webkit-transition': 'none', + '-moz-transition': 'none' + }); + + range.val(slider_new_val); + + if(parents.hasClass('slider-discrete') === true) { + parents.find('.slider-handle span').text(slider_new_val); + } + + parents.trigger("slider-change", range.val()); + } + +}(jQuery)); diff --git a/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js new file mode 100644 index 000000000..ef2663346 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js @@ -0,0 +1 @@ +!function(i){function e(i,e,s){var d=parseInt(Math.round(e/s*100)),l=i.find(".slider-fill"),n=i.find(".slider-handle"),r=i.find('input[type="range"]');l.css("width",d+"%"),n.css({left:d+"%",transition:"none","-webkit-transition":"none","-moz-transition":"none"}),r.val(d),!0===i.hasClass("slider-discrete")&&i.find(".slider-handle span").text(d),i.trigger("slider-change",r.val())}i.fn.rkmd_rangeSlider=function(){var s,d,l,n,r,a;(s=i(this)).outerWidth(),s.offset().left,l=i(".slider-continuous"),n=i(".slider-discrete"),!0===s.hasClass("slider-continuous")&&l.each(function(e,s){(d=i(this)).append('
'),r=d.find('input[type="range"]'),a=d.find(".slider"),slider_fill=a.find(".slider-fill"),slider_handle=a.find(".slider-handle"),max=r.attr("max");var l=r.val()/max*100;slider_fill.css("width",l+"%"),slider_handle.css("left",l+"%")}),!0===s.hasClass("slider-discrete")&&n.each(function(e,s){(d=i(this)).append('
0
'),r=d.find('input[type="range"]'),a=d.find(".slider"),slider_fill=a.find(".slider-fill"),slider_handle=a.find(".slider-handle"),slider_label=a.find(".slider-label"),max=r.attr("max");var l=r.val()/max*100;slider_fill.css("width",l+"%"),slider_handle.css("left",l+"%"),slider_label.find("span").text(l)}),s.on("mousedown",".slider-handle",function(s){if(2===s.button)return!1;var d=i(this).parents(".rkmd-slider"),l=d.outerWidth(),n=d.offset().left;if(!0===d.find('input[type="range"]').is(":disabled"))return!1;!0===d.hasClass("slider-discrete")&&i(this).addClass("is-active");var r={mousemove:function(i){var s=i.pageX-n;s<=l&&!(s<"0")&&e(d,s,l)},mouseup:function(e){i(this).off(r),!0===d.hasClass("slider-discrete")&&d.find(".is-active").removeClass("is-active")}};i(document).on(r)}),s.on("mousedown",".slider",function(s){if(2===s.button)return!1;var d=i(this).parents(".rkmd-slider"),l=d.outerWidth(),n=d.offset().left;if(!0===d.find('input[type="range"]').is(":disabled"))return!1;var r=s.pageX-n;r<=l&&!(r<"0")&&e(d,r,l);var a={mouseup:function(e){i(this).off(a)}};i(document).on(a)})}}(jQuery); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css new file mode 100644 index 000000000..6f3215709 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css @@ -0,0 +1,43 @@ +.lolliclock-header { + background-color: #1e1f22 !important; +} + +.lolliclock-popover { + background-color: #2e3033; +} + +.lolliclock-plate { + background-color: #282828; +} + +.lolliclock-active-button-background { + background: #bb86fc !important; +} + +.lolliclock-btn-text { + color: #d2d2d2; +} + +.lolliclock-active-button-text { + color: #000; +} + +.lolliclock-button { + color: #bb86fc !important; +} + +.lolliclock-canvas-bg { + fill: #d6b5ff !important; +} + +.lolliclock-canvas-fg { + fill: #bb86fc !important; +} + +.lolliclock-canvas line { + stroke: white !important; +} + +.lolliclock-tick.active, .lolliclock-tick:hover { + background-color: #bb86fc !important; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css new file mode 100644 index 000000000..86fb1ac96 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css @@ -0,0 +1 @@ +.lolliclock-header{background-color:#1e1f22!important}.lolliclock-popover{background-color:#2e3033}.lolliclock-plate{background-color:#282828}.lolliclock-active-button-background{background:#bb86fc!important}.lolliclock-btn-text{color:#d2d2d2}.lolliclock-active-button-text{color:#000}.lolliclock-button{color:#bb86fc!important}.lolliclock-canvas-bg{fill:#d6b5ff!important}.lolliclock-canvas-fg{fill:#bb86fc!important}.lolliclock-canvas line{stroke:#fff!important}.lolliclock-tick.active,.lolliclock-tick:hover{background-color:#bb86fc!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css b/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css deleted file mode 100644 index 16b655e70..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.css +++ /dev/null @@ -1,3932 +0,0 @@ -/*! - * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -.fa, -.fas, -.far, -.fal, -.fab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; } - -.fa-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; } - -.fa-xs { - font-size: .75em; } - -.fa-sm { - font-size: .875em; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: 2.5em; - padding-left: 0; } -.fa-ul > li { - position: relative; } - -.fa-li { - left: -2em; - position: absolute; - text-align: center; - width: 2em; - line-height: inherit; } - -.fa-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; } - -.fa-pull-left { - float: left; } - -.fa-pull-right { - float: right; } - -.fa.fa-pull-left, -.fas.fa-pull-left, -.far.fa-pull-left, -.fal.fa-pull-left, -.fab.fa-pull-left { - margin-right: .3em; } - -.fa.fa-pull-right, -.fas.fa-pull-right, -.far.fa-pull-right, -.fal.fa-pull-right, -.fab.fa-pull-right { - margin-left: .3em; } - -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; } - -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); } - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); } - -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); } - -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); } - -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); } - -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); } - -.fa-flip-horizontal.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); } - -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - -webkit-filter: none; - filter: none; } - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2em; } - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; } - -.fa-stack-1x { - line-height: inherit; } - -.fa-stack-2x { - font-size: 2em; } - -.fa-inverse { - color: #fff; } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ -.fa-500px:before { - content: "\f26e"; } - -.fa-accessible-icon:before { - content: "\f368"; } - -.fa-accusoft:before { - content: "\f369"; } - -.fa-acquisitions-incorporated:before { - content: "\f6af"; } - -.fa-ad:before { - content: "\f641"; } - -.fa-address-book:before { - content: "\f2b9"; } - -.fa-address-card:before { - content: "\f2bb"; } - -.fa-adjust:before { - content: "\f042"; } - -.fa-adn:before { - content: "\f170"; } - -.fa-adversal:before { - content: "\f36a"; } - -.fa-affiliatetheme:before { - content: "\f36b"; } - -.fa-air-freshener:before { - content: "\f5d0"; } - -.fa-algolia:before { - content: "\f36c"; } - -.fa-align-center:before { - content: "\f037"; } - -.fa-align-justify:before { - content: "\f039"; } - -.fa-align-left:before { - content: "\f036"; } - -.fa-align-right:before { - content: "\f038"; } - -.fa-alipay:before { - content: "\f642"; } - -.fa-allergies:before { - content: "\f461"; } - -.fa-amazon:before { - content: "\f270"; } - -.fa-amazon-pay:before { - content: "\f42c"; } - -.fa-ambulance:before { - content: "\f0f9"; } - -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; } - -.fa-amilia:before { - content: "\f36d"; } - -.fa-anchor:before { - content: "\f13d"; } - -.fa-android:before { - content: "\f17b"; } - -.fa-angellist:before { - content: "\f209"; } - -.fa-angle-double-down:before { - content: "\f103"; } - -.fa-angle-double-left:before { - content: "\f100"; } - -.fa-angle-double-right:before { - content: "\f101"; } - -.fa-angle-double-up:before { - content: "\f102"; } - -.fa-angle-down:before { - content: "\f107"; } - -.fa-angle-left:before { - content: "\f104"; } - -.fa-angle-right:before { - content: "\f105"; } - -.fa-angle-up:before { - content: "\f106"; } - -.fa-angry:before { - content: "\f556"; } - -.fa-angrycreative:before { - content: "\f36e"; } - -.fa-angular:before { - content: "\f420"; } - -.fa-ankh:before { - content: "\f644"; } - -.fa-app-store:before { - content: "\f36f"; } - -.fa-app-store-ios:before { - content: "\f370"; } - -.fa-apper:before { - content: "\f371"; } - -.fa-apple:before { - content: "\f179"; } - -.fa-apple-alt:before { - content: "\f5d1"; } - -.fa-apple-pay:before { - content: "\f415"; } - -.fa-archive:before { - content: "\f187"; } - -.fa-archway:before { - content: "\f557"; } - -.fa-arrow-alt-circle-down:before { - content: "\f358"; } - -.fa-arrow-alt-circle-left:before { - content: "\f359"; } - -.fa-arrow-alt-circle-right:before { - content: "\f35a"; } - -.fa-arrow-alt-circle-up:before { - content: "\f35b"; } - -.fa-arrow-circle-down:before { - content: "\f0ab"; } - -.fa-arrow-circle-left:before { - content: "\f0a8"; } - -.fa-arrow-circle-right:before { - content: "\f0a9"; } - -.fa-arrow-circle-up:before { - content: "\f0aa"; } - -.fa-arrow-down:before { - content: "\f063"; } - -.fa-arrow-left:before { - content: "\f060"; } - -.fa-arrow-right:before { - content: "\f061"; } - -.fa-arrow-up:before { - content: "\f062"; } - -.fa-arrows-alt:before { - content: "\f0b2"; } - -.fa-arrows-alt-h:before { - content: "\f337"; } - -.fa-arrows-alt-v:before { - content: "\f338"; } - -.fa-assistive-listening-systems:before { - content: "\f2a2"; } - -.fa-asterisk:before { - content: "\f069"; } - -.fa-asymmetrik:before { - content: "\f372"; } - -.fa-at:before { - content: "\f1fa"; } - -.fa-atlas:before { - content: "\f558"; } - -.fa-atom:before { - content: "\f5d2"; } - -.fa-audible:before { - content: "\f373"; } - -.fa-audio-description:before { - content: "\f29e"; } - -.fa-autoprefixer:before { - content: "\f41c"; } - -.fa-avianex:before { - content: "\f374"; } - -.fa-aviato:before { - content: "\f421"; } - -.fa-award:before { - content: "\f559"; } - -.fa-aws:before { - content: "\f375"; } - -.fa-backspace:before { - content: "\f55a"; } - -.fa-backward:before { - content: "\f04a"; } - -.fa-balance-scale:before { - content: "\f24e"; } - -.fa-ban:before { - content: "\f05e"; } - -.fa-band-aid:before { - content: "\f462"; } - -.fa-bandcamp:before { - content: "\f2d5"; } - -.fa-barcode:before { - content: "\f02a"; } - -.fa-bars:before { - content: "\f0c9"; } - -.fa-baseball-ball:before { - content: "\f433"; } - -.fa-basketball-ball:before { - content: "\f434"; } - -.fa-bath:before { - content: "\f2cd"; } - -.fa-battery-empty:before { - content: "\f244"; } - -.fa-battery-full:before { - content: "\f240"; } - -.fa-battery-half:before { - content: "\f242"; } - -.fa-battery-quarter:before { - content: "\f243"; } - -.fa-battery-three-quarters:before { - content: "\f241"; } - -.fa-bed:before { - content: "\f236"; } - -.fa-beer:before { - content: "\f0fc"; } - -.fa-behance:before { - content: "\f1b4"; } - -.fa-behance-square:before { - content: "\f1b5"; } - -.fa-bell:before { - content: "\f0f3"; } - -.fa-bell-slash:before { - content: "\f1f6"; } - -.fa-bezier-curve:before { - content: "\f55b"; } - -.fa-bible:before { - content: "\f647"; } - -.fa-bicycle:before { - content: "\f206"; } - -.fa-bimobject:before { - content: "\f378"; } - -.fa-binoculars:before { - content: "\f1e5"; } - -.fa-birthday-cake:before { - content: "\f1fd"; } - -.fa-bitbucket:before { - content: "\f171"; } - -.fa-bitcoin:before { - content: "\f379"; } - -.fa-bity:before { - content: "\f37a"; } - -.fa-black-tie:before { - content: "\f27e"; } - -.fa-blackberry:before { - content: "\f37b"; } - -.fa-blender:before { - content: "\f517"; } - -.fa-blender-phone:before { - content: "\f6b6"; } - -.fa-blind:before { - content: "\f29d"; } - -.fa-blogger:before { - content: "\f37c"; } - -.fa-blogger-b:before { - content: "\f37d"; } - -.fa-bluetooth:before { - content: "\f293"; } - -.fa-bluetooth-b:before { - content: "\f294"; } - -.fa-bold:before { - content: "\f032"; } - -.fa-bolt:before { - content: "\f0e7"; } - -.fa-bomb:before { - content: "\f1e2"; } - -.fa-bone:before { - content: "\f5d7"; } - -.fa-bong:before { - content: "\f55c"; } - -.fa-book:before { - content: "\f02d"; } - -.fa-book-dead:before { - content: "\f6b7"; } - -.fa-book-open:before { - content: "\f518"; } - -.fa-book-reader:before { - content: "\f5da"; } - -.fa-bookmark:before { - content: "\f02e"; } - -.fa-bowling-ball:before { - content: "\f436"; } - -.fa-box:before { - content: "\f466"; } - -.fa-box-open:before { - content: "\f49e"; } - -.fa-boxes:before { - content: "\f468"; } - -.fa-braille:before { - content: "\f2a1"; } - -.fa-brain:before { - content: "\f5dc"; } - -.fa-briefcase:before { - content: "\f0b1"; } - -.fa-briefcase-medical:before { - content: "\f469"; } - -.fa-broadcast-tower:before { - content: "\f519"; } - -.fa-broom:before { - content: "\f51a"; } - -.fa-brush:before { - content: "\f55d"; } - -.fa-btc:before { - content: "\f15a"; } - -.fa-bug:before { - content: "\f188"; } - -.fa-building:before { - content: "\f1ad"; } - -.fa-bullhorn:before { - content: "\f0a1"; } - -.fa-bullseye:before { - content: "\f140"; } - -.fa-burn:before { - content: "\f46a"; } - -.fa-buromobelexperte:before { - content: "\f37f"; } - -.fa-bus:before { - content: "\f207"; } - -.fa-bus-alt:before { - content: "\f55e"; } - -.fa-business-time:before { - content: "\f64a"; } - -.fa-buysellads:before { - content: "\f20d"; } - -.fa-calculator:before { - content: "\f1ec"; } - -.fa-calendar:before { - content: "\f133"; } - -.fa-calendar-alt:before { - content: "\f073"; } - -.fa-calendar-check:before { - content: "\f274"; } - -.fa-calendar-minus:before { - content: "\f272"; } - -.fa-calendar-plus:before { - content: "\f271"; } - -.fa-calendar-times:before { - content: "\f273"; } - -.fa-camera:before { - content: "\f030"; } - -.fa-camera-retro:before { - content: "\f083"; } - -.fa-campground:before { - content: "\f6bb"; } - -.fa-cannabis:before { - content: "\f55f"; } - -.fa-capsules:before { - content: "\f46b"; } - -.fa-car:before { - content: "\f1b9"; } - -.fa-car-alt:before { - content: "\f5de"; } - -.fa-car-battery:before { - content: "\f5df"; } - -.fa-car-crash:before { - content: "\f5e1"; } - -.fa-car-side:before { - content: "\f5e4"; } - -.fa-caret-down:before { - content: "\f0d7"; } - -.fa-caret-left:before { - content: "\f0d9"; } - -.fa-caret-right:before { - content: "\f0da"; } - -.fa-caret-square-down:before { - content: "\f150"; } - -.fa-caret-square-left:before { - content: "\f191"; } - -.fa-caret-square-right:before { - content: "\f152"; } - -.fa-caret-square-up:before { - content: "\f151"; } - -.fa-caret-up:before { - content: "\f0d8"; } - -.fa-cart-arrow-down:before { - content: "\f218"; } - -.fa-cart-plus:before { - content: "\f217"; } - -.fa-cat:before { - content: "\f6be"; } - -.fa-cc-amazon-pay:before { - content: "\f42d"; } - -.fa-cc-amex:before { - content: "\f1f3"; } - -.fa-cc-apple-pay:before { - content: "\f416"; } - -.fa-cc-diners-club:before { - content: "\f24c"; } - -.fa-cc-discover:before { - content: "\f1f2"; } - -.fa-cc-jcb:before { - content: "\f24b"; } - -.fa-cc-mastercard:before { - content: "\f1f1"; } - -.fa-cc-paypal:before { - content: "\f1f4"; } - -.fa-cc-stripe:before { - content: "\f1f5"; } - -.fa-cc-visa:before { - content: "\f1f0"; } - -.fa-centercode:before { - content: "\f380"; } - -.fa-certificate:before { - content: "\f0a3"; } - -.fa-chair:before { - content: "\f6c0"; } - -.fa-chalkboard:before { - content: "\f51b"; } - -.fa-chalkboard-teacher:before { - content: "\f51c"; } - -.fa-charging-station:before { - content: "\f5e7"; } - -.fa-chart-area:before { - content: "\f1fe"; } - -.fa-chart-bar:before { - content: "\f080"; } - -.fa-chart-line:before { - content: "\f201"; } - -.fa-chart-pie:before { - content: "\f200"; } - -.fa-check:before { - content: "\f00c"; } - -.fa-check-circle:before { - content: "\f058"; } - -.fa-check-double:before { - content: "\f560"; } - -.fa-check-square:before { - content: "\f14a"; } - -.fa-chess:before { - content: "\f439"; } - -.fa-chess-bishop:before { - content: "\f43a"; } - -.fa-chess-board:before { - content: "\f43c"; } - -.fa-chess-king:before { - content: "\f43f"; } - -.fa-chess-knight:before { - content: "\f441"; } - -.fa-chess-pawn:before { - content: "\f443"; } - -.fa-chess-queen:before { - content: "\f445"; } - -.fa-chess-rook:before { - content: "\f447"; } - -.fa-chevron-circle-down:before { - content: "\f13a"; } - -.fa-chevron-circle-left:before { - content: "\f137"; } - -.fa-chevron-circle-right:before { - content: "\f138"; } - -.fa-chevron-circle-up:before { - content: "\f139"; } - -.fa-chevron-down:before { - content: "\f078"; } - -.fa-chevron-left:before { - content: "\f053"; } - -.fa-chevron-right:before { - content: "\f054"; } - -.fa-chevron-up:before { - content: "\f077"; } - -.fa-child:before { - content: "\f1ae"; } - -.fa-chrome:before { - content: "\f268"; } - -.fa-church:before { - content: "\f51d"; } - -.fa-circle:before { - content: "\f111"; } - -.fa-circle-notch:before { - content: "\f1ce"; } - -.fa-city:before { - content: "\f64f"; } - -.fa-clipboard:before { - content: "\f328"; } - -.fa-clipboard-check:before { - content: "\f46c"; } - -.fa-clipboard-list:before { - content: "\f46d"; } - -.fa-clock:before { - content: "\f017"; } - -.fa-clone:before { - content: "\f24d"; } - -.fa-closed-captioning:before { - content: "\f20a"; } - -.fa-cloud:before { - content: "\f0c2"; } - -.fa-cloud-download-alt:before { - content: "\f381"; } - -.fa-cloud-moon:before { - content: "\f6c3"; } - -.fa-cloud-sun:before { - content: "\f6c4"; } - -.fa-cloud-upload-alt:before { - content: "\f382"; } - -.fa-cloudscale:before { - content: "\f383"; } - -.fa-cloudsmith:before { - content: "\f384"; } - -.fa-cloudversify:before { - content: "\f385"; } - -.fa-cocktail:before { - content: "\f561"; } - -.fa-code:before { - content: "\f121"; } - -.fa-code-branch:before { - content: "\f126"; } - -.fa-codepen:before { - content: "\f1cb"; } - -.fa-codiepie:before { - content: "\f284"; } - -.fa-coffee:before { - content: "\f0f4"; } - -.fa-cog:before { - content: "\f013"; } - -.fa-cogs:before { - content: "\f085"; } - -.fa-coins:before { - content: "\f51e"; } - -.fa-columns:before { - content: "\f0db"; } - -.fa-comment:before { - content: "\f075"; } - -.fa-comment-alt:before { - content: "\f27a"; } - -.fa-comment-dollar:before { - content: "\f651"; } - -.fa-comment-dots:before { - content: "\f4ad"; } - -.fa-comment-slash:before { - content: "\f4b3"; } - -.fa-comments:before { - content: "\f086"; } - -.fa-comments-dollar:before { - content: "\f653"; } - -.fa-compact-disc:before { - content: "\f51f"; } - -.fa-compass:before { - content: "\f14e"; } - -.fa-compress:before { - content: "\f066"; } - -.fa-concierge-bell:before { - content: "\f562"; } - -.fa-connectdevelop:before { - content: "\f20e"; } - -.fa-contao:before { - content: "\f26d"; } - -.fa-cookie:before { - content: "\f563"; } - -.fa-cookie-bite:before { - content: "\f564"; } - -.fa-copy:before { - content: "\f0c5"; } - -.fa-copyright:before { - content: "\f1f9"; } - -.fa-couch:before { - content: "\f4b8"; } - -.fa-cpanel:before { - content: "\f388"; } - -.fa-creative-commons:before { - content: "\f25e"; } - -.fa-creative-commons-by:before { - content: "\f4e7"; } - -.fa-creative-commons-nc:before { - content: "\f4e8"; } - -.fa-creative-commons-nc-eu:before { - content: "\f4e9"; } - -.fa-creative-commons-nc-jp:before { - content: "\f4ea"; } - -.fa-creative-commons-nd:before { - content: "\f4eb"; } - -.fa-creative-commons-pd:before { - content: "\f4ec"; } - -.fa-creative-commons-pd-alt:before { - content: "\f4ed"; } - -.fa-creative-commons-remix:before { - content: "\f4ee"; } - -.fa-creative-commons-sa:before { - content: "\f4ef"; } - -.fa-creative-commons-sampling:before { - content: "\f4f0"; } - -.fa-creative-commons-sampling-plus:before { - content: "\f4f1"; } - -.fa-creative-commons-share:before { - content: "\f4f2"; } - -.fa-creative-commons-zero:before { - content: "\f4f3"; } - -.fa-credit-card:before { - content: "\f09d"; } - -.fa-critical-role:before { - content: "\f6c9"; } - -.fa-crop:before { - content: "\f125"; } - -.fa-crop-alt:before { - content: "\f565"; } - -.fa-cross:before { - content: "\f654"; } - -.fa-crosshairs:before { - content: "\f05b"; } - -.fa-crow:before { - content: "\f520"; } - -.fa-crown:before { - content: "\f521"; } - -.fa-css3:before { - content: "\f13c"; } - -.fa-css3-alt:before { - content: "\f38b"; } - -.fa-cube:before { - content: "\f1b2"; } - -.fa-cubes:before { - content: "\f1b3"; } - -.fa-cut:before { - content: "\f0c4"; } - -.fa-cuttlefish:before { - content: "\f38c"; } - -.fa-d-and-d:before { - content: "\f38d"; } - -.fa-dashcube:before { - content: "\f210"; } - -.fa-database:before { - content: "\f1c0"; } - -.fa-deaf:before { - content: "\f2a4"; } - -.fa-delicious:before { - content: "\f1a5"; } - -.fa-deploydog:before { - content: "\f38e"; } - -.fa-deskpro:before { - content: "\f38f"; } - -.fa-desktop:before { - content: "\f108"; } - -.fa-dev:before { - content: "\f6cc"; } - -.fa-deviantart:before { - content: "\f1bd"; } - -.fa-dharmachakra:before { - content: "\f655"; } - -.fa-diagnoses:before { - content: "\f470"; } - -.fa-dice:before { - content: "\f522"; } - -.fa-dice-d20:before { - content: "\f6cf"; } - -.fa-dice-d6:before { - content: "\f6d1"; } - -.fa-dice-five:before { - content: "\f523"; } - -.fa-dice-four:before { - content: "\f524"; } - -.fa-dice-one:before { - content: "\f525"; } - -.fa-dice-six:before { - content: "\f526"; } - -.fa-dice-three:before { - content: "\f527"; } - -.fa-dice-two:before { - content: "\f528"; } - -.fa-digg:before { - content: "\f1a6"; } - -.fa-digital-ocean:before { - content: "\f391"; } - -.fa-digital-tachograph:before { - content: "\f566"; } - -.fa-directions:before { - content: "\f5eb"; } - -.fa-discord:before { - content: "\f392"; } - -.fa-discourse:before { - content: "\f393"; } - -.fa-divide:before { - content: "\f529"; } - -.fa-dizzy:before { - content: "\f567"; } - -.fa-dna:before { - content: "\f471"; } - -.fa-dochub:before { - content: "\f394"; } - -.fa-docker:before { - content: "\f395"; } - -.fa-dog:before { - content: "\f6d3"; } - -.fa-dollar-sign:before { - content: "\f155"; } - -.fa-dolly:before { - content: "\f472"; } - -.fa-dolly-flatbed:before { - content: "\f474"; } - -.fa-donate:before { - content: "\f4b9"; } - -.fa-door-closed:before { - content: "\f52a"; } - -.fa-door-open:before { - content: "\f52b"; } - -.fa-dot-circle:before { - content: "\f192"; } - -.fa-dove:before { - content: "\f4ba"; } - -.fa-download:before { - content: "\f019"; } - -.fa-draft2digital:before { - content: "\f396"; } - -.fa-drafting-compass:before { - content: "\f568"; } - -.fa-dragon:before { - content: "\f6d5"; } - -.fa-draw-polygon:before { - content: "\f5ee"; } - -.fa-dribbble:before { - content: "\f17d"; } - -.fa-dribbble-square:before { - content: "\f397"; } - -.fa-dropbox:before { - content: "\f16b"; } - -.fa-drum:before { - content: "\f569"; } - -.fa-drum-steelpan:before { - content: "\f56a"; } - -.fa-drumstick-bite:before { - content: "\f6d7"; } - -.fa-drupal:before { - content: "\f1a9"; } - -.fa-dumbbell:before { - content: "\f44b"; } - -.fa-dungeon:before { - content: "\f6d9"; } - -.fa-dyalog:before { - content: "\f399"; } - -.fa-earlybirds:before { - content: "\f39a"; } - -.fa-ebay:before { - content: "\f4f4"; } - -.fa-edge:before { - content: "\f282"; } - -.fa-edit:before { - content: "\f044"; } - -.fa-eject:before { - content: "\f052"; } - -.fa-elementor:before { - content: "\f430"; } - -.fa-ellipsis-h:before { - content: "\f141"; } - -.fa-ellipsis-v:before { - content: "\f142"; } - -.fa-ello:before { - content: "\f5f1"; } - -.fa-ember:before { - content: "\f423"; } - -.fa-empire:before { - content: "\f1d1"; } - -.fa-envelope:before { - content: "\f0e0"; } - -.fa-envelope-open:before { - content: "\f2b6"; } - -.fa-envelope-open-text:before { - content: "\f658"; } - -.fa-envelope-square:before { - content: "\f199"; } - -.fa-envira:before { - content: "\f299"; } - -.fa-equals:before { - content: "\f52c"; } - -.fa-eraser:before { - content: "\f12d"; } - -.fa-erlang:before { - content: "\f39d"; } - -.fa-ethereum:before { - content: "\f42e"; } - -.fa-etsy:before { - content: "\f2d7"; } - -.fa-euro-sign:before { - content: "\f153"; } - -.fa-exchange-alt:before { - content: "\f362"; } - -.fa-exclamation:before { - content: "\f12a"; } - -.fa-exclamation-circle:before { - content: "\f06a"; } - -.fa-exclamation-triangle:before { - content: "\f071"; } - -.fa-expand:before { - content: "\f065"; } - -.fa-expand-arrows-alt:before { - content: "\f31e"; } - -.fa-expeditedssl:before { - content: "\f23e"; } - -.fa-external-link-alt:before { - content: "\f35d"; } - -.fa-external-link-square-alt:before { - content: "\f360"; } - -.fa-eye:before { - content: "\f06e"; } - -.fa-eye-dropper:before { - content: "\f1fb"; } - -.fa-eye-slash:before { - content: "\f070"; } - -.fa-facebook:before { - content: "\f09a"; } - -.fa-facebook-f:before { - content: "\f39e"; } - -.fa-facebook-messenger:before { - content: "\f39f"; } - -.fa-facebook-square:before { - content: "\f082"; } - -.fa-fantasy-flight-games:before { - content: "\f6dc"; } - -.fa-fast-backward:before { - content: "\f049"; } - -.fa-fast-forward:before { - content: "\f050"; } - -.fa-fax:before { - content: "\f1ac"; } - -.fa-feather:before { - content: "\f52d"; } - -.fa-feather-alt:before { - content: "\f56b"; } - -.fa-female:before { - content: "\f182"; } - -.fa-fighter-jet:before { - content: "\f0fb"; } - -.fa-file:before { - content: "\f15b"; } - -.fa-file-alt:before { - content: "\f15c"; } - -.fa-file-archive:before { - content: "\f1c6"; } - -.fa-file-audio:before { - content: "\f1c7"; } - -.fa-file-code:before { - content: "\f1c9"; } - -.fa-file-contract:before { - content: "\f56c"; } - -.fa-file-csv:before { - content: "\f6dd"; } - -.fa-file-download:before { - content: "\f56d"; } - -.fa-file-excel:before { - content: "\f1c3"; } - -.fa-file-export:before { - content: "\f56e"; } - -.fa-file-image:before { - content: "\f1c5"; } - -.fa-file-import:before { - content: "\f56f"; } - -.fa-file-invoice:before { - content: "\f570"; } - -.fa-file-invoice-dollar:before { - content: "\f571"; } - -.fa-file-medical:before { - content: "\f477"; } - -.fa-file-medical-alt:before { - content: "\f478"; } - -.fa-file-pdf:before { - content: "\f1c1"; } - -.fa-file-powerpoint:before { - content: "\f1c4"; } - -.fa-file-prescription:before { - content: "\f572"; } - -.fa-file-signature:before { - content: "\f573"; } - -.fa-file-upload:before { - content: "\f574"; } - -.fa-file-video:before { - content: "\f1c8"; } - -.fa-file-word:before { - content: "\f1c2"; } - -.fa-fill:before { - content: "\f575"; } - -.fa-fill-drip:before { - content: "\f576"; } - -.fa-film:before { - content: "\f008"; } - -.fa-filter:before { - content: "\f0b0"; } - -.fa-fingerprint:before { - content: "\f577"; } - -.fa-fire:before { - content: "\f06d"; } - -.fa-fire-extinguisher:before { - content: "\f134"; } - -.fa-firefox:before { - content: "\f269"; } - -.fa-first-aid:before { - content: "\f479"; } - -.fa-first-order:before { - content: "\f2b0"; } - -.fa-first-order-alt:before { - content: "\f50a"; } - -.fa-firstdraft:before { - content: "\f3a1"; } - -.fa-fish:before { - content: "\f578"; } - -.fa-fist-raised:before { - content: "\f6de"; } - -.fa-flag:before { - content: "\f024"; } - -.fa-flag-checkered:before { - content: "\f11e"; } - -.fa-flask:before { - content: "\f0c3"; } - -.fa-flickr:before { - content: "\f16e"; } - -.fa-flipboard:before { - content: "\f44d"; } - -.fa-flushed:before { - content: "\f579"; } - -.fa-fly:before { - content: "\f417"; } - -.fa-folder:before { - content: "\f07b"; } - -.fa-folder-minus:before { - content: "\f65d"; } - -.fa-folder-open:before { - content: "\f07c"; } - -.fa-folder-plus:before { - content: "\f65e"; } - -.fa-font:before { - content: "\f031"; } - -.fa-font-awesome:before { - content: "\f2b4"; } - -.fa-font-awesome-alt:before { - content: "\f35c"; } - -.fa-font-awesome-flag:before { - content: "\f425"; } - -.fa-font-awesome-logo-full:before { - content: "\f4e6"; } - -.fa-fonticons:before { - content: "\f280"; } - -.fa-fonticons-fi:before { - content: "\f3a2"; } - -.fa-football-ball:before { - content: "\f44e"; } - -.fa-fort-awesome:before { - content: "\f286"; } - -.fa-fort-awesome-alt:before { - content: "\f3a3"; } - -.fa-forumbee:before { - content: "\f211"; } - -.fa-forward:before { - content: "\f04e"; } - -.fa-foursquare:before { - content: "\f180"; } - -.fa-free-code-camp:before { - content: "\f2c5"; } - -.fa-freebsd:before { - content: "\f3a4"; } - -.fa-frog:before { - content: "\f52e"; } - -.fa-frown:before { - content: "\f119"; } - -.fa-frown-open:before { - content: "\f57a"; } - -.fa-fulcrum:before { - content: "\f50b"; } - -.fa-funnel-dollar:before { - content: "\f662"; } - -.fa-futbol:before { - content: "\f1e3"; } - -.fa-galactic-republic:before { - content: "\f50c"; } - -.fa-galactic-senate:before { - content: "\f50d"; } - -.fa-gamepad:before { - content: "\f11b"; } - -.fa-gas-pump:before { - content: "\f52f"; } - -.fa-gavel:before { - content: "\f0e3"; } - -.fa-gem:before { - content: "\f3a5"; } - -.fa-genderless:before { - content: "\f22d"; } - -.fa-get-pocket:before { - content: "\f265"; } - -.fa-gg:before { - content: "\f260"; } - -.fa-gg-circle:before { - content: "\f261"; } - -.fa-ghost:before { - content: "\f6e2"; } - -.fa-gift:before { - content: "\f06b"; } - -.fa-git:before { - content: "\f1d3"; } - -.fa-git-square:before { - content: "\f1d2"; } - -.fa-github:before { - content: "\f09b"; } - -.fa-github-alt:before { - content: "\f113"; } - -.fa-github-square:before { - content: "\f092"; } - -.fa-gitkraken:before { - content: "\f3a6"; } - -.fa-gitlab:before { - content: "\f296"; } - -.fa-gitter:before { - content: "\f426"; } - -.fa-glass-martini:before { - content: "\f000"; } - -.fa-glass-martini-alt:before { - content: "\f57b"; } - -.fa-glasses:before { - content: "\f530"; } - -.fa-glide:before { - content: "\f2a5"; } - -.fa-glide-g:before { - content: "\f2a6"; } - -.fa-globe:before { - content: "\f0ac"; } - -.fa-globe-africa:before { - content: "\f57c"; } - -.fa-globe-americas:before { - content: "\f57d"; } - -.fa-globe-asia:before { - content: "\f57e"; } - -.fa-gofore:before { - content: "\f3a7"; } - -.fa-golf-ball:before { - content: "\f450"; } - -.fa-goodreads:before { - content: "\f3a8"; } - -.fa-goodreads-g:before { - content: "\f3a9"; } - -.fa-google:before { - content: "\f1a0"; } - -.fa-google-drive:before { - content: "\f3aa"; } - -.fa-google-play:before { - content: "\f3ab"; } - -.fa-google-plus:before { - content: "\f2b3"; } - -.fa-google-plus-g:before { - content: "\f0d5"; } - -.fa-google-plus-square:before { - content: "\f0d4"; } - -.fa-google-wallet:before { - content: "\f1ee"; } - -.fa-gopuram:before { - content: "\f664"; } - -.fa-graduation-cap:before { - content: "\f19d"; } - -.fa-gratipay:before { - content: "\f184"; } - -.fa-grav:before { - content: "\f2d6"; } - -.fa-greater-than:before { - content: "\f531"; } - -.fa-greater-than-equal:before { - content: "\f532"; } - -.fa-grimace:before { - content: "\f57f"; } - -.fa-grin:before { - content: "\f580"; } - -.fa-grin-alt:before { - content: "\f581"; } - -.fa-grin-beam:before { - content: "\f582"; } - -.fa-grin-beam-sweat:before { - content: "\f583"; } - -.fa-grin-hearts:before { - content: "\f584"; } - -.fa-grin-squint:before { - content: "\f585"; } - -.fa-grin-squint-tears:before { - content: "\f586"; } - -.fa-grin-stars:before { - content: "\f587"; } - -.fa-grin-tears:before { - content: "\f588"; } - -.fa-grin-tongue:before { - content: "\f589"; } - -.fa-grin-tongue-squint:before { - content: "\f58a"; } - -.fa-grin-tongue-wink:before { - content: "\f58b"; } - -.fa-grin-wink:before { - content: "\f58c"; } - -.fa-grip-horizontal:before { - content: "\f58d"; } - -.fa-grip-vertical:before { - content: "\f58e"; } - -.fa-gripfire:before { - content: "\f3ac"; } - -.fa-grunt:before { - content: "\f3ad"; } - -.fa-gulp:before { - content: "\f3ae"; } - -.fa-h-square:before { - content: "\f0fd"; } - -.fa-hacker-news:before { - content: "\f1d4"; } - -.fa-hacker-news-square:before { - content: "\f3af"; } - -.fa-hackerrank:before { - content: "\f5f7"; } - -.fa-hammer:before { - content: "\f6e3"; } - -.fa-hamsa:before { - content: "\f665"; } - -.fa-hand-holding:before { - content: "\f4bd"; } - -.fa-hand-holding-heart:before { - content: "\f4be"; } - -.fa-hand-holding-usd:before { - content: "\f4c0"; } - -.fa-hand-lizard:before { - content: "\f258"; } - -.fa-hand-paper:before { - content: "\f256"; } - -.fa-hand-peace:before { - content: "\f25b"; } - -.fa-hand-point-down:before { - content: "\f0a7"; } - -.fa-hand-point-left:before { - content: "\f0a5"; } - -.fa-hand-point-right:before { - content: "\f0a4"; } - -.fa-hand-point-up:before { - content: "\f0a6"; } - -.fa-hand-pointer:before { - content: "\f25a"; } - -.fa-hand-rock:before { - content: "\f255"; } - -.fa-hand-scissors:before { - content: "\f257"; } - -.fa-hand-spock:before { - content: "\f259"; } - -.fa-hands:before { - content: "\f4c2"; } - -.fa-hands-helping:before { - content: "\f4c4"; } - -.fa-handshake:before { - content: "\f2b5"; } - -.fa-hanukiah:before { - content: "\f6e6"; } - -.fa-hashtag:before { - content: "\f292"; } - -.fa-hat-wizard:before { - content: "\f6e8"; } - -.fa-haykal:before { - content: "\f666"; } - -.fa-hdd:before { - content: "\f0a0"; } - -.fa-heading:before { - content: "\f1dc"; } - -.fa-headphones:before { - content: "\f025"; } - -.fa-headphones-alt:before { - content: "\f58f"; } - -.fa-headset:before { - content: "\f590"; } - -.fa-heart:before { - content: "\f004"; } - -.fa-heartbeat:before { - content: "\f21e"; } - -.fa-helicopter:before { - content: "\f533"; } - -.fa-highlighter:before { - content: "\f591"; } - -.fa-hiking:before { - content: "\f6ec"; } - -.fa-hippo:before { - content: "\f6ed"; } - -.fa-hips:before { - content: "\f452"; } - -.fa-hire-a-helper:before { - content: "\f3b0"; } - -.fa-history:before { - content: "\f1da"; } - -.fa-hockey-puck:before { - content: "\f453"; } - -.fa-home:before { - content: "\f015"; } - -.fa-hooli:before { - content: "\f427"; } - -.fa-hornbill:before { - content: "\f592"; } - -.fa-horse:before { - content: "\f6f0"; } - -.fa-hospital:before { - content: "\f0f8"; } - -.fa-hospital-alt:before { - content: "\f47d"; } - -.fa-hospital-symbol:before { - content: "\f47e"; } - -.fa-hot-tub:before { - content: "\f593"; } - -.fa-hotel:before { - content: "\f594"; } - -.fa-hotjar:before { - content: "\f3b1"; } - -.fa-hourglass:before { - content: "\f254"; } - -.fa-hourglass-end:before { - content: "\f253"; } - -.fa-hourglass-half:before { - content: "\f252"; } - -.fa-hourglass-start:before { - content: "\f251"; } - -.fa-house-damage:before { - content: "\f6f1"; } - -.fa-houzz:before { - content: "\f27c"; } - -.fa-hryvnia:before { - content: "\f6f2"; } - -.fa-html5:before { - content: "\f13b"; } - -.fa-hubspot:before { - content: "\f3b2"; } - -.fa-i-cursor:before { - content: "\f246"; } - -.fa-id-badge:before { - content: "\f2c1"; } - -.fa-id-card:before { - content: "\f2c2"; } - -.fa-id-card-alt:before { - content: "\f47f"; } - -.fa-image:before { - content: "\f03e"; } - -.fa-images:before { - content: "\f302"; } - -.fa-imdb:before { - content: "\f2d8"; } - -.fa-inbox:before { - content: "\f01c"; } - -.fa-indent:before { - content: "\f03c"; } - -.fa-industry:before { - content: "\f275"; } - -.fa-infinity:before { - content: "\f534"; } - -.fa-info:before { - content: "\f129"; } - -.fa-info-circle:before { - content: "\f05a"; } - -.fa-instagram:before { - content: "\f16d"; } - -.fa-internet-explorer:before { - content: "\f26b"; } - -.fa-ioxhost:before { - content: "\f208"; } - -.fa-italic:before { - content: "\f033"; } - -.fa-itunes:before { - content: "\f3b4"; } - -.fa-itunes-note:before { - content: "\f3b5"; } - -.fa-java:before { - content: "\f4e4"; } - -.fa-jedi:before { - content: "\f669"; } - -.fa-jedi-order:before { - content: "\f50e"; } - -.fa-jenkins:before { - content: "\f3b6"; } - -.fa-joget:before { - content: "\f3b7"; } - -.fa-joint:before { - content: "\f595"; } - -.fa-joomla:before { - content: "\f1aa"; } - -.fa-journal-whills:before { - content: "\f66a"; } - -.fa-js:before { - content: "\f3b8"; } - -.fa-js-square:before { - content: "\f3b9"; } - -.fa-jsfiddle:before { - content: "\f1cc"; } - -.fa-kaaba:before { - content: "\f66b"; } - -.fa-kaggle:before { - content: "\f5fa"; } - -.fa-key:before { - content: "\f084"; } - -.fa-keybase:before { - content: "\f4f5"; } - -.fa-keyboard:before { - content: "\f11c"; } - -.fa-keycdn:before { - content: "\f3ba"; } - -.fa-khanda:before { - content: "\f66d"; } - -.fa-kickstarter:before { - content: "\f3bb"; } - -.fa-kickstarter-k:before { - content: "\f3bc"; } - -.fa-kiss:before { - content: "\f596"; } - -.fa-kiss-beam:before { - content: "\f597"; } - -.fa-kiss-wink-heart:before { - content: "\f598"; } - -.fa-kiwi-bird:before { - content: "\f535"; } - -.fa-korvue:before { - content: "\f42f"; } - -.fa-landmark:before { - content: "\f66f"; } - -.fa-language:before { - content: "\f1ab"; } - -.fa-laptop:before { - content: "\f109"; } - -.fa-laptop-code:before { - content: "\f5fc"; } - -.fa-laravel:before { - content: "\f3bd"; } - -.fa-lastfm:before { - content: "\f202"; } - -.fa-lastfm-square:before { - content: "\f203"; } - -.fa-laugh:before { - content: "\f599"; } - -.fa-laugh-beam:before { - content: "\f59a"; } - -.fa-laugh-squint:before { - content: "\f59b"; } - -.fa-laugh-wink:before { - content: "\f59c"; } - -.fa-layer-group:before { - content: "\f5fd"; } - -.fa-leaf:before { - content: "\f06c"; } - -.fa-leanpub:before { - content: "\f212"; } - -.fa-lemon:before { - content: "\f094"; } - -.fa-less:before { - content: "\f41d"; } - -.fa-less-than:before { - content: "\f536"; } - -.fa-less-than-equal:before { - content: "\f537"; } - -.fa-level-down-alt:before { - content: "\f3be"; } - -.fa-level-up-alt:before { - content: "\f3bf"; } - -.fa-life-ring:before { - content: "\f1cd"; } - -.fa-lightbulb:before { - content: "\f0eb"; } - -.fa-line:before { - content: "\f3c0"; } - -.fa-link:before { - content: "\f0c1"; } - -.fa-linkedin:before { - content: "\f08c"; } - -.fa-linkedin-in:before { - content: "\f0e1"; } - -.fa-linode:before { - content: "\f2b8"; } - -.fa-linux:before { - content: "\f17c"; } - -.fa-lira-sign:before { - content: "\f195"; } - -.fa-list:before { - content: "\f03a"; } - -.fa-list-alt:before { - content: "\f022"; } - -.fa-list-ol:before { - content: "\f0cb"; } - -.fa-list-ul:before { - content: "\f0ca"; } - -.fa-location-arrow:before { - content: "\f124"; } - -.fa-lock:before { - content: "\f023"; } - -.fa-lock-open:before { - content: "\f3c1"; } - -.fa-long-arrow-alt-down:before { - content: "\f309"; } - -.fa-long-arrow-alt-left:before { - content: "\f30a"; } - -.fa-long-arrow-alt-right:before { - content: "\f30b"; } - -.fa-long-arrow-alt-up:before { - content: "\f30c"; } - -.fa-low-vision:before { - content: "\f2a8"; } - -.fa-luggage-cart:before { - content: "\f59d"; } - -.fa-lyft:before { - content: "\f3c3"; } - -.fa-magento:before { - content: "\f3c4"; } - -.fa-magic:before { - content: "\f0d0"; } - -.fa-magnet:before { - content: "\f076"; } - -.fa-mail-bulk:before { - content: "\f674"; } - -.fa-mailchimp:before { - content: "\f59e"; } - -.fa-male:before { - content: "\f183"; } - -.fa-mandalorian:before { - content: "\f50f"; } - -.fa-map:before { - content: "\f279"; } - -.fa-map-marked:before { - content: "\f59f"; } - -.fa-map-marked-alt:before { - content: "\f5a0"; } - -.fa-map-marker:before { - content: "\f041"; } - -.fa-map-marker-alt:before { - content: "\f3c5"; } - -.fa-map-pin:before { - content: "\f276"; } - -.fa-map-signs:before { - content: "\f277"; } - -.fa-markdown:before { - content: "\f60f"; } - -.fa-marker:before { - content: "\f5a1"; } - -.fa-mars:before { - content: "\f222"; } - -.fa-mars-double:before { - content: "\f227"; } - -.fa-mars-stroke:before { - content: "\f229"; } - -.fa-mars-stroke-h:before { - content: "\f22b"; } - -.fa-mars-stroke-v:before { - content: "\f22a"; } - -.fa-mask:before { - content: "\f6fa"; } - -.fa-mastodon:before { - content: "\f4f6"; } - -.fa-maxcdn:before { - content: "\f136"; } - -.fa-medal:before { - content: "\f5a2"; } - -.fa-medapps:before { - content: "\f3c6"; } - -.fa-medium:before { - content: "\f23a"; } - -.fa-medium-m:before { - content: "\f3c7"; } - -.fa-medkit:before { - content: "\f0fa"; } - -.fa-medrt:before { - content: "\f3c8"; } - -.fa-meetup:before { - content: "\f2e0"; } - -.fa-megaport:before { - content: "\f5a3"; } - -.fa-meh:before { - content: "\f11a"; } - -.fa-meh-blank:before { - content: "\f5a4"; } - -.fa-meh-rolling-eyes:before { - content: "\f5a5"; } - -.fa-memory:before { - content: "\f538"; } - -.fa-menorah:before { - content: "\f676"; } - -.fa-mercury:before { - content: "\f223"; } - -.fa-microchip:before { - content: "\f2db"; } - -.fa-microphone:before { - content: "\f130"; } - -.fa-microphone-alt:before { - content: "\f3c9"; } - -.fa-microphone-alt-slash:before { - content: "\f539"; } - -.fa-microphone-slash:before { - content: "\f131"; } - -.fa-microscope:before { - content: "\f610"; } - -.fa-microsoft:before { - content: "\f3ca"; } - -.fa-minus:before { - content: "\f068"; } - -.fa-minus-circle:before { - content: "\f056"; } - -.fa-minus-square:before { - content: "\f146"; } - -.fa-mix:before { - content: "\f3cb"; } - -.fa-mixcloud:before { - content: "\f289"; } - -.fa-mizuni:before { - content: "\f3cc"; } - -.fa-mobile:before { - content: "\f10b"; } - -.fa-mobile-alt:before { - content: "\f3cd"; } - -.fa-modx:before { - content: "\f285"; } - -.fa-monero:before { - content: "\f3d0"; } - -.fa-money-bill:before { - content: "\f0d6"; } - -.fa-money-bill-alt:before { - content: "\f3d1"; } - -.fa-money-bill-wave:before { - content: "\f53a"; } - -.fa-money-bill-wave-alt:before { - content: "\f53b"; } - -.fa-money-check:before { - content: "\f53c"; } - -.fa-money-check-alt:before { - content: "\f53d"; } - -.fa-monument:before { - content: "\f5a6"; } - -.fa-moon:before { - content: "\f186"; } - -.fa-mortar-pestle:before { - content: "\f5a7"; } - -.fa-mosque:before { - content: "\f678"; } - -.fa-motorcycle:before { - content: "\f21c"; } - -.fa-mountain:before { - content: "\f6fc"; } - -.fa-mouse-pointer:before { - content: "\f245"; } - -.fa-music:before { - content: "\f001"; } - -.fa-napster:before { - content: "\f3d2"; } - -.fa-neos:before { - content: "\f612"; } - -.fa-network-wired:before { - content: "\f6ff"; } - -.fa-neuter:before { - content: "\f22c"; } - -.fa-newspaper:before { - content: "\f1ea"; } - -.fa-nimblr:before { - content: "\f5a8"; } - -.fa-nintendo-switch:before { - content: "\f418"; } - -.fa-node:before { - content: "\f419"; } - -.fa-node-js:before { - content: "\f3d3"; } - -.fa-not-equal:before { - content: "\f53e"; } - -.fa-notes-medical:before { - content: "\f481"; } - -.fa-npm:before { - content: "\f3d4"; } - -.fa-ns8:before { - content: "\f3d5"; } - -.fa-nutritionix:before { - content: "\f3d6"; } - -.fa-object-group:before { - content: "\f247"; } - -.fa-object-ungroup:before { - content: "\f248"; } - -.fa-odnoklassniki:before { - content: "\f263"; } - -.fa-odnoklassniki-square:before { - content: "\f264"; } - -.fa-oil-can:before { - content: "\f613"; } - -.fa-old-republic:before { - content: "\f510"; } - -.fa-om:before { - content: "\f679"; } - -.fa-opencart:before { - content: "\f23d"; } - -.fa-openid:before { - content: "\f19b"; } - -.fa-opera:before { - content: "\f26a"; } - -.fa-optin-monster:before { - content: "\f23c"; } - -.fa-osi:before { - content: "\f41a"; } - -.fa-otter:before { - content: "\f700"; } - -.fa-outdent:before { - content: "\f03b"; } - -.fa-page4:before { - content: "\f3d7"; } - -.fa-pagelines:before { - content: "\f18c"; } - -.fa-paint-brush:before { - content: "\f1fc"; } - -.fa-paint-roller:before { - content: "\f5aa"; } - -.fa-palette:before { - content: "\f53f"; } - -.fa-palfed:before { - content: "\f3d8"; } - -.fa-pallet:before { - content: "\f482"; } - -.fa-paper-plane:before { - content: "\f1d8"; } - -.fa-paperclip:before { - content: "\f0c6"; } - -.fa-parachute-box:before { - content: "\f4cd"; } - -.fa-paragraph:before { - content: "\f1dd"; } - -.fa-parking:before { - content: "\f540"; } - -.fa-passport:before { - content: "\f5ab"; } - -.fa-pastafarianism:before { - content: "\f67b"; } - -.fa-paste:before { - content: "\f0ea"; } - -.fa-patreon:before { - content: "\f3d9"; } - -.fa-pause:before { - content: "\f04c"; } - -.fa-pause-circle:before { - content: "\f28b"; } - -.fa-paw:before { - content: "\f1b0"; } - -.fa-paypal:before { - content: "\f1ed"; } - -.fa-peace:before { - content: "\f67c"; } - -.fa-pen:before { - content: "\f304"; } - -.fa-pen-alt:before { - content: "\f305"; } - -.fa-pen-fancy:before { - content: "\f5ac"; } - -.fa-pen-nib:before { - content: "\f5ad"; } - -.fa-pen-square:before { - content: "\f14b"; } - -.fa-pencil-alt:before { - content: "\f303"; } - -.fa-pencil-ruler:before { - content: "\f5ae"; } - -.fa-penny-arcade:before { - content: "\f704"; } - -.fa-people-carry:before { - content: "\f4ce"; } - -.fa-percent:before { - content: "\f295"; } - -.fa-percentage:before { - content: "\f541"; } - -.fa-periscope:before { - content: "\f3da"; } - -.fa-phabricator:before { - content: "\f3db"; } - -.fa-phoenix-framework:before { - content: "\f3dc"; } - -.fa-phoenix-squadron:before { - content: "\f511"; } - -.fa-phone:before { - content: "\f095"; } - -.fa-phone-slash:before { - content: "\f3dd"; } - -.fa-phone-square:before { - content: "\f098"; } - -.fa-phone-volume:before { - content: "\f2a0"; } - -.fa-php:before { - content: "\f457"; } - -.fa-pied-piper:before { - content: "\f2ae"; } - -.fa-pied-piper-alt:before { - content: "\f1a8"; } - -.fa-pied-piper-hat:before { - content: "\f4e5"; } - -.fa-pied-piper-pp:before { - content: "\f1a7"; } - -.fa-piggy-bank:before { - content: "\f4d3"; } - -.fa-pills:before { - content: "\f484"; } - -.fa-pinterest:before { - content: "\f0d2"; } - -.fa-pinterest-p:before { - content: "\f231"; } - -.fa-pinterest-square:before { - content: "\f0d3"; } - -.fa-place-of-worship:before { - content: "\f67f"; } - -.fa-plane:before { - content: "\f072"; } - -.fa-plane-arrival:before { - content: "\f5af"; } - -.fa-plane-departure:before { - content: "\f5b0"; } - -.fa-play:before { - content: "\f04b"; } - -.fa-play-circle:before { - content: "\f144"; } - -.fa-playstation:before { - content: "\f3df"; } - -.fa-plug:before { - content: "\f1e6"; } - -.fa-plus:before { - content: "\f067"; } - -.fa-plus-circle:before { - content: "\f055"; } - -.fa-plus-square:before { - content: "\f0fe"; } - -.fa-podcast:before { - content: "\f2ce"; } - -.fa-poll:before { - content: "\f681"; } - -.fa-poll-h:before { - content: "\f682"; } - -.fa-poo:before { - content: "\f2fe"; } - -.fa-poop:before { - content: "\f619"; } - -.fa-portrait:before { - content: "\f3e0"; } - -.fa-pound-sign:before { - content: "\f154"; } - -.fa-power-off:before { - content: "\f011"; } - -.fa-pray:before { - content: "\f683"; } - -.fa-praying-hands:before { - content: "\f684"; } - -.fa-prescription:before { - content: "\f5b1"; } - -.fa-prescription-bottle:before { - content: "\f485"; } - -.fa-prescription-bottle-alt:before { - content: "\f486"; } - -.fa-print:before { - content: "\f02f"; } - -.fa-procedures:before { - content: "\f487"; } - -.fa-product-hunt:before { - content: "\f288"; } - -.fa-project-diagram:before { - content: "\f542"; } - -.fa-pushed:before { - content: "\f3e1"; } - -.fa-puzzle-piece:before { - content: "\f12e"; } - -.fa-python:before { - content: "\f3e2"; } - -.fa-qq:before { - content: "\f1d6"; } - -.fa-qrcode:before { - content: "\f029"; } - -.fa-question:before { - content: "\f128"; } - -.fa-question-circle:before { - content: "\f059"; } - -.fa-quidditch:before { - content: "\f458"; } - -.fa-quinscape:before { - content: "\f459"; } - -.fa-quora:before { - content: "\f2c4"; } - -.fa-quote-left:before { - content: "\f10d"; } - -.fa-quote-right:before { - content: "\f10e"; } - -.fa-quran:before { - content: "\f687"; } - -.fa-r-project:before { - content: "\f4f7"; } - -.fa-random:before { - content: "\f074"; } - -.fa-ravelry:before { - content: "\f2d9"; } - -.fa-react:before { - content: "\f41b"; } - -.fa-readme:before { - content: "\f4d5"; } - -.fa-rebel:before { - content: "\f1d0"; } - -.fa-receipt:before { - content: "\f543"; } - -.fa-recycle:before { - content: "\f1b8"; } - -.fa-red-river:before { - content: "\f3e3"; } - -.fa-reddit:before { - content: "\f1a1"; } - -.fa-reddit-alien:before { - content: "\f281"; } - -.fa-reddit-square:before { - content: "\f1a2"; } - -.fa-redo:before { - content: "\f01e"; } - -.fa-redo-alt:before { - content: "\f2f9"; } - -.fa-registered:before { - content: "\f25d"; } - -.fa-rendact:before { - content: "\f3e4"; } - -.fa-renren:before { - content: "\f18b"; } - -.fa-reply:before { - content: "\f3e5"; } - -.fa-reply-all:before { - content: "\f122"; } - -.fa-replyd:before { - content: "\f3e6"; } - -.fa-researchgate:before { - content: "\f4f8"; } - -.fa-resolving:before { - content: "\f3e7"; } - -.fa-retweet:before { - content: "\f079"; } - -.fa-rev:before { - content: "\f5b2"; } - -.fa-ribbon:before { - content: "\f4d6"; } - -.fa-ring:before { - content: "\f70b"; } - -.fa-road:before { - content: "\f018"; } - -.fa-robot:before { - content: "\f544"; } - -.fa-rocket:before { - content: "\f135"; } - -.fa-rocketchat:before { - content: "\f3e8"; } - -.fa-rockrms:before { - content: "\f3e9"; } - -.fa-route:before { - content: "\f4d7"; } - -.fa-rss:before { - content: "\f09e"; } - -.fa-rss-square:before { - content: "\f143"; } - -.fa-ruble-sign:before { - content: "\f158"; } - -.fa-ruler:before { - content: "\f545"; } - -.fa-ruler-combined:before { - content: "\f546"; } - -.fa-ruler-horizontal:before { - content: "\f547"; } - -.fa-ruler-vertical:before { - content: "\f548"; } - -.fa-running:before { - content: "\f70c"; } - -.fa-rupee-sign:before { - content: "\f156"; } - -.fa-sad-cry:before { - content: "\f5b3"; } - -.fa-sad-tear:before { - content: "\f5b4"; } - -.fa-safari:before { - content: "\f267"; } - -.fa-sass:before { - content: "\f41e"; } - -.fa-save:before { - content: "\f0c7"; } - -.fa-schlix:before { - content: "\f3ea"; } - -.fa-school:before { - content: "\f549"; } - -.fa-screwdriver:before { - content: "\f54a"; } - -.fa-scribd:before { - content: "\f28a"; } - -.fa-scroll:before { - content: "\f70e"; } - -.fa-search:before { - content: "\f002"; } - -.fa-search-dollar:before { - content: "\f688"; } - -.fa-search-location:before { - content: "\f689"; } - -.fa-search-minus:before { - content: "\f010"; } - -.fa-search-plus:before { - content: "\f00e"; } - -.fa-searchengin:before { - content: "\f3eb"; } - -.fa-seedling:before { - content: "\f4d8"; } - -.fa-sellcast:before { - content: "\f2da"; } - -.fa-sellsy:before { - content: "\f213"; } - -.fa-server:before { - content: "\f233"; } - -.fa-servicestack:before { - content: "\f3ec"; } - -.fa-shapes:before { - content: "\f61f"; } - -.fa-share:before { - content: "\f064"; } - -.fa-share-alt:before { - content: "\f1e0"; } - -.fa-share-alt-square:before { - content: "\f1e1"; } - -.fa-share-square:before { - content: "\f14d"; } - -.fa-shekel-sign:before { - content: "\f20b"; } - -.fa-shield-alt:before { - content: "\f3ed"; } - -.fa-ship:before { - content: "\f21a"; } - -.fa-shipping-fast:before { - content: "\f48b"; } - -.fa-shirtsinbulk:before { - content: "\f214"; } - -.fa-shoe-prints:before { - content: "\f54b"; } - -.fa-shopping-bag:before { - content: "\f290"; } - -.fa-shopping-basket:before { - content: "\f291"; } - -.fa-shopping-cart:before { - content: "\f07a"; } - -.fa-shopware:before { - content: "\f5b5"; } - -.fa-shower:before { - content: "\f2cc"; } - -.fa-shuttle-van:before { - content: "\f5b6"; } - -.fa-sign:before { - content: "\f4d9"; } - -.fa-sign-in-alt:before { - content: "\f2f6"; } - -.fa-sign-language:before { - content: "\f2a7"; } - -.fa-sign-out-alt:before { - content: "\f2f5"; } - -.fa-signal:before { - content: "\f012"; } - -.fa-signature:before { - content: "\f5b7"; } - -.fa-simplybuilt:before { - content: "\f215"; } - -.fa-sistrix:before { - content: "\f3ee"; } - -.fa-sitemap:before { - content: "\f0e8"; } - -.fa-sith:before { - content: "\f512"; } - -.fa-skull:before { - content: "\f54c"; } - -.fa-skull-crossbones:before { - content: "\f714"; } - -.fa-skyatlas:before { - content: "\f216"; } - -.fa-skype:before { - content: "\f17e"; } - -.fa-slack:before { - content: "\f198"; } - -.fa-slack-hash:before { - content: "\f3ef"; } - -.fa-slash:before { - content: "\f715"; } - -.fa-sliders-h:before { - content: "\f1de"; } - -.fa-slideshare:before { - content: "\f1e7"; } - -.fa-smile:before { - content: "\f118"; } - -.fa-smile-beam:before { - content: "\f5b8"; } - -.fa-smile-wink:before { - content: "\f4da"; } - -.fa-smoking:before { - content: "\f48d"; } - -.fa-smoking-ban:before { - content: "\f54d"; } - -.fa-snapchat:before { - content: "\f2ab"; } - -.fa-snapchat-ghost:before { - content: "\f2ac"; } - -.fa-snapchat-square:before { - content: "\f2ad"; } - -.fa-snowflake:before { - content: "\f2dc"; } - -.fa-socks:before { - content: "\f696"; } - -.fa-solar-panel:before { - content: "\f5ba"; } - -.fa-sort:before { - content: "\f0dc"; } - -.fa-sort-alpha-down:before { - content: "\f15d"; } - -.fa-sort-alpha-up:before { - content: "\f15e"; } - -.fa-sort-amount-down:before { - content: "\f160"; } - -.fa-sort-amount-up:before { - content: "\f161"; } - -.fa-sort-down:before { - content: "\f0dd"; } - -.fa-sort-numeric-down:before { - content: "\f162"; } - -.fa-sort-numeric-up:before { - content: "\f163"; } - -.fa-sort-up:before { - content: "\f0de"; } - -.fa-soundcloud:before { - content: "\f1be"; } - -.fa-spa:before { - content: "\f5bb"; } - -.fa-space-shuttle:before { - content: "\f197"; } - -.fa-speakap:before { - content: "\f3f3"; } - -.fa-spider:before { - content: "\f717"; } - -.fa-spinner:before { - content: "\f110"; } - -.fa-splotch:before { - content: "\f5bc"; } - -.fa-spotify:before { - content: "\f1bc"; } - -.fa-spray-can:before { - content: "\f5bd"; } - -.fa-square:before { - content: "\f0c8"; } - -.fa-square-full:before { - content: "\f45c"; } - -.fa-square-root-alt:before { - content: "\f698"; } - -.fa-squarespace:before { - content: "\f5be"; } - -.fa-stack-exchange:before { - content: "\f18d"; } - -.fa-stack-overflow:before { - content: "\f16c"; } - -.fa-stamp:before { - content: "\f5bf"; } - -.fa-star:before { - content: "\f005"; } - -.fa-star-and-crescent:before { - content: "\f699"; } - -.fa-star-half:before { - content: "\f089"; } - -.fa-star-half-alt:before { - content: "\f5c0"; } - -.fa-star-of-david:before { - content: "\f69a"; } - -.fa-star-of-life:before { - content: "\f621"; } - -.fa-staylinked:before { - content: "\f3f5"; } - -.fa-steam:before { - content: "\f1b6"; } - -.fa-steam-square:before { - content: "\f1b7"; } - -.fa-steam-symbol:before { - content: "\f3f6"; } - -.fa-step-backward:before { - content: "\f048"; } - -.fa-step-forward:before { - content: "\f051"; } - -.fa-stethoscope:before { - content: "\f0f1"; } - -.fa-sticker-mule:before { - content: "\f3f7"; } - -.fa-sticky-note:before { - content: "\f249"; } - -.fa-stop:before { - content: "\f04d"; } - -.fa-stop-circle:before { - content: "\f28d"; } - -.fa-stopwatch:before { - content: "\f2f2"; } - -.fa-store:before { - content: "\f54e"; } - -.fa-store-alt:before { - content: "\f54f"; } - -.fa-strava:before { - content: "\f428"; } - -.fa-stream:before { - content: "\f550"; } - -.fa-street-view:before { - content: "\f21d"; } - -.fa-strikethrough:before { - content: "\f0cc"; } - -.fa-stripe:before { - content: "\f429"; } - -.fa-stripe-s:before { - content: "\f42a"; } - -.fa-stroopwafel:before { - content: "\f551"; } - -.fa-studiovinari:before { - content: "\f3f8"; } - -.fa-stumbleupon:before { - content: "\f1a4"; } - -.fa-stumbleupon-circle:before { - content: "\f1a3"; } - -.fa-subscript:before { - content: "\f12c"; } - -.fa-subway:before { - content: "\f239"; } - -.fa-suitcase:before { - content: "\f0f2"; } - -.fa-suitcase-rolling:before { - content: "\f5c1"; } - -.fa-sun:before { - content: "\f185"; } - -.fa-superpowers:before { - content: "\f2dd"; } - -.fa-superscript:before { - content: "\f12b"; } - -.fa-supple:before { - content: "\f3f9"; } - -.fa-surprise:before { - content: "\f5c2"; } - -.fa-swatchbook:before { - content: "\f5c3"; } - -.fa-swimmer:before { - content: "\f5c4"; } - -.fa-swimming-pool:before { - content: "\f5c5"; } - -.fa-synagogue:before { - content: "\f69b"; } - -.fa-sync:before { - content: "\f021"; } - -.fa-sync-alt:before { - content: "\f2f1"; } - -.fa-syringe:before { - content: "\f48e"; } - -.fa-table:before { - content: "\f0ce"; } - -.fa-table-tennis:before { - content: "\f45d"; } - -.fa-tablet:before { - content: "\f10a"; } - -.fa-tablet-alt:before { - content: "\f3fa"; } - -.fa-tablets:before { - content: "\f490"; } - -.fa-tachometer-alt:before { - content: "\f3fd"; } - -.fa-tag:before { - content: "\f02b"; } - -.fa-tags:before { - content: "\f02c"; } - -.fa-tape:before { - content: "\f4db"; } - -.fa-tasks:before { - content: "\f0ae"; } - -.fa-taxi:before { - content: "\f1ba"; } - -.fa-teamspeak:before { - content: "\f4f9"; } - -.fa-teeth:before { - content: "\f62e"; } - -.fa-teeth-open:before { - content: "\f62f"; } - -.fa-telegram:before { - content: "\f2c6"; } - -.fa-telegram-plane:before { - content: "\f3fe"; } - -.fa-tencent-weibo:before { - content: "\f1d5"; } - -.fa-terminal:before { - content: "\f120"; } - -.fa-text-height:before { - content: "\f034"; } - -.fa-text-width:before { - content: "\f035"; } - -.fa-th:before { - content: "\f00a"; } - -.fa-th-large:before { - content: "\f009"; } - -.fa-th-list:before { - content: "\f00b"; } - -.fa-the-red-yeti:before { - content: "\f69d"; } - -.fa-theater-masks:before { - content: "\f630"; } - -.fa-themeco:before { - content: "\f5c6"; } - -.fa-themeisle:before { - content: "\f2b2"; } - -.fa-thermometer:before { - content: "\f491"; } - -.fa-thermometer-empty:before { - content: "\f2cb"; } - -.fa-thermometer-full:before { - content: "\f2c7"; } - -.fa-thermometer-half:before { - content: "\f2c9"; } - -.fa-thermometer-quarter:before { - content: "\f2ca"; } - -.fa-thermometer-three-quarters:before { - content: "\f2c8"; } - -.fa-thumbs-down:before { - content: "\f165"; } - -.fa-thumbs-up:before { - content: "\f164"; } - -.fa-thumbtack:before { - content: "\f08d"; } - -.fa-ticket-alt:before { - content: "\f3ff"; } - -.fa-times:before { - content: "\f00d"; } - -.fa-times-circle:before { - content: "\f057"; } - -.fa-tint:before { - content: "\f043"; } - -.fa-tint-slash:before { - content: "\f5c7"; } - -.fa-tired:before { - content: "\f5c8"; } - -.fa-toggle-off:before { - content: "\f204"; } - -.fa-toggle-on:before { - content: "\f205"; } - -.fa-toilet-paper:before { - content: "\f71e"; } - -.fa-toolbox:before { - content: "\f552"; } - -.fa-tooth:before { - content: "\f5c9"; } - -.fa-torah:before { - content: "\f6a0"; } - -.fa-torii-gate:before { - content: "\f6a1"; } - -.fa-tractor:before { - content: "\f722"; } - -.fa-trade-federation:before { - content: "\f513"; } - -.fa-trademark:before { - content: "\f25c"; } - -.fa-traffic-light:before { - content: "\f637"; } - -.fa-train:before { - content: "\f238"; } - -.fa-transgender:before { - content: "\f224"; } - -.fa-transgender-alt:before { - content: "\f225"; } - -.fa-trash:before { - content: "\f1f8"; } - -.fa-trash-alt:before { - content: "\f2ed"; } - -.fa-tree:before { - content: "\f1bb"; } - -.fa-trello:before { - content: "\f181"; } - -.fa-tripadvisor:before { - content: "\f262"; } - -.fa-trophy:before { - content: "\f091"; } - -.fa-truck:before { - content: "\f0d1"; } - -.fa-truck-loading:before { - content: "\f4de"; } - -.fa-truck-monster:before { - content: "\f63b"; } - -.fa-truck-moving:before { - content: "\f4df"; } - -.fa-truck-pickup:before { - content: "\f63c"; } - -.fa-tshirt:before { - content: "\f553"; } - -.fa-tty:before { - content: "\f1e4"; } - -.fa-tumblr:before { - content: "\f173"; } - -.fa-tumblr-square:before { - content: "\f174"; } - -.fa-tv:before { - content: "\f26c"; } - -.fa-twitch:before { - content: "\f1e8"; } - -.fa-twitter:before { - content: "\f099"; } - -.fa-twitter-square:before { - content: "\f081"; } - -.fa-typo3:before { - content: "\f42b"; } - -.fa-uber:before { - content: "\f402"; } - -.fa-uikit:before { - content: "\f403"; } - -.fa-umbrella:before { - content: "\f0e9"; } - -.fa-umbrella-beach:before { - content: "\f5ca"; } - -.fa-underline:before { - content: "\f0cd"; } - -.fa-undo:before { - content: "\f0e2"; } - -.fa-undo-alt:before { - content: "\f2ea"; } - -.fa-uniregistry:before { - content: "\f404"; } - -.fa-universal-access:before { - content: "\f29a"; } - -.fa-university:before { - content: "\f19c"; } - -.fa-unlink:before { - content: "\f127"; } - -.fa-unlock:before { - content: "\f09c"; } - -.fa-unlock-alt:before { - content: "\f13e"; } - -.fa-untappd:before { - content: "\f405"; } - -.fa-upload:before { - content: "\f093"; } - -.fa-usb:before { - content: "\f287"; } - -.fa-user:before { - content: "\f007"; } - -.fa-user-alt:before { - content: "\f406"; } - -.fa-user-alt-slash:before { - content: "\f4fa"; } - -.fa-user-astronaut:before { - content: "\f4fb"; } - -.fa-user-check:before { - content: "\f4fc"; } - -.fa-user-circle:before { - content: "\f2bd"; } - -.fa-user-clock:before { - content: "\f4fd"; } - -.fa-user-cog:before { - content: "\f4fe"; } - -.fa-user-edit:before { - content: "\f4ff"; } - -.fa-user-friends:before { - content: "\f500"; } - -.fa-user-graduate:before { - content: "\f501"; } - -.fa-user-injured:before { - content: "\f728"; } - -.fa-user-lock:before { - content: "\f502"; } - -.fa-user-md:before { - content: "\f0f0"; } - -.fa-user-minus:before { - content: "\f503"; } - -.fa-user-ninja:before { - content: "\f504"; } - -.fa-user-plus:before { - content: "\f234"; } - -.fa-user-secret:before { - content: "\f21b"; } - -.fa-user-shield:before { - content: "\f505"; } - -.fa-user-slash:before { - content: "\f506"; } - -.fa-user-tag:before { - content: "\f507"; } - -.fa-user-tie:before { - content: "\f508"; } - -.fa-user-times:before { - content: "\f235"; } - -.fa-users:before { - content: "\f0c0"; } - -.fa-users-cog:before { - content: "\f509"; } - -.fa-ussunnah:before { - content: "\f407"; } - -.fa-utensil-spoon:before { - content: "\f2e5"; } - -.fa-utensils:before { - content: "\f2e7"; } - -.fa-vaadin:before { - content: "\f408"; } - -.fa-vector-square:before { - content: "\f5cb"; } - -.fa-venus:before { - content: "\f221"; } - -.fa-venus-double:before { - content: "\f226"; } - -.fa-venus-mars:before { - content: "\f228"; } - -.fa-viacoin:before { - content: "\f237"; } - -.fa-viadeo:before { - content: "\f2a9"; } - -.fa-viadeo-square:before { - content: "\f2aa"; } - -.fa-vial:before { - content: "\f492"; } - -.fa-vials:before { - content: "\f493"; } - -.fa-viber:before { - content: "\f409"; } - -.fa-video:before { - content: "\f03d"; } - -.fa-video-slash:before { - content: "\f4e2"; } - -.fa-vihara:before { - content: "\f6a7"; } - -.fa-vimeo:before { - content: "\f40a"; } - -.fa-vimeo-square:before { - content: "\f194"; } - -.fa-vimeo-v:before { - content: "\f27d"; } - -.fa-vine:before { - content: "\f1ca"; } - -.fa-vk:before { - content: "\f189"; } - -.fa-vnv:before { - content: "\f40b"; } - -.fa-volleyball-ball:before { - content: "\f45f"; } - -.fa-volume-down:before { - content: "\f027"; } - -.fa-volume-mute:before { - content: "\f6a9"; } - -.fa-volume-off:before { - content: "\f026"; } - -.fa-volume-up:before { - content: "\f028"; } - -.fa-vuejs:before { - content: "\f41f"; } - -.fa-walking:before { - content: "\f554"; } - -.fa-wallet:before { - content: "\f555"; } - -.fa-warehouse:before { - content: "\f494"; } - -.fa-weebly:before { - content: "\f5cc"; } - -.fa-weibo:before { - content: "\f18a"; } - -.fa-weight:before { - content: "\f496"; } - -.fa-weight-hanging:before { - content: "\f5cd"; } - -.fa-weixin:before { - content: "\f1d7"; } - -.fa-whatsapp:before { - content: "\f232"; } - -.fa-whatsapp-square:before { - content: "\f40c"; } - -.fa-wheelchair:before { - content: "\f193"; } - -.fa-whmcs:before { - content: "\f40d"; } - -.fa-wifi:before { - content: "\f1eb"; } - -.fa-wikipedia-w:before { - content: "\f266"; } - -.fa-wind:before { - content: "\f72e"; } - -.fa-window-close:before { - content: "\f410"; } - -.fa-window-maximize:before { - content: "\f2d0"; } - -.fa-window-minimize:before { - content: "\f2d1"; } - -.fa-window-restore:before { - content: "\f2d2"; } - -.fa-windows:before { - content: "\f17a"; } - -.fa-wine-bottle:before { - content: "\f72f"; } - -.fa-wine-glass:before { - content: "\f4e3"; } - -.fa-wine-glass-alt:before { - content: "\f5ce"; } - -.fa-wix:before { - content: "\f5cf"; } - -.fa-wizards-of-the-coast:before { - content: "\f730"; } - -.fa-wolf-pack-battalion:before { - content: "\f514"; } - -.fa-won-sign:before { - content: "\f159"; } - -.fa-wordpress:before { - content: "\f19a"; } - -.fa-wordpress-simple:before { - content: "\f411"; } - -.fa-wpbeginner:before { - content: "\f297"; } - -.fa-wpexplorer:before { - content: "\f2de"; } - -.fa-wpforms:before { - content: "\f298"; } - -.fa-wrench:before { - content: "\f0ad"; } - -.fa-x-ray:before { - content: "\f497"; } - -.fa-xbox:before { - content: "\f412"; } - -.fa-xing:before { - content: "\f168"; } - -.fa-xing-square:before { - content: "\f169"; } - -.fa-y-combinator:before { - content: "\f23b"; } - -.fa-yahoo:before { - content: "\f19e"; } - -.fa-yandex:before { - content: "\f413"; } - -.fa-yandex-international:before { - content: "\f414"; } - -.fa-yelp:before { - content: "\f1e9"; } - -.fa-yen-sign:before { - content: "\f157"; } - -.fa-yin-yang:before { - content: "\f6ad"; } - -.fa-yoast:before { - content: "\f2b1"; } - -.fa-youtube:before { - content: "\f167"; } - -.fa-youtube-square:before { - content: "\f431"; } - -.fa-zhihu:before { - content: "\f63f"; } - -.sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; } - -.fab { - font-family: 'Font Awesome 5 Brands'; } - -.far { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa, -.fas { - font-family: 'Font Awesome 5 Free'; - font-weight: 900; } diff --git a/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css b/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css deleted file mode 100644 index 1bf10857a..000000000 --- a/src/main/resources/gwt/material/design/incubator/client/icon/fontawesome/resources/css/fontawesome-all.min.css +++ /dev/null @@ -1,3932 +0,0 @@ -/*! - * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -.fa, -.fas, -.far, -.fal, -.fab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; } - -.fa-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; } - -.fa-xs { - font-size: .75em; } - -.fa-sm { - font-size: .875em; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: 2.5em; - padding-left: 0; } -.fa-ul > li { - position: relative; } - -.fa-li { - left: -2em; - position: absolute; - text-align: center; - width: 2em; - line-height: inherit; } - -.fa-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; } - -.fa-pull-left { - float: left; } - -.fa-pull-right { - float: right; } - -.fa.fa-pull-left, -.fas.fa-pull-left, -.far.fa-pull-left, -.fal.fa-pull-left, -.fab.fa-pull-left { - margin-right: .3em; } - -.fa.fa-pull-right, -.fas.fa-pull-right, -.far.fa-pull-right, -.fal.fa-pull-right, -.fab.fa-pull-right { - margin-left: .3em; } - -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; } - -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); } - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); } - -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); } - -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); } - -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); } - -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); } - -.fa-flip-horizontal.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); } - -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - -webkit-filter: none; - filter: none; } - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2em; } - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; } - -.fa-stack-1x { - line-height: inherit; } - -.fa-stack-2x { - font-size: 2em; } - -.fa-inverse { - color: #fff; } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ -.fa-500px:before { - content: "\f26e"; } - -.fa-accessible-icon:before { - content: "\f368"; } - -.fa-accusoft:before { - content: "\f369"; } - -.fa-acquisitions-incorporated:before { - content: "\f6af"; } - -.fa-ad:before { - content: "\f641"; } - -.fa-address-book:before { - content: "\f2b9"; } - -.fa-address-card:before { - content: "\f2bb"; } - -.fa-adjust:before { - content: "\f042"; } - -.fa-adn:before { - content: "\f170"; } - -.fa-adversal:before { - content: "\f36a"; } - -.fa-affiliatetheme:before { - content: "\f36b"; } - -.fa-air-freshener:before { - content: "\f5d0"; } - -.fa-algolia:before { - content: "\f36c"; } - -.fa-align-center:before { - content: "\f037"; } - -.fa-align-justify:before { - content: "\f039"; } - -.fa-align-left:before { - content: "\f036"; } - -.fa-align-right:before { - content: "\f038"; } - -.fa-alipay:before { - content: "\f642"; } - -.fa-allergies:before { - content: "\f461"; } - -.fa-amazon:before { - content: "\f270"; } - -.fa-amazon-pay:before { - content: "\f42c"; } - -.fa-ambulance:before { - content: "\f0f9"; } - -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; } - -.fa-amilia:before { - content: "\f36d"; } - -.fa-anchor:before { - content: "\f13d"; } - -.fa-android:before { - content: "\f17b"; } - -.fa-angellist:before { - content: "\f209"; } - -.fa-angle-double-down:before { - content: "\f103"; } - -.fa-angle-double-left:before { - content: "\f100"; } - -.fa-angle-double-right:before { - content: "\f101"; } - -.fa-angle-double-up:before { - content: "\f102"; } - -.fa-angle-down:before { - content: "\f107"; } - -.fa-angle-left:before { - content: "\f104"; } - -.fa-angle-right:before { - content: "\f105"; } - -.fa-angle-up:before { - content: "\f106"; } - -.fa-angry:before { - content: "\f556"; } - -.fa-angrycreative:before { - content: "\f36e"; } - -.fa-angular:before { - content: "\f420"; } - -.fa-ankh:before { - content: "\f644"; } - -.fa-app-store:before { - content: "\f36f"; } - -.fa-app-store-ios:before { - content: "\f370"; } - -.fa-apper:before { - content: "\f371"; } - -.fa-apple:before { - content: "\f179"; } - -.fa-apple-alt:before { - content: "\f5d1"; } - -.fa-apple-pay:before { - content: "\f415"; } - -.fa-archive:before { - content: "\f187"; } - -.fa-archway:before { - content: "\f557"; } - -.fa-arrow-alt-circle-down:before { - content: "\f358"; } - -.fa-arrow-alt-circle-left:before { - content: "\f359"; } - -.fa-arrow-alt-circle-right:before { - content: "\f35a"; } - -.fa-arrow-alt-circle-up:before { - content: "\f35b"; } - -.fa-arrow-circle-down:before { - content: "\f0ab"; } - -.fa-arrow-circle-left:before { - content: "\f0a8"; } - -.fa-arrow-circle-right:before { - content: "\f0a9"; } - -.fa-arrow-circle-up:before { - content: "\f0aa"; } - -.fa-arrow-down:before { - content: "\f063"; } - -.fa-arrow-left:before { - content: "\f060"; } - -.fa-arrow-right:before { - content: "\f061"; } - -.fa-arrow-up:before { - content: "\f062"; } - -.fa-arrows-alt:before { - content: "\f0b2"; } - -.fa-arrows-alt-h:before { - content: "\f337"; } - -.fa-arrows-alt-v:before { - content: "\f338"; } - -.fa-assistive-listening-systems:before { - content: "\f2a2"; } - -.fa-asterisk:before { - content: "\f069"; } - -.fa-asymmetrik:before { - content: "\f372"; } - -.fa-at:before { - content: "\f1fa"; } - -.fa-atlas:before { - content: "\f558"; } - -.fa-atom:before { - content: "\f5d2"; } - -.fa-audible:before { - content: "\f373"; } - -.fa-audio-description:before { - content: "\f29e"; } - -.fa-autoprefixer:before { - content: "\f41c"; } - -.fa-avianex:before { - content: "\f374"; } - -.fa-aviato:before { - content: "\f421"; } - -.fa-award:before { - content: "\f559"; } - -.fa-aws:before { - content: "\f375"; } - -.fa-backspace:before { - content: "\f55a"; } - -.fa-backward:before { - content: "\f04a"; } - -.fa-balance-scale:before { - content: "\f24e"; } - -.fa-ban:before { - content: "\f05e"; } - -.fa-band-aid:before { - content: "\f462"; } - -.fa-bandcamp:before { - content: "\f2d5"; } - -.fa-barcode:before { - content: "\f02a"; } - -.fa-bars:before { - content: "\f0c9"; } - -.fa-baseball-ball:before { - content: "\f433"; } - -.fa-basketball-ball:before { - content: "\f434"; } - -.fa-bath:before { - content: "\f2cd"; } - -.fa-battery-empty:before { - content: "\f244"; } - -.fa-battery-full:before { - content: "\f240"; } - -.fa-battery-half:before { - content: "\f242"; } - -.fa-battery-quarter:before { - content: "\f243"; } - -.fa-battery-three-quarters:before { - content: "\f241"; } - -.fa-bed:before { - content: "\f236"; } - -.fa-beer:before { - content: "\f0fc"; } - -.fa-behance:before { - content: "\f1b4"; } - -.fa-behance-square:before { - content: "\f1b5"; } - -.fa-bell:before { - content: "\f0f3"; } - -.fa-bell-slash:before { - content: "\f1f6"; } - -.fa-bezier-curve:before { - content: "\f55b"; } - -.fa-bible:before { - content: "\f647"; } - -.fa-bicycle:before { - content: "\f206"; } - -.fa-bimobject:before { - content: "\f378"; } - -.fa-binoculars:before { - content: "\f1e5"; } - -.fa-birthday-cake:before { - content: "\f1fd"; } - -.fa-bitbucket:before { - content: "\f171"; } - -.fa-bitcoin:before { - content: "\f379"; } - -.fa-bity:before { - content: "\f37a"; } - -.fa-black-tie:before { - content: "\f27e"; } - -.fa-blackberry:before { - content: "\f37b"; } - -.fa-blender:before { - content: "\f517"; } - -.fa-blender-phone:before { - content: "\f6b6"; } - -.fa-blind:before { - content: "\f29d"; } - -.fa-blogger:before { - content: "\f37c"; } - -.fa-blogger-b:before { - content: "\f37d"; } - -.fa-bluetooth:before { - content: "\f293"; } - -.fa-bluetooth-b:before { - content: "\f294"; } - -.fa-bold:before { - content: "\f032"; } - -.fa-bolt:before { - content: "\f0e7"; } - -.fa-bomb:before { - content: "\f1e2"; } - -.fa-bone:before { - content: "\f5d7"; } - -.fa-bong:before { - content: "\f55c"; } - -.fa-book:before { - content: "\f02d"; } - -.fa-book-dead:before { - content: "\f6b7"; } - -.fa-book-open:before { - content: "\f518"; } - -.fa-book-reader:before { - content: "\f5da"; } - -.fa-bookmark:before { - content: "\f02e"; } - -.fa-bowling-ball:before { - content: "\f436"; } - -.fa-box:before { - content: "\f466"; } - -.fa-box-open:before { - content: "\f49e"; } - -.fa-boxes:before { - content: "\f468"; } - -.fa-braille:before { - content: "\f2a1"; } - -.fa-brain:before { - content: "\f5dc"; } - -.fa-briefcase:before { - content: "\f0b1"; } - -.fa-briefcase-medical:before { - content: "\f469"; } - -.fa-broadcast-tower:before { - content: "\f519"; } - -.fa-broom:before { - content: "\f51a"; } - -.fa-brush:before { - content: "\f55d"; } - -.fa-btc:before { - content: "\f15a"; } - -.fa-bug:before { - content: "\f188"; } - -.fa-building:before { - content: "\f1ad"; } - -.fa-bullhorn:before { - content: "\f0a1"; } - -.fa-bullseye:before { - content: "\f140"; } - -.fa-burn:before { - content: "\f46a"; } - -.fa-buromobelexperte:before { - content: "\f37f"; } - -.fa-bus:before { - content: "\f207"; } - -.fa-bus-alt:before { - content: "\f55e"; } - -.fa-business-time:before { - content: "\f64a"; } - -.fa-buysellads:before { - content: "\f20d"; } - -.fa-calculator:before { - content: "\f1ec"; } - -.fa-calendar:before { - content: "\f133"; } - -.fa-calendar-alt:before { - content: "\f073"; } - -.fa-calendar-check:before { - content: "\f274"; } - -.fa-calendar-minus:before { - content: "\f272"; } - -.fa-calendar-plus:before { - content: "\f271"; } - -.fa-calendar-times:before { - content: "\f273"; } - -.fa-camera:before { - content: "\f030"; } - -.fa-camera-retro:before { - content: "\f083"; } - -.fa-campground:before { - content: "\f6bb"; } - -.fa-cannabis:before { - content: "\f55f"; } - -.fa-capsules:before { - content: "\f46b"; } - -.fa-car:before { - content: "\f1b9"; } - -.fa-car-alt:before { - content: "\f5de"; } - -.fa-car-battery:before { - content: "\f5df"; } - -.fa-car-crash:before { - content: "\f5e1"; } - -.fa-car-side:before { - content: "\f5e4"; } - -.fa-caret-down:before { - content: "\f0d7"; } - -.fa-caret-left:before { - content: "\f0d9"; } - -.fa-caret-right:before { - content: "\f0da"; } - -.fa-caret-square-down:before { - content: "\f150"; } - -.fa-caret-square-left:before { - content: "\f191"; } - -.fa-caret-square-right:before { - content: "\f152"; } - -.fa-caret-square-up:before { - content: "\f151"; } - -.fa-caret-up:before { - content: "\f0d8"; } - -.fa-cart-arrow-down:before { - content: "\f218"; } - -.fa-cart-plus:before { - content: "\f217"; } - -.fa-cat:before { - content: "\f6be"; } - -.fa-cc-amazon-pay:before { - content: "\f42d"; } - -.fa-cc-amex:before { - content: "\f1f3"; } - -.fa-cc-apple-pay:before { - content: "\f416"; } - -.fa-cc-diners-club:before { - content: "\f24c"; } - -.fa-cc-discover:before { - content: "\f1f2"; } - -.fa-cc-jcb:before { - content: "\f24b"; } - -.fa-cc-mastercard:before { - content: "\f1f1"; } - -.fa-cc-paypal:before { - content: "\f1f4"; } - -.fa-cc-stripe:before { - content: "\f1f5"; } - -.fa-cc-visa:before { - content: "\f1f0"; } - -.fa-centercode:before { - content: "\f380"; } - -.fa-certificate:before { - content: "\f0a3"; } - -.fa-chair:before { - content: "\f6c0"; } - -.fa-chalkboard:before { - content: "\f51b"; } - -.fa-chalkboard-teacher:before { - content: "\f51c"; } - -.fa-charging-station:before { - content: "\f5e7"; } - -.fa-chart-area:before { - content: "\f1fe"; } - -.fa-chart-bar:before { - content: "\f080"; } - -.fa-chart-line:before { - content: "\f201"; } - -.fa-chart-pie:before { - content: "\f200"; } - -.fa-check:before { - content: "\f00c"; } - -.fa-check-circle:before { - content: "\f058"; } - -.fa-check-double:before { - content: "\f560"; } - -.fa-check-square:before { - content: "\f14a"; } - -.fa-chess:before { - content: "\f439"; } - -.fa-chess-bishop:before { - content: "\f43a"; } - -.fa-chess-board:before { - content: "\f43c"; } - -.fa-chess-king:before { - content: "\f43f"; } - -.fa-chess-knight:before { - content: "\f441"; } - -.fa-chess-pawn:before { - content: "\f443"; } - -.fa-chess-queen:before { - content: "\f445"; } - -.fa-chess-rook:before { - content: "\f447"; } - -.fa-chevron-circle-down:before { - content: "\f13a"; } - -.fa-chevron-circle-left:before { - content: "\f137"; } - -.fa-chevron-circle-right:before { - content: "\f138"; } - -.fa-chevron-circle-up:before { - content: "\f139"; } - -.fa-chevron-down:before { - content: "\f078"; } - -.fa-chevron-left:before { - content: "\f053"; } - -.fa-chevron-right:before { - content: "\f054"; } - -.fa-chevron-up:before { - content: "\f077"; } - -.fa-child:before { - content: "\f1ae"; } - -.fa-chrome:before { - content: "\f268"; } - -.fa-church:before { - content: "\f51d"; } - -.fa-circle:before { - content: "\f111"; } - -.fa-circle-notch:before { - content: "\f1ce"; } - -.fa-city:before { - content: "\f64f"; } - -.fa-clipboard:before { - content: "\f328"; } - -.fa-clipboard-check:before { - content: "\f46c"; } - -.fa-clipboard-list:before { - content: "\f46d"; } - -.fa-clock:before { - content: "\f017"; } - -.fa-clone:before { - content: "\f24d"; } - -.fa-closed-captioning:before { - content: "\f20a"; } - -.fa-cloud:before { - content: "\f0c2"; } - -.fa-cloud-download-alt:before { - content: "\f381"; } - -.fa-cloud-moon:before { - content: "\f6c3"; } - -.fa-cloud-sun:before { - content: "\f6c4"; } - -.fa-cloud-upload-alt:before { - content: "\f382"; } - -.fa-cloudscale:before { - content: "\f383"; } - -.fa-cloudsmith:before { - content: "\f384"; } - -.fa-cloudversify:before { - content: "\f385"; } - -.fa-cocktail:before { - content: "\f561"; } - -.fa-code:before { - content: "\f121"; } - -.fa-code-branch:before { - content: "\f126"; } - -.fa-codepen:before { - content: "\f1cb"; } - -.fa-codiepie:before { - content: "\f284"; } - -.fa-coffee:before { - content: "\f0f4"; } - -.fa-cog:before { - content: "\f013"; } - -.fa-cogs:before { - content: "\f085"; } - -.fa-coins:before { - content: "\f51e"; } - -.fa-columns:before { - content: "\f0db"; } - -.fa-comment:before { - content: "\f075"; } - -.fa-comment-alt:before { - content: "\f27a"; } - -.fa-comment-dollar:before { - content: "\f651"; } - -.fa-comment-dots:before { - content: "\f4ad"; } - -.fa-comment-slash:before { - content: "\f4b3"; } - -.fa-comments:before { - content: "\f086"; } - -.fa-comments-dollar:before { - content: "\f653"; } - -.fa-compact-disc:before { - content: "\f51f"; } - -.fa-compass:before { - content: "\f14e"; } - -.fa-compress:before { - content: "\f066"; } - -.fa-concierge-bell:before { - content: "\f562"; } - -.fa-connectdevelop:before { - content: "\f20e"; } - -.fa-contao:before { - content: "\f26d"; } - -.fa-cookie:before { - content: "\f563"; } - -.fa-cookie-bite:before { - content: "\f564"; } - -.fa-copy:before { - content: "\f0c5"; } - -.fa-copyright:before { - content: "\f1f9"; } - -.fa-couch:before { - content: "\f4b8"; } - -.fa-cpanel:before { - content: "\f388"; } - -.fa-creative-commons:before { - content: "\f25e"; } - -.fa-creative-commons-by:before { - content: "\f4e7"; } - -.fa-creative-commons-nc:before { - content: "\f4e8"; } - -.fa-creative-commons-nc-eu:before { - content: "\f4e9"; } - -.fa-creative-commons-nc-jp:before { - content: "\f4ea"; } - -.fa-creative-commons-nd:before { - content: "\f4eb"; } - -.fa-creative-commons-pd:before { - content: "\f4ec"; } - -.fa-creative-commons-pd-alt:before { - content: "\f4ed"; } - -.fa-creative-commons-remix:before { - content: "\f4ee"; } - -.fa-creative-commons-sa:before { - content: "\f4ef"; } - -.fa-creative-commons-sampling:before { - content: "\f4f0"; } - -.fa-creative-commons-sampling-plus:before { - content: "\f4f1"; } - -.fa-creative-commons-share:before { - content: "\f4f2"; } - -.fa-creative-commons-zero:before { - content: "\f4f3"; } - -.fa-credit-card:before { - content: "\f09d"; } - -.fa-critical-role:before { - content: "\f6c9"; } - -.fa-crop:before { - content: "\f125"; } - -.fa-crop-alt:before { - content: "\f565"; } - -.fa-cross:before { - content: "\f654"; } - -.fa-crosshairs:before { - content: "\f05b"; } - -.fa-crow:before { - content: "\f520"; } - -.fa-crown:before { - content: "\f521"; } - -.fa-css3:before { - content: "\f13c"; } - -.fa-css3-alt:before { - content: "\f38b"; } - -.fa-cube:before { - content: "\f1b2"; } - -.fa-cubes:before { - content: "\f1b3"; } - -.fa-cut:before { - content: "\f0c4"; } - -.fa-cuttlefish:before { - content: "\f38c"; } - -.fa-d-and-d:before { - content: "\f38d"; } - -.fa-dashcube:before { - content: "\f210"; } - -.fa-database:before { - content: "\f1c0"; } - -.fa-deaf:before { - content: "\f2a4"; } - -.fa-delicious:before { - content: "\f1a5"; } - -.fa-deploydog:before { - content: "\f38e"; } - -.fa-deskpro:before { - content: "\f38f"; } - -.fa-desktop:before { - content: "\f108"; } - -.fa-dev:before { - content: "\f6cc"; } - -.fa-deviantart:before { - content: "\f1bd"; } - -.fa-dharmachakra:before { - content: "\f655"; } - -.fa-diagnoses:before { - content: "\f470"; } - -.fa-dice:before { - content: "\f522"; } - -.fa-dice-d20:before { - content: "\f6cf"; } - -.fa-dice-d6:before { - content: "\f6d1"; } - -.fa-dice-five:before { - content: "\f523"; } - -.fa-dice-four:before { - content: "\f524"; } - -.fa-dice-one:before { - content: "\f525"; } - -.fa-dice-six:before { - content: "\f526"; } - -.fa-dice-three:before { - content: "\f527"; } - -.fa-dice-two:before { - content: "\f528"; } - -.fa-digg:before { - content: "\f1a6"; } - -.fa-digital-ocean:before { - content: "\f391"; } - -.fa-digital-tachograph:before { - content: "\f566"; } - -.fa-directions:before { - content: "\f5eb"; } - -.fa-discord:before { - content: "\f392"; } - -.fa-discourse:before { - content: "\f393"; } - -.fa-divide:before { - content: "\f529"; } - -.fa-dizzy:before { - content: "\f567"; } - -.fa-dna:before { - content: "\f471"; } - -.fa-dochub:before { - content: "\f394"; } - -.fa-docker:before { - content: "\f395"; } - -.fa-dog:before { - content: "\f6d3"; } - -.fa-dollar-sign:before { - content: "\f155"; } - -.fa-dolly:before { - content: "\f472"; } - -.fa-dolly-flatbed:before { - content: "\f474"; } - -.fa-donate:before { - content: "\f4b9"; } - -.fa-door-closed:before { - content: "\f52a"; } - -.fa-door-open:before { - content: "\f52b"; } - -.fa-dot-circle:before { - content: "\f192"; } - -.fa-dove:before { - content: "\f4ba"; } - -.fa-download:before { - content: "\f019"; } - -.fa-draft2digital:before { - content: "\f396"; } - -.fa-drafting-compass:before { - content: "\f568"; } - -.fa-dragon:before { - content: "\f6d5"; } - -.fa-draw-polygon:before { - content: "\f5ee"; } - -.fa-dribbble:before { - content: "\f17d"; } - -.fa-dribbble-square:before { - content: "\f397"; } - -.fa-dropbox:before { - content: "\f16b"; } - -.fa-drum:before { - content: "\f569"; } - -.fa-drum-steelpan:before { - content: "\f56a"; } - -.fa-drumstick-bite:before { - content: "\f6d7"; } - -.fa-drupal:before { - content: "\f1a9"; } - -.fa-dumbbell:before { - content: "\f44b"; } - -.fa-dungeon:before { - content: "\f6d9"; } - -.fa-dyalog:before { - content: "\f399"; } - -.fa-earlybirds:before { - content: "\f39a"; } - -.fa-ebay:before { - content: "\f4f4"; } - -.fa-edge:before { - content: "\f282"; } - -.fa-edit:before { - content: "\f044"; } - -.fa-eject:before { - content: "\f052"; } - -.fa-elementor:before { - content: "\f430"; } - -.fa-ellipsis-h:before { - content: "\f141"; } - -.fa-ellipsis-v:before { - content: "\f142"; } - -.fa-ello:before { - content: "\f5f1"; } - -.fa-ember:before { - content: "\f423"; } - -.fa-empire:before { - content: "\f1d1"; } - -.fa-envelope:before { - content: "\f0e0"; } - -.fa-envelope-open:before { - content: "\f2b6"; } - -.fa-envelope-open-text:before { - content: "\f658"; } - -.fa-envelope-square:before { - content: "\f199"; } - -.fa-envira:before { - content: "\f299"; } - -.fa-equals:before { - content: "\f52c"; } - -.fa-eraser:before { - content: "\f12d"; } - -.fa-erlang:before { - content: "\f39d"; } - -.fa-ethereum:before { - content: "\f42e"; } - -.fa-etsy:before { - content: "\f2d7"; } - -.fa-euro-sign:before { - content: "\f153"; } - -.fa-exchange-alt:before { - content: "\f362"; } - -.fa-exclamation:before { - content: "\f12a"; } - -.fa-exclamation-circle:before { - content: "\f06a"; } - -.fa-exclamation-triangle:before { - content: "\f071"; } - -.fa-expand:before { - content: "\f065"; } - -.fa-expand-arrows-alt:before { - content: "\f31e"; } - -.fa-expeditedssl:before { - content: "\f23e"; } - -.fa-external-link-alt:before { - content: "\f35d"; } - -.fa-external-link-square-alt:before { - content: "\f360"; } - -.fa-eye:before { - content: "\f06e"; } - -.fa-eye-dropper:before { - content: "\f1fb"; } - -.fa-eye-slash:before { - content: "\f070"; } - -.fa-facebook:before { - content: "\f09a"; } - -.fa-facebook-f:before { - content: "\f39e"; } - -.fa-facebook-messenger:before { - content: "\f39f"; } - -.fa-facebook-square:before { - content: "\f082"; } - -.fa-fantasy-flight-games:before { - content: "\f6dc"; } - -.fa-fast-backward:before { - content: "\f049"; } - -.fa-fast-forward:before { - content: "\f050"; } - -.fa-fax:before { - content: "\f1ac"; } - -.fa-feather:before { - content: "\f52d"; } - -.fa-feather-alt:before { - content: "\f56b"; } - -.fa-female:before { - content: "\f182"; } - -.fa-fighter-jet:before { - content: "\f0fb"; } - -.fa-file:before { - content: "\f15b"; } - -.fa-file-alt:before { - content: "\f15c"; } - -.fa-file-archive:before { - content: "\f1c6"; } - -.fa-file-audio:before { - content: "\f1c7"; } - -.fa-file-code:before { - content: "\f1c9"; } - -.fa-file-contract:before { - content: "\f56c"; } - -.fa-file-csv:before { - content: "\f6dd"; } - -.fa-file-download:before { - content: "\f56d"; } - -.fa-file-excel:before { - content: "\f1c3"; } - -.fa-file-export:before { - content: "\f56e"; } - -.fa-file-image:before { - content: "\f1c5"; } - -.fa-file-import:before { - content: "\f56f"; } - -.fa-file-invoice:before { - content: "\f570"; } - -.fa-file-invoice-dollar:before { - content: "\f571"; } - -.fa-file-medical:before { - content: "\f477"; } - -.fa-file-medical-alt:before { - content: "\f478"; } - -.fa-file-pdf:before { - content: "\f1c1"; } - -.fa-file-powerpoint:before { - content: "\f1c4"; } - -.fa-file-prescription:before { - content: "\f572"; } - -.fa-file-signature:before { - content: "\f573"; } - -.fa-file-upload:before { - content: "\f574"; } - -.fa-file-video:before { - content: "\f1c8"; } - -.fa-file-word:before { - content: "\f1c2"; } - -.fa-fill:before { - content: "\f575"; } - -.fa-fill-drip:before { - content: "\f576"; } - -.fa-film:before { - content: "\f008"; } - -.fa-filter:before { - content: "\f0b0"; } - -.fa-fingerprint:before { - content: "\f577"; } - -.fa-fire:before { - content: "\f06d"; } - -.fa-fire-extinguisher:before { - content: "\f134"; } - -.fa-firefox:before { - content: "\f269"; } - -.fa-first-aid:before { - content: "\f479"; } - -.fa-first-order:before { - content: "\f2b0"; } - -.fa-first-order-alt:before { - content: "\f50a"; } - -.fa-firstdraft:before { - content: "\f3a1"; } - -.fa-fish:before { - content: "\f578"; } - -.fa-fist-raised:before { - content: "\f6de"; } - -.fa-flag:before { - content: "\f024"; } - -.fa-flag-checkered:before { - content: "\f11e"; } - -.fa-flask:before { - content: "\f0c3"; } - -.fa-flickr:before { - content: "\f16e"; } - -.fa-flipboard:before { - content: "\f44d"; } - -.fa-flushed:before { - content: "\f579"; } - -.fa-fly:before { - content: "\f417"; } - -.fa-folder:before { - content: "\f07b"; } - -.fa-folder-minus:before { - content: "\f65d"; } - -.fa-folder-open:before { - content: "\f07c"; } - -.fa-folder-plus:before { - content: "\f65e"; } - -.fa-font:before { - content: "\f031"; } - -.fa-font-awesome:before { - content: "\f2b4"; } - -.fa-font-awesome-alt:before { - content: "\f35c"; } - -.fa-font-awesome-flag:before { - content: "\f425"; } - -.fa-font-awesome-logo-full:before { - content: "\f4e6"; } - -.fa-fonticons:before { - content: "\f280"; } - -.fa-fonticons-fi:before { - content: "\f3a2"; } - -.fa-football-ball:before { - content: "\f44e"; } - -.fa-fort-awesome:before { - content: "\f286"; } - -.fa-fort-awesome-alt:before { - content: "\f3a3"; } - -.fa-forumbee:before { - content: "\f211"; } - -.fa-forward:before { - content: "\f04e"; } - -.fa-foursquare:before { - content: "\f180"; } - -.fa-free-code-camp:before { - content: "\f2c5"; } - -.fa-freebsd:before { - content: "\f3a4"; } - -.fa-frog:before { - content: "\f52e"; } - -.fa-frown:before { - content: "\f119"; } - -.fa-frown-open:before { - content: "\f57a"; } - -.fa-fulcrum:before { - content: "\f50b"; } - -.fa-funnel-dollar:before { - content: "\f662"; } - -.fa-futbol:before { - content: "\f1e3"; } - -.fa-galactic-republic:before { - content: "\f50c"; } - -.fa-galactic-senate:before { - content: "\f50d"; } - -.fa-gamepad:before { - content: "\f11b"; } - -.fa-gas-pump:before { - content: "\f52f"; } - -.fa-gavel:before { - content: "\f0e3"; } - -.fa-gem:before { - content: "\f3a5"; } - -.fa-genderless:before { - content: "\f22d"; } - -.fa-get-pocket:before { - content: "\f265"; } - -.fa-gg:before { - content: "\f260"; } - -.fa-gg-circle:before { - content: "\f261"; } - -.fa-ghost:before { - content: "\f6e2"; } - -.fa-gift:before { - content: "\f06b"; } - -.fa-git:before { - content: "\f1d3"; } - -.fa-git-square:before { - content: "\f1d2"; } - -.fa-github:before { - content: "\f09b"; } - -.fa-github-alt:before { - content: "\f113"; } - -.fa-github-square:before { - content: "\f092"; } - -.fa-gitkraken:before { - content: "\f3a6"; } - -.fa-gitlab:before { - content: "\f296"; } - -.fa-gitter:before { - content: "\f426"; } - -.fa-glass-martini:before { - content: "\f000"; } - -.fa-glass-martini-alt:before { - content: "\f57b"; } - -.fa-glasses:before { - content: "\f530"; } - -.fa-glide:before { - content: "\f2a5"; } - -.fa-glide-g:before { - content: "\f2a6"; } - -.fa-globe:before { - content: "\f0ac"; } - -.fa-globe-africa:before { - content: "\f57c"; } - -.fa-globe-americas:before { - content: "\f57d"; } - -.fa-globe-asia:before { - content: "\f57e"; } - -.fa-gofore:before { - content: "\f3a7"; } - -.fa-golf-ball:before { - content: "\f450"; } - -.fa-goodreads:before { - content: "\f3a8"; } - -.fa-goodreads-g:before { - content: "\f3a9"; } - -.fa-google:before { - content: "\f1a0"; } - -.fa-google-drive:before { - content: "\f3aa"; } - -.fa-google-play:before { - content: "\f3ab"; } - -.fa-google-plus:before { - content: "\f2b3"; } - -.fa-google-plus-g:before { - content: "\f0d5"; } - -.fa-google-plus-square:before { - content: "\f0d4"; } - -.fa-google-wallet:before { - content: "\f1ee"; } - -.fa-gopuram:before { - content: "\f664"; } - -.fa-graduation-cap:before { - content: "\f19d"; } - -.fa-gratipay:before { - content: "\f184"; } - -.fa-grav:before { - content: "\f2d6"; } - -.fa-greater-than:before { - content: "\f531"; } - -.fa-greater-than-equal:before { - content: "\f532"; } - -.fa-grimace:before { - content: "\f57f"; } - -.fa-grin:before { - content: "\f580"; } - -.fa-grin-alt:before { - content: "\f581"; } - -.fa-grin-beam:before { - content: "\f582"; } - -.fa-grin-beam-sweat:before { - content: "\f583"; } - -.fa-grin-hearts:before { - content: "\f584"; } - -.fa-grin-squint:before { - content: "\f585"; } - -.fa-grin-squint-tears:before { - content: "\f586"; } - -.fa-grin-stars:before { - content: "\f587"; } - -.fa-grin-tears:before { - content: "\f588"; } - -.fa-grin-tongue:before { - content: "\f589"; } - -.fa-grin-tongue-squint:before { - content: "\f58a"; } - -.fa-grin-tongue-wink:before { - content: "\f58b"; } - -.fa-grin-wink:before { - content: "\f58c"; } - -.fa-grip-horizontal:before { - content: "\f58d"; } - -.fa-grip-vertical:before { - content: "\f58e"; } - -.fa-gripfire:before { - content: "\f3ac"; } - -.fa-grunt:before { - content: "\f3ad"; } - -.fa-gulp:before { - content: "\f3ae"; } - -.fa-h-square:before { - content: "\f0fd"; } - -.fa-hacker-news:before { - content: "\f1d4"; } - -.fa-hacker-news-square:before { - content: "\f3af"; } - -.fa-hackerrank:before { - content: "\f5f7"; } - -.fa-hammer:before { - content: "\f6e3"; } - -.fa-hamsa:before { - content: "\f665"; } - -.fa-hand-holding:before { - content: "\f4bd"; } - -.fa-hand-holding-heart:before { - content: "\f4be"; } - -.fa-hand-holding-usd:before { - content: "\f4c0"; } - -.fa-hand-lizard:before { - content: "\f258"; } - -.fa-hand-paper:before { - content: "\f256"; } - -.fa-hand-peace:before { - content: "\f25b"; } - -.fa-hand-point-down:before { - content: "\f0a7"; } - -.fa-hand-point-left:before { - content: "\f0a5"; } - -.fa-hand-point-right:before { - content: "\f0a4"; } - -.fa-hand-point-up:before { - content: "\f0a6"; } - -.fa-hand-pointer:before { - content: "\f25a"; } - -.fa-hand-rock:before { - content: "\f255"; } - -.fa-hand-scissors:before { - content: "\f257"; } - -.fa-hand-spock:before { - content: "\f259"; } - -.fa-hands:before { - content: "\f4c2"; } - -.fa-hands-helping:before { - content: "\f4c4"; } - -.fa-handshake:before { - content: "\f2b5"; } - -.fa-hanukiah:before { - content: "\f6e6"; } - -.fa-hashtag:before { - content: "\f292"; } - -.fa-hat-wizard:before { - content: "\f6e8"; } - -.fa-haykal:before { - content: "\f666"; } - -.fa-hdd:before { - content: "\f0a0"; } - -.fa-heading:before { - content: "\f1dc"; } - -.fa-headphones:before { - content: "\f025"; } - -.fa-headphones-alt:before { - content: "\f58f"; } - -.fa-headset:before { - content: "\f590"; } - -.fa-heart:before { - content: "\f004"; } - -.fa-heartbeat:before { - content: "\f21e"; } - -.fa-helicopter:before { - content: "\f533"; } - -.fa-highlighter:before { - content: "\f591"; } - -.fa-hiking:before { - content: "\f6ec"; } - -.fa-hippo:before { - content: "\f6ed"; } - -.fa-hips:before { - content: "\f452"; } - -.fa-hire-a-helper:before { - content: "\f3b0"; } - -.fa-history:before { - content: "\f1da"; } - -.fa-hockey-puck:before { - content: "\f453"; } - -.fa-home:before { - content: "\f015"; } - -.fa-hooli:before { - content: "\f427"; } - -.fa-hornbill:before { - content: "\f592"; } - -.fa-horse:before { - content: "\f6f0"; } - -.fa-hospital:before { - content: "\f0f8"; } - -.fa-hospital-alt:before { - content: "\f47d"; } - -.fa-hospital-symbol:before { - content: "\f47e"; } - -.fa-hot-tub:before { - content: "\f593"; } - -.fa-hotel:before { - content: "\f594"; } - -.fa-hotjar:before { - content: "\f3b1"; } - -.fa-hourglass:before { - content: "\f254"; } - -.fa-hourglass-end:before { - content: "\f253"; } - -.fa-hourglass-half:before { - content: "\f252"; } - -.fa-hourglass-start:before { - content: "\f251"; } - -.fa-house-damage:before { - content: "\f6f1"; } - -.fa-houzz:before { - content: "\f27c"; } - -.fa-hryvnia:before { - content: "\f6f2"; } - -.fa-html5:before { - content: "\f13b"; } - -.fa-hubspot:before { - content: "\f3b2"; } - -.fa-i-cursor:before { - content: "\f246"; } - -.fa-id-badge:before { - content: "\f2c1"; } - -.fa-id-card:before { - content: "\f2c2"; } - -.fa-id-card-alt:before { - content: "\f47f"; } - -.fa-image:before { - content: "\f03e"; } - -.fa-images:before { - content: "\f302"; } - -.fa-imdb:before { - content: "\f2d8"; } - -.fa-inbox:before { - content: "\f01c"; } - -.fa-indent:before { - content: "\f03c"; } - -.fa-industry:before { - content: "\f275"; } - -.fa-infinity:before { - content: "\f534"; } - -.fa-info:before { - content: "\f129"; } - -.fa-info-circle:before { - content: "\f05a"; } - -.fa-instagram:before { - content: "\f16d"; } - -.fa-internet-explorer:before { - content: "\f26b"; } - -.fa-ioxhost:before { - content: "\f208"; } - -.fa-italic:before { - content: "\f033"; } - -.fa-itunes:before { - content: "\f3b4"; } - -.fa-itunes-note:before { - content: "\f3b5"; } - -.fa-java:before { - content: "\f4e4"; } - -.fa-jedi:before { - content: "\f669"; } - -.fa-jedi-order:before { - content: "\f50e"; } - -.fa-jenkins:before { - content: "\f3b6"; } - -.fa-joget:before { - content: "\f3b7"; } - -.fa-joint:before { - content: "\f595"; } - -.fa-joomla:before { - content: "\f1aa"; } - -.fa-journal-whills:before { - content: "\f66a"; } - -.fa-js:before { - content: "\f3b8"; } - -.fa-js-square:before { - content: "\f3b9"; } - -.fa-jsfiddle:before { - content: "\f1cc"; } - -.fa-kaaba:before { - content: "\f66b"; } - -.fa-kaggle:before { - content: "\f5fa"; } - -.fa-key:before { - content: "\f084"; } - -.fa-keybase:before { - content: "\f4f5"; } - -.fa-keyboard:before { - content: "\f11c"; } - -.fa-keycdn:before { - content: "\f3ba"; } - -.fa-khanda:before { - content: "\f66d"; } - -.fa-kickstarter:before { - content: "\f3bb"; } - -.fa-kickstarter-k:before { - content: "\f3bc"; } - -.fa-kiss:before { - content: "\f596"; } - -.fa-kiss-beam:before { - content: "\f597"; } - -.fa-kiss-wink-heart:before { - content: "\f598"; } - -.fa-kiwi-bird:before { - content: "\f535"; } - -.fa-korvue:before { - content: "\f42f"; } - -.fa-landmark:before { - content: "\f66f"; } - -.fa-language:before { - content: "\f1ab"; } - -.fa-laptop:before { - content: "\f109"; } - -.fa-laptop-code:before { - content: "\f5fc"; } - -.fa-laravel:before { - content: "\f3bd"; } - -.fa-lastfm:before { - content: "\f202"; } - -.fa-lastfm-square:before { - content: "\f203"; } - -.fa-laugh:before { - content: "\f599"; } - -.fa-laugh-beam:before { - content: "\f59a"; } - -.fa-laugh-squint:before { - content: "\f59b"; } - -.fa-laugh-wink:before { - content: "\f59c"; } - -.fa-layer-group:before { - content: "\f5fd"; } - -.fa-leaf:before { - content: "\f06c"; } - -.fa-leanpub:before { - content: "\f212"; } - -.fa-lemon:before { - content: "\f094"; } - -.fa-less:before { - content: "\f41d"; } - -.fa-less-than:before { - content: "\f536"; } - -.fa-less-than-equal:before { - content: "\f537"; } - -.fa-level-down-alt:before { - content: "\f3be"; } - -.fa-level-up-alt:before { - content: "\f3bf"; } - -.fa-life-ring:before { - content: "\f1cd"; } - -.fa-lightbulb:before { - content: "\f0eb"; } - -.fa-line:before { - content: "\f3c0"; } - -.fa-link:before { - content: "\f0c1"; } - -.fa-linkedin:before { - content: "\f08c"; } - -.fa-linkedin-in:before { - content: "\f0e1"; } - -.fa-linode:before { - content: "\f2b8"; } - -.fa-linux:before { - content: "\f17c"; } - -.fa-lira-sign:before { - content: "\f195"; } - -.fa-list:before { - content: "\f03a"; } - -.fa-list-alt:before { - content: "\f022"; } - -.fa-list-ol:before { - content: "\f0cb"; } - -.fa-list-ul:before { - content: "\f0ca"; } - -.fa-location-arrow:before { - content: "\f124"; } - -.fa-lock:before { - content: "\f023"; } - -.fa-lock-open:before { - content: "\f3c1"; } - -.fa-long-arrow-alt-down:before { - content: "\f309"; } - -.fa-long-arrow-alt-left:before { - content: "\f30a"; } - -.fa-long-arrow-alt-right:before { - content: "\f30b"; } - -.fa-long-arrow-alt-up:before { - content: "\f30c"; } - -.fa-low-vision:before { - content: "\f2a8"; } - -.fa-luggage-cart:before { - content: "\f59d"; } - -.fa-lyft:before { - content: "\f3c3"; } - -.fa-magento:before { - content: "\f3c4"; } - -.fa-magic:before { - content: "\f0d0"; } - -.fa-magnet:before { - content: "\f076"; } - -.fa-mail-bulk:before { - content: "\f674"; } - -.fa-mailchimp:before { - content: "\f59e"; } - -.fa-male:before { - content: "\f183"; } - -.fa-mandalorian:before { - content: "\f50f"; } - -.fa-map:before { - content: "\f279"; } - -.fa-map-marked:before { - content: "\f59f"; } - -.fa-map-marked-alt:before { - content: "\f5a0"; } - -.fa-map-marker:before { - content: "\f041"; } - -.fa-map-marker-alt:before { - content: "\f3c5"; } - -.fa-map-pin:before { - content: "\f276"; } - -.fa-map-signs:before { - content: "\f277"; } - -.fa-markdown:before { - content: "\f60f"; } - -.fa-marker:before { - content: "\f5a1"; } - -.fa-mars:before { - content: "\f222"; } - -.fa-mars-double:before { - content: "\f227"; } - -.fa-mars-stroke:before { - content: "\f229"; } - -.fa-mars-stroke-h:before { - content: "\f22b"; } - -.fa-mars-stroke-v:before { - content: "\f22a"; } - -.fa-mask:before { - content: "\f6fa"; } - -.fa-mastodon:before { - content: "\f4f6"; } - -.fa-maxcdn:before { - content: "\f136"; } - -.fa-medal:before { - content: "\f5a2"; } - -.fa-medapps:before { - content: "\f3c6"; } - -.fa-medium:before { - content: "\f23a"; } - -.fa-medium-m:before { - content: "\f3c7"; } - -.fa-medkit:before { - content: "\f0fa"; } - -.fa-medrt:before { - content: "\f3c8"; } - -.fa-meetup:before { - content: "\f2e0"; } - -.fa-megaport:before { - content: "\f5a3"; } - -.fa-meh:before { - content: "\f11a"; } - -.fa-meh-blank:before { - content: "\f5a4"; } - -.fa-meh-rolling-eyes:before { - content: "\f5a5"; } - -.fa-memory:before { - content: "\f538"; } - -.fa-menorah:before { - content: "\f676"; } - -.fa-mercury:before { - content: "\f223"; } - -.fa-microchip:before { - content: "\f2db"; } - -.fa-microphone:before { - content: "\f130"; } - -.fa-microphone-alt:before { - content: "\f3c9"; } - -.fa-microphone-alt-slash:before { - content: "\f539"; } - -.fa-microphone-slash:before { - content: "\f131"; } - -.fa-microscope:before { - content: "\f610"; } - -.fa-microsoft:before { - content: "\f3ca"; } - -.fa-minus:before { - content: "\f068"; } - -.fa-minus-circle:before { - content: "\f056"; } - -.fa-minus-square:before { - content: "\f146"; } - -.fa-mix:before { - content: "\f3cb"; } - -.fa-mixcloud:before { - content: "\f289"; } - -.fa-mizuni:before { - content: "\f3cc"; } - -.fa-mobile:before { - content: "\f10b"; } - -.fa-mobile-alt:before { - content: "\f3cd"; } - -.fa-modx:before { - content: "\f285"; } - -.fa-monero:before { - content: "\f3d0"; } - -.fa-money-bill:before { - content: "\f0d6"; } - -.fa-money-bill-alt:before { - content: "\f3d1"; } - -.fa-money-bill-wave:before { - content: "\f53a"; } - -.fa-money-bill-wave-alt:before { - content: "\f53b"; } - -.fa-money-check:before { - content: "\f53c"; } - -.fa-money-check-alt:before { - content: "\f53d"; } - -.fa-monument:before { - content: "\f5a6"; } - -.fa-moon:before { - content: "\f186"; } - -.fa-mortar-pestle:before { - content: "\f5a7"; } - -.fa-mosque:before { - content: "\f678"; } - -.fa-motorcycle:before { - content: "\f21c"; } - -.fa-mountain:before { - content: "\f6fc"; } - -.fa-mouse-pointer:before { - content: "\f245"; } - -.fa-music:before { - content: "\f001"; } - -.fa-napster:before { - content: "\f3d2"; } - -.fa-neos:before { - content: "\f612"; } - -.fa-network-wired:before { - content: "\f6ff"; } - -.fa-neuter:before { - content: "\f22c"; } - -.fa-newspaper:before { - content: "\f1ea"; } - -.fa-nimblr:before { - content: "\f5a8"; } - -.fa-nintendo-switch:before { - content: "\f418"; } - -.fa-node:before { - content: "\f419"; } - -.fa-node-js:before { - content: "\f3d3"; } - -.fa-not-equal:before { - content: "\f53e"; } - -.fa-notes-medical:before { - content: "\f481"; } - -.fa-npm:before { - content: "\f3d4"; } - -.fa-ns8:before { - content: "\f3d5"; } - -.fa-nutritionix:before { - content: "\f3d6"; } - -.fa-object-group:before { - content: "\f247"; } - -.fa-object-ungroup:before { - content: "\f248"; } - -.fa-odnoklassniki:before { - content: "\f263"; } - -.fa-odnoklassniki-square:before { - content: "\f264"; } - -.fa-oil-can:before { - content: "\f613"; } - -.fa-old-republic:before { - content: "\f510"; } - -.fa-om:before { - content: "\f679"; } - -.fa-opencart:before { - content: "\f23d"; } - -.fa-openid:before { - content: "\f19b"; } - -.fa-opera:before { - content: "\f26a"; } - -.fa-optin-monster:before { - content: "\f23c"; } - -.fa-osi:before { - content: "\f41a"; } - -.fa-otter:before { - content: "\f700"; } - -.fa-outdent:before { - content: "\f03b"; } - -.fa-page4:before { - content: "\f3d7"; } - -.fa-pagelines:before { - content: "\f18c"; } - -.fa-paint-brush:before { - content: "\f1fc"; } - -.fa-paint-roller:before { - content: "\f5aa"; } - -.fa-palette:before { - content: "\f53f"; } - -.fa-palfed:before { - content: "\f3d8"; } - -.fa-pallet:before { - content: "\f482"; } - -.fa-paper-plane:before { - content: "\f1d8"; } - -.fa-paperclip:before { - content: "\f0c6"; } - -.fa-parachute-box:before { - content: "\f4cd"; } - -.fa-paragraph:before { - content: "\f1dd"; } - -.fa-parking:before { - content: "\f540"; } - -.fa-passport:before { - content: "\f5ab"; } - -.fa-pastafarianism:before { - content: "\f67b"; } - -.fa-paste:before { - content: "\f0ea"; } - -.fa-patreon:before { - content: "\f3d9"; } - -.fa-pause:before { - content: "\f04c"; } - -.fa-pause-circle:before { - content: "\f28b"; } - -.fa-paw:before { - content: "\f1b0"; } - -.fa-paypal:before { - content: "\f1ed"; } - -.fa-peace:before { - content: "\f67c"; } - -.fa-pen:before { - content: "\f304"; } - -.fa-pen-alt:before { - content: "\f305"; } - -.fa-pen-fancy:before { - content: "\f5ac"; } - -.fa-pen-nib:before { - content: "\f5ad"; } - -.fa-pen-square:before { - content: "\f14b"; } - -.fa-pencil-alt:before { - content: "\f303"; } - -.fa-pencil-ruler:before { - content: "\f5ae"; } - -.fa-penny-arcade:before { - content: "\f704"; } - -.fa-people-carry:before { - content: "\f4ce"; } - -.fa-percent:before { - content: "\f295"; } - -.fa-percentage:before { - content: "\f541"; } - -.fa-periscope:before { - content: "\f3da"; } - -.fa-phabricator:before { - content: "\f3db"; } - -.fa-phoenix-framework:before { - content: "\f3dc"; } - -.fa-phoenix-squadron:before { - content: "\f511"; } - -.fa-phone:before { - content: "\f095"; } - -.fa-phone-slash:before { - content: "\f3dd"; } - -.fa-phone-square:before { - content: "\f098"; } - -.fa-phone-volume:before { - content: "\f2a0"; } - -.fa-php:before { - content: "\f457"; } - -.fa-pied-piper:before { - content: "\f2ae"; } - -.fa-pied-piper-alt:before { - content: "\f1a8"; } - -.fa-pied-piper-hat:before { - content: "\f4e5"; } - -.fa-pied-piper-pp:before { - content: "\f1a7"; } - -.fa-piggy-bank:before { - content: "\f4d3"; } - -.fa-pills:before { - content: "\f484"; } - -.fa-pinterest:before { - content: "\f0d2"; } - -.fa-pinterest-p:before { - content: "\f231"; } - -.fa-pinterest-square:before { - content: "\f0d3"; } - -.fa-place-of-worship:before { - content: "\f67f"; } - -.fa-plane:before { - content: "\f072"; } - -.fa-plane-arrival:before { - content: "\f5af"; } - -.fa-plane-departure:before { - content: "\f5b0"; } - -.fa-play:before { - content: "\f04b"; } - -.fa-play-circle:before { - content: "\f144"; } - -.fa-playstation:before { - content: "\f3df"; } - -.fa-plug:before { - content: "\f1e6"; } - -.fa-plus:before { - content: "\f067"; } - -.fa-plus-circle:before { - content: "\f055"; } - -.fa-plus-square:before { - content: "\f0fe"; } - -.fa-podcast:before { - content: "\f2ce"; } - -.fa-poll:before { - content: "\f681"; } - -.fa-poll-h:before { - content: "\f682"; } - -.fa-poo:before { - content: "\f2fe"; } - -.fa-poop:before { - content: "\f619"; } - -.fa-portrait:before { - content: "\f3e0"; } - -.fa-pound-sign:before { - content: "\f154"; } - -.fa-power-off:before { - content: "\f011"; } - -.fa-pray:before { - content: "\f683"; } - -.fa-praying-hands:before { - content: "\f684"; } - -.fa-prescription:before { - content: "\f5b1"; } - -.fa-prescription-bottle:before { - content: "\f485"; } - -.fa-prescription-bottle-alt:before { - content: "\f486"; } - -.fa-print:before { - content: "\f02f"; } - -.fa-procedures:before { - content: "\f487"; } - -.fa-product-hunt:before { - content: "\f288"; } - -.fa-project-diagram:before { - content: "\f542"; } - -.fa-pushed:before { - content: "\f3e1"; } - -.fa-puzzle-piece:before { - content: "\f12e"; } - -.fa-python:before { - content: "\f3e2"; } - -.fa-qq:before { - content: "\f1d6"; } - -.fa-qrcode:before { - content: "\f029"; } - -.fa-question:before { - content: "\f128"; } - -.fa-question-circle:before { - content: "\f059"; } - -.fa-quidditch:before { - content: "\f458"; } - -.fa-quinscape:before { - content: "\f459"; } - -.fa-quora:before { - content: "\f2c4"; } - -.fa-quote-left:before { - content: "\f10d"; } - -.fa-quote-right:before { - content: "\f10e"; } - -.fa-quran:before { - content: "\f687"; } - -.fa-r-project:before { - content: "\f4f7"; } - -.fa-random:before { - content: "\f074"; } - -.fa-ravelry:before { - content: "\f2d9"; } - -.fa-react:before { - content: "\f41b"; } - -.fa-readme:before { - content: "\f4d5"; } - -.fa-rebel:before { - content: "\f1d0"; } - -.fa-receipt:before { - content: "\f543"; } - -.fa-recycle:before { - content: "\f1b8"; } - -.fa-red-river:before { - content: "\f3e3"; } - -.fa-reddit:before { - content: "\f1a1"; } - -.fa-reddit-alien:before { - content: "\f281"; } - -.fa-reddit-square:before { - content: "\f1a2"; } - -.fa-redo:before { - content: "\f01e"; } - -.fa-redo-alt:before { - content: "\f2f9"; } - -.fa-registered:before { - content: "\f25d"; } - -.fa-rendact:before { - content: "\f3e4"; } - -.fa-renren:before { - content: "\f18b"; } - -.fa-reply:before { - content: "\f3e5"; } - -.fa-reply-all:before { - content: "\f122"; } - -.fa-replyd:before { - content: "\f3e6"; } - -.fa-researchgate:before { - content: "\f4f8"; } - -.fa-resolving:before { - content: "\f3e7"; } - -.fa-retweet:before { - content: "\f079"; } - -.fa-rev:before { - content: "\f5b2"; } - -.fa-ribbon:before { - content: "\f4d6"; } - -.fa-ring:before { - content: "\f70b"; } - -.fa-road:before { - content: "\f018"; } - -.fa-robot:before { - content: "\f544"; } - -.fa-rocket:before { - content: "\f135"; } - -.fa-rocketchat:before { - content: "\f3e8"; } - -.fa-rockrms:before { - content: "\f3e9"; } - -.fa-route:before { - content: "\f4d7"; } - -.fa-rss:before { - content: "\f09e"; } - -.fa-rss-square:before { - content: "\f143"; } - -.fa-ruble-sign:before { - content: "\f158"; } - -.fa-ruler:before { - content: "\f545"; } - -.fa-ruler-combined:before { - content: "\f546"; } - -.fa-ruler-horizontal:before { - content: "\f547"; } - -.fa-ruler-vertical:before { - content: "\f548"; } - -.fa-running:before { - content: "\f70c"; } - -.fa-rupee-sign:before { - content: "\f156"; } - -.fa-sad-cry:before { - content: "\f5b3"; } - -.fa-sad-tear:before { - content: "\f5b4"; } - -.fa-safari:before { - content: "\f267"; } - -.fa-sass:before { - content: "\f41e"; } - -.fa-save:before { - content: "\f0c7"; } - -.fa-schlix:before { - content: "\f3ea"; } - -.fa-school:before { - content: "\f549"; } - -.fa-screwdriver:before { - content: "\f54a"; } - -.fa-scribd:before { - content: "\f28a"; } - -.fa-scroll:before { - content: "\f70e"; } - -.fa-search:before { - content: "\f002"; } - -.fa-search-dollar:before { - content: "\f688"; } - -.fa-search-location:before { - content: "\f689"; } - -.fa-search-minus:before { - content: "\f010"; } - -.fa-search-plus:before { - content: "\f00e"; } - -.fa-searchengin:before { - content: "\f3eb"; } - -.fa-seedling:before { - content: "\f4d8"; } - -.fa-sellcast:before { - content: "\f2da"; } - -.fa-sellsy:before { - content: "\f213"; } - -.fa-server:before { - content: "\f233"; } - -.fa-servicestack:before { - content: "\f3ec"; } - -.fa-shapes:before { - content: "\f61f"; } - -.fa-share:before { - content: "\f064"; } - -.fa-share-alt:before { - content: "\f1e0"; } - -.fa-share-alt-square:before { - content: "\f1e1"; } - -.fa-share-square:before { - content: "\f14d"; } - -.fa-shekel-sign:before { - content: "\f20b"; } - -.fa-shield-alt:before { - content: "\f3ed"; } - -.fa-ship:before { - content: "\f21a"; } - -.fa-shipping-fast:before { - content: "\f48b"; } - -.fa-shirtsinbulk:before { - content: "\f214"; } - -.fa-shoe-prints:before { - content: "\f54b"; } - -.fa-shopping-bag:before { - content: "\f290"; } - -.fa-shopping-basket:before { - content: "\f291"; } - -.fa-shopping-cart:before { - content: "\f07a"; } - -.fa-shopware:before { - content: "\f5b5"; } - -.fa-shower:before { - content: "\f2cc"; } - -.fa-shuttle-van:before { - content: "\f5b6"; } - -.fa-sign:before { - content: "\f4d9"; } - -.fa-sign-in-alt:before { - content: "\f2f6"; } - -.fa-sign-language:before { - content: "\f2a7"; } - -.fa-sign-out-alt:before { - content: "\f2f5"; } - -.fa-signal:before { - content: "\f012"; } - -.fa-signature:before { - content: "\f5b7"; } - -.fa-simplybuilt:before { - content: "\f215"; } - -.fa-sistrix:before { - content: "\f3ee"; } - -.fa-sitemap:before { - content: "\f0e8"; } - -.fa-sith:before { - content: "\f512"; } - -.fa-skull:before { - content: "\f54c"; } - -.fa-skull-crossbones:before { - content: "\f714"; } - -.fa-skyatlas:before { - content: "\f216"; } - -.fa-skype:before { - content: "\f17e"; } - -.fa-slack:before { - content: "\f198"; } - -.fa-slack-hash:before { - content: "\f3ef"; } - -.fa-slash:before { - content: "\f715"; } - -.fa-sliders-h:before { - content: "\f1de"; } - -.fa-slideshare:before { - content: "\f1e7"; } - -.fa-smile:before { - content: "\f118"; } - -.fa-smile-beam:before { - content: "\f5b8"; } - -.fa-smile-wink:before { - content: "\f4da"; } - -.fa-smoking:before { - content: "\f48d"; } - -.fa-smoking-ban:before { - content: "\f54d"; } - -.fa-snapchat:before { - content: "\f2ab"; } - -.fa-snapchat-ghost:before { - content: "\f2ac"; } - -.fa-snapchat-square:before { - content: "\f2ad"; } - -.fa-snowflake:before { - content: "\f2dc"; } - -.fa-socks:before { - content: "\f696"; } - -.fa-solar-panel:before { - content: "\f5ba"; } - -.fa-sort:before { - content: "\f0dc"; } - -.fa-sort-alpha-down:before { - content: "\f15d"; } - -.fa-sort-alpha-up:before { - content: "\f15e"; } - -.fa-sort-amount-down:before { - content: "\f160"; } - -.fa-sort-amount-up:before { - content: "\f161"; } - -.fa-sort-down:before { - content: "\f0dd"; } - -.fa-sort-numeric-down:before { - content: "\f162"; } - -.fa-sort-numeric-up:before { - content: "\f163"; } - -.fa-sort-up:before { - content: "\f0de"; } - -.fa-soundcloud:before { - content: "\f1be"; } - -.fa-spa:before { - content: "\f5bb"; } - -.fa-space-shuttle:before { - content: "\f197"; } - -.fa-speakap:before { - content: "\f3f3"; } - -.fa-spider:before { - content: "\f717"; } - -.fa-spinner:before { - content: "\f110"; } - -.fa-splotch:before { - content: "\f5bc"; } - -.fa-spotify:before { - content: "\f1bc"; } - -.fa-spray-can:before { - content: "\f5bd"; } - -.fa-square:before { - content: "\f0c8"; } - -.fa-square-full:before { - content: "\f45c"; } - -.fa-square-root-alt:before { - content: "\f698"; } - -.fa-squarespace:before { - content: "\f5be"; } - -.fa-stack-exchange:before { - content: "\f18d"; } - -.fa-stack-overflow:before { - content: "\f16c"; } - -.fa-stamp:before { - content: "\f5bf"; } - -.fa-star:before { - content: "\f005"; } - -.fa-star-and-crescent:before { - content: "\f699"; } - -.fa-star-half:before { - content: "\f089"; } - -.fa-star-half-alt:before { - content: "\f5c0"; } - -.fa-star-of-david:before { - content: "\f69a"; } - -.fa-star-of-life:before { - content: "\f621"; } - -.fa-staylinked:before { - content: "\f3f5"; } - -.fa-steam:before { - content: "\f1b6"; } - -.fa-steam-square:before { - content: "\f1b7"; } - -.fa-steam-symbol:before { - content: "\f3f6"; } - -.fa-step-backward:before { - content: "\f048"; } - -.fa-step-forward:before { - content: "\f051"; } - -.fa-stethoscope:before { - content: "\f0f1"; } - -.fa-sticker-mule:before { - content: "\f3f7"; } - -.fa-sticky-note:before { - content: "\f249"; } - -.fa-stop:before { - content: "\f04d"; } - -.fa-stop-circle:before { - content: "\f28d"; } - -.fa-stopwatch:before { - content: "\f2f2"; } - -.fa-store:before { - content: "\f54e"; } - -.fa-store-alt:before { - content: "\f54f"; } - -.fa-strava:before { - content: "\f428"; } - -.fa-stream:before { - content: "\f550"; } - -.fa-street-view:before { - content: "\f21d"; } - -.fa-strikethrough:before { - content: "\f0cc"; } - -.fa-stripe:before { - content: "\f429"; } - -.fa-stripe-s:before { - content: "\f42a"; } - -.fa-stroopwafel:before { - content: "\f551"; } - -.fa-studiovinari:before { - content: "\f3f8"; } - -.fa-stumbleupon:before { - content: "\f1a4"; } - -.fa-stumbleupon-circle:before { - content: "\f1a3"; } - -.fa-subscript:before { - content: "\f12c"; } - -.fa-subway:before { - content: "\f239"; } - -.fa-suitcase:before { - content: "\f0f2"; } - -.fa-suitcase-rolling:before { - content: "\f5c1"; } - -.fa-sun:before { - content: "\f185"; } - -.fa-superpowers:before { - content: "\f2dd"; } - -.fa-superscript:before { - content: "\f12b"; } - -.fa-supple:before { - content: "\f3f9"; } - -.fa-surprise:before { - content: "\f5c2"; } - -.fa-swatchbook:before { - content: "\f5c3"; } - -.fa-swimmer:before { - content: "\f5c4"; } - -.fa-swimming-pool:before { - content: "\f5c5"; } - -.fa-synagogue:before { - content: "\f69b"; } - -.fa-sync:before { - content: "\f021"; } - -.fa-sync-alt:before { - content: "\f2f1"; } - -.fa-syringe:before { - content: "\f48e"; } - -.fa-table:before { - content: "\f0ce"; } - -.fa-table-tennis:before { - content: "\f45d"; } - -.fa-tablet:before { - content: "\f10a"; } - -.fa-tablet-alt:before { - content: "\f3fa"; } - -.fa-tablets:before { - content: "\f490"; } - -.fa-tachometer-alt:before { - content: "\f3fd"; } - -.fa-tag:before { - content: "\f02b"; } - -.fa-tags:before { - content: "\f02c"; } - -.fa-tape:before { - content: "\f4db"; } - -.fa-tasks:before { - content: "\f0ae"; } - -.fa-taxi:before { - content: "\f1ba"; } - -.fa-teamspeak:before { - content: "\f4f9"; } - -.fa-teeth:before { - content: "\f62e"; } - -.fa-teeth-open:before { - content: "\f62f"; } - -.fa-telegram:before { - content: "\f2c6"; } - -.fa-telegram-plane:before { - content: "\f3fe"; } - -.fa-tencent-weibo:before { - content: "\f1d5"; } - -.fa-terminal:before { - content: "\f120"; } - -.fa-text-height:before { - content: "\f034"; } - -.fa-text-width:before { - content: "\f035"; } - -.fa-th:before { - content: "\f00a"; } - -.fa-th-large:before { - content: "\f009"; } - -.fa-th-list:before { - content: "\f00b"; } - -.fa-the-red-yeti:before { - content: "\f69d"; } - -.fa-theater-masks:before { - content: "\f630"; } - -.fa-themeco:before { - content: "\f5c6"; } - -.fa-themeisle:before { - content: "\f2b2"; } - -.fa-thermometer:before { - content: "\f491"; } - -.fa-thermometer-empty:before { - content: "\f2cb"; } - -.fa-thermometer-full:before { - content: "\f2c7"; } - -.fa-thermometer-half:before { - content: "\f2c9"; } - -.fa-thermometer-quarter:before { - content: "\f2ca"; } - -.fa-thermometer-three-quarters:before { - content: "\f2c8"; } - -.fa-thumbs-down:before { - content: "\f165"; } - -.fa-thumbs-up:before { - content: "\f164"; } - -.fa-thumbtack:before { - content: "\f08d"; } - -.fa-ticket-alt:before { - content: "\f3ff"; } - -.fa-times:before { - content: "\f00d"; } - -.fa-times-circle:before { - content: "\f057"; } - -.fa-tint:before { - content: "\f043"; } - -.fa-tint-slash:before { - content: "\f5c7"; } - -.fa-tired:before { - content: "\f5c8"; } - -.fa-toggle-off:before { - content: "\f204"; } - -.fa-toggle-on:before { - content: "\f205"; } - -.fa-toilet-paper:before { - content: "\f71e"; } - -.fa-toolbox:before { - content: "\f552"; } - -.fa-tooth:before { - content: "\f5c9"; } - -.fa-torah:before { - content: "\f6a0"; } - -.fa-torii-gate:before { - content: "\f6a1"; } - -.fa-tractor:before { - content: "\f722"; } - -.fa-trade-federation:before { - content: "\f513"; } - -.fa-trademark:before { - content: "\f25c"; } - -.fa-traffic-light:before { - content: "\f637"; } - -.fa-train:before { - content: "\f238"; } - -.fa-transgender:before { - content: "\f224"; } - -.fa-transgender-alt:before { - content: "\f225"; } - -.fa-trash:before { - content: "\f1f8"; } - -.fa-trash-alt:before { - content: "\f2ed"; } - -.fa-tree:before { - content: "\f1bb"; } - -.fa-trello:before { - content: "\f181"; } - -.fa-tripadvisor:before { - content: "\f262"; } - -.fa-trophy:before { - content: "\f091"; } - -.fa-truck:before { - content: "\f0d1"; } - -.fa-truck-loading:before { - content: "\f4de"; } - -.fa-truck-monster:before { - content: "\f63b"; } - -.fa-truck-moving:before { - content: "\f4df"; } - -.fa-truck-pickup:before { - content: "\f63c"; } - -.fa-tshirt:before { - content: "\f553"; } - -.fa-tty:before { - content: "\f1e4"; } - -.fa-tumblr:before { - content: "\f173"; } - -.fa-tumblr-square:before { - content: "\f174"; } - -.fa-tv:before { - content: "\f26c"; } - -.fa-twitch:before { - content: "\f1e8"; } - -.fa-twitter:before { - content: "\f099"; } - -.fa-twitter-square:before { - content: "\f081"; } - -.fa-typo3:before { - content: "\f42b"; } - -.fa-uber:before { - content: "\f402"; } - -.fa-uikit:before { - content: "\f403"; } - -.fa-umbrella:before { - content: "\f0e9"; } - -.fa-umbrella-beach:before { - content: "\f5ca"; } - -.fa-underline:before { - content: "\f0cd"; } - -.fa-undo:before { - content: "\f0e2"; } - -.fa-undo-alt:before { - content: "\f2ea"; } - -.fa-uniregistry:before { - content: "\f404"; } - -.fa-universal-access:before { - content: "\f29a"; } - -.fa-university:before { - content: "\f19c"; } - -.fa-unlink:before { - content: "\f127"; } - -.fa-unlock:before { - content: "\f09c"; } - -.fa-unlock-alt:before { - content: "\f13e"; } - -.fa-untappd:before { - content: "\f405"; } - -.fa-upload:before { - content: "\f093"; } - -.fa-usb:before { - content: "\f287"; } - -.fa-user:before { - content: "\f007"; } - -.fa-user-alt:before { - content: "\f406"; } - -.fa-user-alt-slash:before { - content: "\f4fa"; } - -.fa-user-astronaut:before { - content: "\f4fb"; } - -.fa-user-check:before { - content: "\f4fc"; } - -.fa-user-circle:before { - content: "\f2bd"; } - -.fa-user-clock:before { - content: "\f4fd"; } - -.fa-user-cog:before { - content: "\f4fe"; } - -.fa-user-edit:before { - content: "\f4ff"; } - -.fa-user-friends:before { - content: "\f500"; } - -.fa-user-graduate:before { - content: "\f501"; } - -.fa-user-injured:before { - content: "\f728"; } - -.fa-user-lock:before { - content: "\f502"; } - -.fa-user-md:before { - content: "\f0f0"; } - -.fa-user-minus:before { - content: "\f503"; } - -.fa-user-ninja:before { - content: "\f504"; } - -.fa-user-plus:before { - content: "\f234"; } - -.fa-user-secret:before { - content: "\f21b"; } - -.fa-user-shield:before { - content: "\f505"; } - -.fa-user-slash:before { - content: "\f506"; } - -.fa-user-tag:before { - content: "\f507"; } - -.fa-user-tie:before { - content: "\f508"; } - -.fa-user-times:before { - content: "\f235"; } - -.fa-users:before { - content: "\f0c0"; } - -.fa-users-cog:before { - content: "\f509"; } - -.fa-ussunnah:before { - content: "\f407"; } - -.fa-utensil-spoon:before { - content: "\f2e5"; } - -.fa-utensils:before { - content: "\f2e7"; } - -.fa-vaadin:before { - content: "\f408"; } - -.fa-vector-square:before { - content: "\f5cb"; } - -.fa-venus:before { - content: "\f221"; } - -.fa-venus-double:before { - content: "\f226"; } - -.fa-venus-mars:before { - content: "\f228"; } - -.fa-viacoin:before { - content: "\f237"; } - -.fa-viadeo:before { - content: "\f2a9"; } - -.fa-viadeo-square:before { - content: "\f2aa"; } - -.fa-vial:before { - content: "\f492"; } - -.fa-vials:before { - content: "\f493"; } - -.fa-viber:before { - content: "\f409"; } - -.fa-video:before { - content: "\f03d"; } - -.fa-video-slash:before { - content: "\f4e2"; } - -.fa-vihara:before { - content: "\f6a7"; } - -.fa-vimeo:before { - content: "\f40a"; } - -.fa-vimeo-square:before { - content: "\f194"; } - -.fa-vimeo-v:before { - content: "\f27d"; } - -.fa-vine:before { - content: "\f1ca"; } - -.fa-vk:before { - content: "\f189"; } - -.fa-vnv:before { - content: "\f40b"; } - -.fa-volleyball-ball:before { - content: "\f45f"; } - -.fa-volume-down:before { - content: "\f027"; } - -.fa-volume-mute:before { - content: "\f6a9"; } - -.fa-volume-off:before { - content: "\f026"; } - -.fa-volume-up:before { - content: "\f028"; } - -.fa-vuejs:before { - content: "\f41f"; } - -.fa-walking:before { - content: "\f554"; } - -.fa-wallet:before { - content: "\f555"; } - -.fa-warehouse:before { - content: "\f494"; } - -.fa-weebly:before { - content: "\f5cc"; } - -.fa-weibo:before { - content: "\f18a"; } - -.fa-weight:before { - content: "\f496"; } - -.fa-weight-hanging:before { - content: "\f5cd"; } - -.fa-weixin:before { - content: "\f1d7"; } - -.fa-whatsapp:before { - content: "\f232"; } - -.fa-whatsapp-square:before { - content: "\f40c"; } - -.fa-wheelchair:before { - content: "\f193"; } - -.fa-whmcs:before { - content: "\f40d"; } - -.fa-wifi:before { - content: "\f1eb"; } - -.fa-wikipedia-w:before { - content: "\f266"; } - -.fa-wind:before { - content: "\f72e"; } - -.fa-window-close:before { - content: "\f410"; } - -.fa-window-maximize:before { - content: "\f2d0"; } - -.fa-window-minimize:before { - content: "\f2d1"; } - -.fa-window-restore:before { - content: "\f2d2"; } - -.fa-windows:before { - content: "\f17a"; } - -.fa-wine-bottle:before { - content: "\f72f"; } - -.fa-wine-glass:before { - content: "\f4e3"; } - -.fa-wine-glass-alt:before { - content: "\f5ce"; } - -.fa-wix:before { - content: "\f5cf"; } - -.fa-wizards-of-the-coast:before { - content: "\f730"; } - -.fa-wolf-pack-battalion:before { - content: "\f514"; } - -.fa-won-sign:before { - content: "\f159"; } - -.fa-wordpress:before { - content: "\f19a"; } - -.fa-wordpress-simple:before { - content: "\f411"; } - -.fa-wpbeginner:before { - content: "\f297"; } - -.fa-wpexplorer:before { - content: "\f2de"; } - -.fa-wpforms:before { - content: "\f298"; } - -.fa-wrench:before { - content: "\f0ad"; } - -.fa-x-ray:before { - content: "\f497"; } - -.fa-xbox:before { - content: "\f412"; } - -.fa-xing:before { - content: "\f168"; } - -.fa-xing-square:before { - content: "\f169"; } - -.fa-y-combinator:before { - content: "\f23b"; } - -.fa-yahoo:before { - content: "\f19e"; } - -.fa-yandex:before { - content: "\f413"; } - -.fa-yandex-international:before { - content: "\f414"; } - -.fa-yelp:before { - content: "\f1e9"; } - -.fa-yen-sign:before { - content: "\f157"; } - -.fa-yin-yang:before { - content: "\f6ad"; } - -.fa-yoast:before { - content: "\f2b1"; } - -.fa-youtube:before { - content: "\f167"; } - -.fa-youtube-square:before { - content: "\f431"; } - -.fa-zhihu:before { - content: "\f63f"; } - -.sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; } - -.fab { - font-family: 'Font Awesome 5 Brands'; } - -.far { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa, -.fas { - font-family: 'Font Awesome 5 Free'; - font-weight: 900; } diff --git a/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css index 3156b8c7c..32543f8cd 100644 --- a/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css +++ b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.css @@ -13,7 +13,8 @@ font-style: normal; font-variant: normal; text-rendering: auto; - line-height: 1; } + line-height: 1; + font-size: 24px;} .fa-lg { font-size: 1.33333em; diff --git a/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css index a591cabf8..eeaa44f71 100644 --- a/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css +++ b/src/main/resources/gwt/material/design/incubator/public/css/fontawesome-all.min.css @@ -1,4 +1,4 @@ /*! * Font Awesome Free 5.4.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fa-fw,.fa-li{text-align:center}.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.fab{font-family:'Font Awesome 5 Brands'}.fa,.far,.fas{font-family:'Font Awesome 5 Free'}.far{font-weight:400}.fa,.fas{font-weight:900}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;src:url(../fontawesome-icons/fa-brands-400.eot);src:url(../fontawesome-icons/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-brands-400.woff2) format("woff2"),url(../fontawesome-icons/fa-brands-400.woff) format("woff"),url(../fontawesome-icons/fa-brands-400.ttf) format("truetype"),url(../fontawesome-icons/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;src:url(../fontawesome-icons/fa-regular-400.eot);src:url(../fontawesome-icons/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-regular-400.woff2) format("woff2"),url(../fontawesome-icons/fa-regular-400.woff) format("woff"),url(../fontawesome-icons/fa-regular-400.ttf) format("truetype"),url(../fontawesome-icons/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;src:url(../fontawesome-icons/fa-solid-900.eot);src:url(../fontawesome-icons/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-solid-900.woff2) format("woff2"),url(../fontawesome-icons/fa-solid-900.woff) format("woff"),url(../fontawesome-icons/fa-solid-900.ttf) format("truetype"),url(../fontawesome-icons/fa-solid-900.svg#fontawesome) format("svg")} \ No newline at end of file + */.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:24px}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.fab{font-family:'Font Awesome 5 Brands'}.far{font-family:'Font Awesome 5 Free';font-weight:400}.fa,.fas{font-family:'Font Awesome 5 Free';font-weight:900}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;src:url(../fontawesome-icons/fa-brands-400.eot);src:url(../fontawesome-icons/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-brands-400.woff2) format("woff2"),url(../fontawesome-icons/fa-brands-400.woff) format("woff"),url(../fontawesome-icons/fa-brands-400.ttf) format("truetype"),url(../fontawesome-icons/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;src:url(../fontawesome-icons/fa-regular-400.eot);src:url(../fontawesome-icons/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-regular-400.woff2) format("woff2"),url(../fontawesome-icons/fa-regular-400.woff) format("woff"),url(../fontawesome-icons/fa-regular-400.ttf) format("truetype"),url(../fontawesome-icons/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;src:url(../fontawesome-icons/fa-solid-900.eot);src:url(../fontawesome-icons/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fontawesome-icons/fa-solid-900.woff2) format("woff2"),url(../fontawesome-icons/fa-solid-900.woff) format("woff"),url(../fontawesome-icons/fa-solid-900.ttf) format("truetype"),url(../fontawesome-icons/fa-solid-900.svg#fontawesome) format("svg")} \ No newline at end of file From f9030db5cdf3acbda0d5f1ace17ec42aaeb0cb6c Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 8 Dec 2019 19:08:04 +0800 Subject: [PATCH 127/247] GroupToggleButton add convenience method addItem(String text, T value, boolean active) --- .../client/range/ContinuousRangeSlider.java | 2 +- .../client/toggle/GroupToggleButton.java | 17 +++++-- .../incubator/client/toggle/ToggleButton.java | 12 ++++- .../range/resources/js/continuous-range.js | 46 ++++++++++++++++++- .../resources/js/continuous-range.min.js | 2 +- 5 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java index 24fe5246c..676ccb47d 100644 --- a/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java +++ b/src/main/java/gwt/material/design/addins/client/range/ContinuousRangeSlider.java @@ -55,7 +55,7 @@ public ContinuousRangeSlider() { protected void onLoad() { super.onLoad(); - setType(ContinuousRangeSliderType.SCALE); + setType(ContinuousRangeSliderType.SHADOW); $(getElement()).on("slider-change", (event, o) -> { setValue(Integer.parseInt(getRangeInputElement().getValue()), true, false); return true; diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java index 08041df71..fc87edfa7 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java @@ -7,9 +7,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. @@ -58,14 +58,14 @@ * * *

- * Note: This component is under the incubation process and subject to change. + * Note: This component is under the incubation process and subject to change. *

* * @author kevzlou7979 */ //@formatter:on public class GroupToggleButton extends AbstractValueWidget> implements HasSelectionHandlers, - HasStatusText { + HasStatusText { static { IncubatorWidget.showWarning(GroupToggleButton.class); @@ -106,6 +106,10 @@ public ToggleButton addItem(String text) { } public ToggleButton addItem(String text, T value) { + return addItem(text, value, false); + } + + public ToggleButton addItem(String text, T value, boolean active) { ToggleButton button = new ToggleButton(text); button.setGroupParent(this); button.addClickHandler(clickEvent -> { @@ -118,6 +122,10 @@ public ToggleButton addItem(String text, T value) { wrapper.add(button); items.add(button); values.add(value); + + if (active) { + setActive(values.indexOf(value)); + } return button; } @@ -141,7 +149,6 @@ public void setActive(int index) { setActive(index, true); } - public void setActive(int index, boolean active) { items.get(index).setToggle(active); } diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/ToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/ToggleButton.java index 7d926cea5..f57fc9616 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/ToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/ToggleButton.java @@ -19,8 +19,11 @@ */ package gwt.material.design.incubator.client.toggle; +import com.google.gwt.event.logical.shared.AttachEvent; import gwt.material.design.client.base.HasActive; +import gwt.material.design.client.base.helper.EventHelper; import gwt.material.design.client.base.mixin.ActiveMixin; +import gwt.material.design.client.constants.CssName; import gwt.material.design.client.ui.MaterialButton; public class ToggleButton extends MaterialButton implements HasActive { @@ -34,6 +37,8 @@ public ToggleButton(String text) { super(text); } + public ToggleButton() {} + @Override protected void onLoad() { super.onLoad(); @@ -69,7 +74,12 @@ public void setGroupParent(GroupToggleButton groupParent) { @Override public void setActive(boolean active) { - getActiveMixin().setActive(active); + AttachEvent.Handler handler = event -> getActiveMixin().setActive(active); + if (!isAttached()) { + EventHelper.onAttachOnce(this, handler); + } else { + handler.onAttachOrDetach(null); + } } @Override diff --git a/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js index 47123a537..f89999f18 100644 --- a/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js +++ b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.js @@ -64,7 +64,7 @@ }); } - self.on('mousedown', '.slider-handle', function(e) { + self.on('mousedown touchstart', '.slider-handle', function(e) { if(e.button === 2) { return false; } @@ -89,8 +89,51 @@ slider_move(parents, slider_new_width, slider_width); } }, + touchmove: function(e) { + var touch = event.touches[0]; + var slider_new_width = touch.pageX - slider_offset; + + if(slider_new_width <= slider_width && !(slider_new_width < '0')) { + slider_move(parents, slider_new_width, slider_width); + } + }, mouseup: function(e) { $(this).off(handlers); + var range = self.find('input[type="range"]'); + var slider_fill = self.find('.slider-fill'); + var slider_handle = self.find('.slider-handle'); + var step = range.attr("step"); + var max = range.attr("max"); + var value = range.val(); + var slider_new_val; + + // Manage Step + if (step && step > 0) { + + var x = (value / step); + var y = (max / step) ; + var total = (x / y) * 100; + slider_new_val = total; + + console.log(total); + + slider_fill.css('width', slider_new_val +'%'); + slider_handle.css({ + 'left': slider_new_val +'%', + 'transition': 'none', + '-webkit-transition': 'none', + '-moz-transition': 'none' + }); + } + + if(parents.hasClass('slider-discrete') === true) { + parents.find('.is-active').removeClass('is-active'); + } + + + }, + touchend: function(e) { + $(this).off(handlers); if(parents.hasClass('slider-discrete') === true) { parents.find('.is-active').removeClass('is-active'); @@ -152,6 +195,7 @@ var slider_handle = parents.find('.slider-handle'); var range = parents.find('input[type="range"]'); + slider_fill.css('width', slider_new_val +'%'); slider_handle.css({ 'left': slider_new_val +'%', diff --git a/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js index ef2663346..34852aedc 100644 --- a/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js +++ b/src/main/resources/gwt/material/design/addins/client/range/resources/js/continuous-range.min.js @@ -1 +1 @@ -!function(i){function e(i,e,s){var d=parseInt(Math.round(e/s*100)),l=i.find(".slider-fill"),n=i.find(".slider-handle"),r=i.find('input[type="range"]');l.css("width",d+"%"),n.css({left:d+"%",transition:"none","-webkit-transition":"none","-moz-transition":"none"}),r.val(d),!0===i.hasClass("slider-discrete")&&i.find(".slider-handle span").text(d),i.trigger("slider-change",r.val())}i.fn.rkmd_rangeSlider=function(){var s,d,l,n,r,a;(s=i(this)).outerWidth(),s.offset().left,l=i(".slider-continuous"),n=i(".slider-discrete"),!0===s.hasClass("slider-continuous")&&l.each(function(e,s){(d=i(this)).append('
'),r=d.find('input[type="range"]'),a=d.find(".slider"),slider_fill=a.find(".slider-fill"),slider_handle=a.find(".slider-handle"),max=r.attr("max");var l=r.val()/max*100;slider_fill.css("width",l+"%"),slider_handle.css("left",l+"%")}),!0===s.hasClass("slider-discrete")&&n.each(function(e,s){(d=i(this)).append('
0
'),r=d.find('input[type="range"]'),a=d.find(".slider"),slider_fill=a.find(".slider-fill"),slider_handle=a.find(".slider-handle"),slider_label=a.find(".slider-label"),max=r.attr("max");var l=r.val()/max*100;slider_fill.css("width",l+"%"),slider_handle.css("left",l+"%"),slider_label.find("span").text(l)}),s.on("mousedown",".slider-handle",function(s){if(2===s.button)return!1;var d=i(this).parents(".rkmd-slider"),l=d.outerWidth(),n=d.offset().left;if(!0===d.find('input[type="range"]').is(":disabled"))return!1;!0===d.hasClass("slider-discrete")&&i(this).addClass("is-active");var r={mousemove:function(i){var s=i.pageX-n;s<=l&&!(s<"0")&&e(d,s,l)},mouseup:function(e){i(this).off(r),!0===d.hasClass("slider-discrete")&&d.find(".is-active").removeClass("is-active")}};i(document).on(r)}),s.on("mousedown",".slider",function(s){if(2===s.button)return!1;var d=i(this).parents(".rkmd-slider"),l=d.outerWidth(),n=d.offset().left;if(!0===d.find('input[type="range"]').is(":disabled"))return!1;var r=s.pageX-n;r<=l&&!(r<"0")&&e(d,r,l);var a={mouseup:function(e){i(this).off(a)}};i(document).on(a)})}}(jQuery); \ No newline at end of file +!function(i){function e(i,e,s){var d=parseInt(Math.round(e/s*100)),l=i.find(".slider-fill"),n=i.find(".slider-handle"),t=i.find('input[type="range"]'),a=t.attr("step");t.val();a&&0!=a&&(d=t.val()/max*100),l.css("width",d+"%"),n.css({left:d+"%",transition:"none","-webkit-transition":"none","-moz-transition":"none"}),t.val(d),!0===i.hasClass("slider-discrete")&&i.find(".slider-handle span").text(d),i.trigger("slider-change",t.val())}i.fn.rkmd_rangeSlider=function(){var s,d,l,n,t,a;(s=i(this)).outerWidth(),s.offset().left,l=i(".slider-continuous"),n=i(".slider-discrete"),!0===s.hasClass("slider-continuous")&&l.each(function(e,s){(d=i(this)).append('
'),t=d.find('input[type="range"]'),a=d.find(".slider"),slider_fill=a.find(".slider-fill"),slider_handle=a.find(".slider-handle"),max=t.attr("max");var l=t.val()/max*100;slider_fill.css("width",l+"%"),slider_handle.css("left",l+"%")}),!0===s.hasClass("slider-discrete")&&n.each(function(e,s){(d=i(this)).append('
0
'),t=d.find('input[type="range"]'),a=d.find(".slider"),slider_fill=a.find(".slider-fill"),slider_handle=a.find(".slider-handle"),slider_label=a.find(".slider-label"),max=t.attr("max");var l=t.val()/max*100;slider_fill.css("width",l+"%"),slider_handle.css("left",l+"%"),slider_label.find("span").text(l)}),s.on("mousedown touchstart",".slider-handle",function(s){if(2===s.button)return!1;console.log("STart");var d=i(this).parents(".rkmd-slider"),l=d.outerWidth(),n=d.offset().left;if(!0===d.find('input[type="range"]').is(":disabled"))return!1;!0===d.hasClass("slider-discrete")&&i(this).addClass("is-active");var t={touchmove:function(i){console.log("Moving");var s=i.pageX-n;s<=l&&!(s<"0")&&e(d,s,l)},touchend:function(e){i(this).off(t),!0===d.hasClass("slider-discrete")&&d.find(".is-active").removeClass("is-active"),console.log("end")}};i(document).on(t)}),s.on("mousedown",".slider",function(s){if(2===s.button)return!1;var d=i(this).parents(".rkmd-slider"),l=d.outerWidth(),n=d.offset().left;if(!0===d.find('input[type="range"]').is(":disabled"))return!1;var t=s.pageX-n;t<=l&&!(t<"0")&&e(d,t,l);var a={mouseup:function(e){i(this).off(a)}};i(document).on(a)})}}(jQuery); \ No newline at end of file From d7d15e03f96225f9e2309c9db0596a5a62c316fe Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 10 Dec 2019 05:06:49 +0800 Subject: [PATCH 128/247] ComboBox async loader enhancements --- .../async/DefaultComboBoxDisplayLoader.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java b/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java index 7c99ffd30..65d1b1176 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/async/DefaultComboBoxDisplayLoader.java @@ -22,15 +22,16 @@ import gwt.material.design.addins.client.combobox.MaterialComboBox; import gwt.material.design.client.async.loader.AsyncDisplayLoader; import gwt.material.design.client.constants.LoaderType; +import gwt.material.design.client.constants.ProgressType; import gwt.material.design.client.ui.MaterialLoader; -import gwt.material.design.client.ui.MaterialToast; +import gwt.material.design.client.ui.MaterialProgress; import java.util.List; public class DefaultComboBoxDisplayLoader implements AsyncDisplayLoader> { private MaterialComboBox comboBox; - private MaterialLoader loader; + private MaterialProgress progress = new MaterialProgress(); public DefaultComboBoxDisplayLoader(MaterialComboBox comboBox) { this.comboBox = comboBox; @@ -39,19 +40,18 @@ public DefaultComboBoxDisplayLoader(MaterialComboBox comboBox) { } protected void setupLoader() { - loader = new MaterialLoader(); - loader.setType(LoaderType.PROGRESS); - loader.setContainer(comboBox); + progress.setType(ProgressType.INDETERMINATE); + } @Override public void loading() { - loader.show(); + comboBox.addWidget(progress); } @Override public void success(List result) { - MaterialToast.fireToast(result.size() + " SIZE"); + } @Override @@ -61,6 +61,6 @@ public void failure(String error) { @Override public void finalize() { - loader.hide(); + progress.removeFromParent(); } } From ddbc5272261731aec5d4e5ac61a2130f5df7a805 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 18 Dec 2019 08:42:54 +0800 Subject: [PATCH 129/247] ComboBox allowBlank Support --- .../design/addins/client/combobox/MaterialComboBox.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 96de1a3af..27034258b 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -667,7 +667,7 @@ public void setSelectedIndex(int selectedIndex) { this.selectedIndex = selectedIndex; if (values.size() > 0) { T value = values.get(selectedIndex); - if (value != null) { + if (value != null || isAllowBlank()) { $(listbox.getElement()).val(keyFactory.generateKey(value)).trigger("change.select2", selectedIndex); } else { GWT.log("Value index is not found.", new IndexOutOfBoundsException()); From 40f2b83af8f9a02e96d4202a65e2271472cf27e8 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 18 Dec 2019 14:22:15 +0800 Subject: [PATCH 130/247] Minor removal --- .../addins/client/combobox/MaterialComboBox.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 27034258b..ce479327e 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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. @@ -150,7 +150,6 @@ public void load() { JsComboBox jsComboBox = $(listbox.getElement()); jsComboBox.select2(options); setId(DOM.createUniqueId()); - jsComboBox.on(ComboBoxEvents.CHANGE, event -> { if (!suppressChangeEvent) { ValueChangeEvent.fire(this, getValue()); @@ -176,7 +175,6 @@ public void load() { }); jsComboBox.on(ComboBoxEvents.OPEN, (event1, o) -> { - if (isAsynchronous()) { event1.stopPropagation(); event1.preventDefault(); @@ -201,14 +199,6 @@ public void load() { return true; }); - // Tab Focus support - body().on("focus", "#" + getId() + " .select2", (e, param1) -> { - if (!isMultiple()) { - open(); - } - return true; - }); - displayArrowForAllowClearOption(false); if (getTextColor() != null) { From 21bcb2d161b6827ec06d1a9ad074c2863be000cf Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 19 Dec 2019 12:29:02 +0800 Subject: [PATCH 131/247] InputMask add InitializeHandler --- .../client/inputmask/AbstractInputMask.java | 16 ++++++++++++---- .../inputmask/events/HasInputMaskHandlers.java | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java index c1eaa2fd2..db884d4d4 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java @@ -7,9 +7,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,6 +20,8 @@ package gwt.material.design.addins.client.inputmask; import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.InitializeEvent; +import com.google.gwt.event.logical.shared.InitializeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.ValueBoxBase; @@ -62,7 +64,7 @@ */ //@formatter:on public class AbstractInputMask extends MaterialValueBox - implements JsLoader, HasInputMaskHandlers { + implements JsLoader, HasInputMaskHandlers { static { if (MaterialAddins.isDebug()) { @@ -114,6 +116,7 @@ public void load(String mask) { options.onChange = object -> MaskChangeEvent.fire(this, object); options.onInvalid = (object, event, function, error) -> InvalidEvent.fire(this, object, error[0]); $(valueBoxBase.getElement()).mask(mask, options); + InitializeEvent.fire(this); } @Override @@ -182,7 +185,7 @@ public void setSelectOnFocus(boolean selectOnFocus) { * Gets the value of the field without the mask. */ public String getCleanValue() { - return valueBoxBase.isAttached() && valueBoxBase.getText() != null ? $(valueBoxBase.getElement()).cleanVal() : null; + return valueBoxBase.isAttached() && valueBoxBase.getText() != null ? $(valueBoxBase.getElement()).cleanVal() : null; } public String getValueWithMask() { @@ -215,4 +218,9 @@ public HandlerRegistration addInvalidHandler(InvalidEvent.InvalidHandler handler public HandlerRegistration addMaskKeyPressHandler(MaskKeyPressEvent.MaskKeyPressHandler handler) { return addHandler(handler, MaskKeyPressEvent.TYPE); } + + @Override + public HandlerRegistration addInitializeHandler(InitializeHandler handler) { + return addHandler(handler, InitializeEvent.getType()); + } } diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java b/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java index 5667117fe..5b53263f2 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/events/HasInputMaskHandlers.java @@ -19,9 +19,10 @@ */ package gwt.material.design.addins.client.inputmask.events; +import com.google.gwt.event.logical.shared.HasInitializeHandlers; import com.google.gwt.event.shared.HandlerRegistration; -public interface HasInputMaskHandlers { +public interface HasInputMaskHandlers extends HasInitializeHandlers { HandlerRegistration addCompleteHandler(CompleteEvent.CompleteHandler handler); From a9ee0e4761ddd6eccfe542c4405fa89cd7c5aa89 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 21 Dec 2019 14:05:50 +0800 Subject: [PATCH 132/247] TimePicker, Rating and RichEditor dark theme support. --- .../client/dark/AddinsDarkThemeLoader.java | 6 +- .../client/dark/AddinsWidgetDarkTheme.java | 8 + .../addins/client/rating/MaterialRating.java | 2 + .../rating/MaterialRatingClientBundle.java | 32 ++ .../rating/MaterialRatingDarkTheme.java | 11 + .../MaterialRatingDebugClientBundle.java | 32 ++ .../client/richeditor/MaterialRichEditor.java | 2 + .../MaterialRichEditorClientBundle.java | 6 +- .../MaterialRichEditorDarkTheme.java | 11 + .../MaterialRichEditorDebugClientBundle.java | 7 +- .../material/design/addins/client/prepros.cfg | 10 +- .../rating/resources/css/rating-dark.css | 3 + .../rating/resources/css/rating-dark.min.css | 1 + .../resources/css/material-note-dark.css | 106 +++++ .../resources/css/material-note-dark.min.css | 1 + .../{material_note.css => material-note.css} | 399 +++++++++++++----- .../resources/css/material-note.min.css | 1 + .../resources/css/material_note.min.css | 1 - .../js/{material_note.js => material-note.js} | 0 ...erial_note.min.js => material-note.min.js} | 0 .../resources/css/timepicker-dark.css | 27 +- .../resources/css/timepicker-dark.min.css | 2 +- .../resources/css/timepicker.min.css | 2 +- 23 files changed, 539 insertions(+), 131 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java create mode 100644 src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java create mode 100644 src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java create mode 100644 src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.min.css create mode 100644 src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.min.css rename src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/{material_note.css => material-note.css} (83%) create mode 100644 src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.min.css delete mode 100644 src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.min.css rename src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/{material_note.js => material-note.js} (100%) rename src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/{material_note.min.js => material-note.min.js} (100%) diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 70826b695..88f5d2b74 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -21,6 +21,8 @@ import gwt.material.design.addins.client.bubble.MaterialBubbleDarkTheme; import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; +import gwt.material.design.addins.client.rating.MaterialRatingDarkTheme; +import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; @@ -29,6 +31,8 @@ public class AddinsDarkThemeLoader extends DarkThemeLoader { public AddinsDarkThemeLoader() { super(new MaterialBubbleDarkTheme(), new MaterialComboBoxDarkTheme(), - new MaterialTimePickerDarkTheme()); + new MaterialTimePickerDarkTheme(), + new MaterialRatingDarkTheme(), + new MaterialRichEditorDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java index 1c8f3504f..1cd3fa784 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsWidgetDarkTheme.java @@ -21,6 +21,7 @@ import com.google.gwt.resources.client.TextResource; import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.client.theme.dark.DarkThemeManager; public class AddinsWidgetDarkTheme extends DarkThemeLoader { @@ -38,6 +39,13 @@ public void suppressReload() { } } + @Override + public void load() { + if (DarkThemeManager.get().isDarkMode()) { + super.load(); + } + } + public boolean isSuppressReload() { return suppressReload; } diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java index 9907a132e..49586fb57 100644 --- a/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRating.java @@ -28,6 +28,7 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.HasValue; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.client.base.MaterialWidget; import gwt.material.design.client.constants.Color; import gwt.material.design.client.constants.IconType; @@ -141,6 +142,7 @@ protected void onLoad() { super.onLoad(); revalidateLayout(); + AddinsDarkThemeReloader.get().reload(MaterialRatingDarkTheme.class); } /** diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java new file mode 100644 index 000000000..e9a302462 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java @@ -0,0 +1,32 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.rating; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +interface MaterialRatingClientBundle extends ClientBundle { + + MaterialRatingClientBundle INSTANCE = GWT.create(MaterialRatingClientBundle.class); + + @Source("resources/css/rating-dark.min.css") + TextResource ratingDarkCss(); +} diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java new file mode 100644 index 000000000..0e2e0960b --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.addins.client.rating; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialRatingDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialRatingDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialRatingDebugClientBundle.INSTANCE.ratingDarkCss() : MaterialRatingClientBundle.INSTANCE.ratingDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java new file mode 100644 index 000000000..cd63c8bb8 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java @@ -0,0 +1,32 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.rating; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + +interface MaterialRatingDebugClientBundle extends ClientBundle { + + MaterialRatingDebugClientBundle INSTANCE = GWT.create(MaterialRatingDebugClientBundle.class); + + @Source("resources/css/rating-dark.css") + TextResource ratingDarkCss(); +} diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java index 86a33cb98..b00983924 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java @@ -32,6 +32,7 @@ import com.google.gwt.user.client.ui.HasHTML; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.richeditor.base.HasPasteHandlers; import gwt.material.design.addins.client.richeditor.base.ToolBarManager; import gwt.material.design.addins.client.richeditor.base.constants.RichEditorEvents; @@ -153,6 +154,7 @@ public void load() { }); checkContainer(); + AddinsDarkThemeReloader.get().reload(MaterialRichEditorDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorClientBundle.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorClientBundle.java index b361cc139..232b2fe67 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorClientBundle.java @@ -32,10 +32,12 @@ interface MaterialRichEditorClientBundle extends ClientBundle { MaterialRichEditorClientBundle INSTANCE = GWT.create(MaterialRichEditorClientBundle.class); - @Source("resources/js/material_note.min.js") + @Source("resources/js/material-note.min.js") TextResource richEditorJs(); - @Source("resources/css/material_note.min.css") + @Source("resources/css/material-note.min.css") TextResource richEditorCss(); + @Source("resources/css/material-note-dark.min.css") + TextResource richEditorDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java new file mode 100644 index 000000000..ee02a27dc --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.addins.client.richeditor; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialRichEditorDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialRichEditorDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialRichEditorDebugClientBundle.INSTANCE.richEditorDarkCss() : MaterialRichEditorClientBundle.INSTANCE.richEditorDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDebugClientBundle.java index e0e4462c0..b9e2e4045 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDebugClientBundle.java @@ -32,9 +32,12 @@ interface MaterialRichEditorDebugClientBundle extends ClientBundle { MaterialRichEditorDebugClientBundle INSTANCE = GWT.create(MaterialRichEditorDebugClientBundle.class); - @Source("resources/js/material_note.js") + @Source("resources/js/material-note.js") TextResource richEditorDebugJs(); - @Source("resources/css/material_note.css") + @Source("resources/css/material-note.css") TextResource richEditorDebugCss(); + + @Source("resources/css/material-note-dark.css") + TextResource richEditorDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/prepros.cfg b/src/main/resources/gwt/material/design/addins/client/prepros.cfg index e6d90264f..963e0a0f0 100644 --- a/src/main/resources/gwt/material/design/addins/client/prepros.cfg +++ b/src/main/resources/gwt/material/design/addins/client/prepros.cfg @@ -475,9 +475,9 @@ }, "ff8d41fa": { "id": "ff8d41fa", - "path": "richeditor/resources/js/material_note.js", - "output": "richeditor/resources/js/material_note.min.js", - "name": "material_note.js", + "path": "richeditor/resources/js/material-note.js", + "output": "richeditor/resources/js/material-note.min.js", + "name": "material-note.js", "category": "JS", "autoCompile": false, "uglify": true, @@ -491,9 +491,9 @@ }, "f819f7ce": { "id": "f819f7ce", - "path": "richeditor/resources/js/material_note.min.js", + "path": "richeditor/resources/js/material-note.min.js", "output": "richeditor/resources/js/material_note.min.min.js", - "name": "material_note.min.js", + "name": "material-note.min.js", "category": "JS", "autoCompile": false, "uglify": true, diff --git a/src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.css b/src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.css new file mode 100644 index 000000000..9faa54dfe --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.css @@ -0,0 +1,3 @@ +.material-rating { + color: #bb86fc; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.min.css b/src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.min.css new file mode 100644 index 000000000..21cc617cb --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/rating/resources/css/rating-dark.min.css @@ -0,0 +1 @@ +.material-rating{color:#bb86fc} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.css b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.css new file mode 100644 index 000000000..fcb00bb20 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.css @@ -0,0 +1,106 @@ +.note-editor { + border-left: 3px solid #424242; + border-bottom: 3px solid #424242; + border-right: 3px solid #424242; + background-color: #424242; +} + +.note-editor .note-toolbar { + background-color: #424242; + color: #fff; +} + +.note-editor .note-editable { + background-color: #3a3a3a; + box-shadow: none; +} + +.note-popover .popover .popover-content > .btn-group, .note-toolbar > .btn-group, +.note-editor .btn, .note-editor .btn-large, .popover .btn, .popover .btn-large { + color: #f3f3f3; + background-color: rgba(255,255,255,0); +} + +.note-editor .btn.active, .note-editor .active.btn-large { + background-color: rgba(255,255,255,.3)!important; +} + +.note-editor .btn:hover, .note-editor .btn-large:hover { + background-color: rgba(255,255,255,.2) !important; +} + +.note-editor ul.dropdown-menu, .popover ul.dropdown-menu { + background-color: #2f2f2f; +} + +/** Dialog **/ +.editorDialogs .modal .modal-footer, .note-editor .modal .modal-footer, +.editorDialogs .modal, .note-editor .modal { + background-color: #383838; + color: #f2f2f2; +} + +.note-dialog .note-help-dialog h4 { + color: #f2f2f2; +} + +.note-dialog .note-help-dialog thead { + background-color: #424242; +} + +.note-dialog .note-help-dialog tbody { + background-color: #383838; +} + +table.striped>tbody>tr:nth-child(odd) { + background-color: #4a4a4a; +} + +.note-editor .note-color-palette, .popover .note-color-palette { + border: transparent; +} + +.editorDialogs .modal .input-field input:not([readonly]), .editorDialogs .modal .input-field input.datepicker, +.note-editor .modal .input-field input:not([readonly]), .note-editor .modal .input-field input.datepicker { + border-color: #9e9e9e !important; +} + +.editorDialogs .modal label, .editorDialogs .modal .input-field input:not([readonly]) + label, .editorDialogs .modal .input-field input.datepicker + label, .editorDialogs .modal .input-field .prefix, .editorDialogs .modal .note-editor + label, .note-editor .modal label, .note-editor .modal .input-field input:not([readonly]) + label, .note-editor .modal .input-field input.datepicker + label, .note-editor .modal .input-field .prefix, .note-editor .modal .note-editor + label { + color: #9e9e9e !important; +} + +button.waves-effect.waves-light.btn.disabled, button.waves-effect.waves-light.disabled.btn-large, button.waves-effect.waves-light.btn.disabled:hover, button.waves-effect.waves-light.disabled.btn-large:hover { + background: transparent !important; +} +.editorDialogs .modal .btn:hover, .editorDialogs .modal .btn-large:hover, .note-editor .modal .btn:hover, .note-editor .modal .btn-large:hover, +.note-editor .modal .btn.modal-close:hover, .editorDialogs .modal .btn, .editorDialogs .modal .btn-large, .note-editor .modal .btn, .note-editor .modal .btn-large { + color: #bb86fc !important; +} + +.editorDialogs .modal .btn-large:hover, .editorDialogs .modal .btn:hover, .editorDialogs .modal .btn-large:hover, .note-editor .modal .btn-large:hover, .note-editor .modal .btn:hover, .note-editor .modal .btn-large:hover, .note-editor .modal .btn.modal-close:hover, .note-editor .modal .modal-close.btn-large:hover, .note-editor .modal .file-field .btn:hover, .note-editor .modal .file-field .btn-large:hover, .note-editor .modal .modal-footer .note-link-btn:hover, .note-editor .modal .modal-footer .note-image-btn:hover { + background: transparent !important; +} + +.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted, .note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted { + background-image: repeating-linear-gradient(0deg, #2f2f2f, #424242 2px, transparent 2px, transparent 26px), repeating-linear-gradient(-90deg, transparent, transparent 2px, #424242 2px, #424242 26px); +} + +.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted { + background-image: repeating-linear-gradient(0deg, #2f2f2f, #424242 2px, transparent 2px, transparent 26px), repeating-linear-gradient(-90deg, transparent, transparent 2px, #777777 2px, #777777 26px); +} + +.note-editor .dropdown-menu label, .popover .dropdown-menu label { + color: #ffffff !important; +} + +table.bordered>thead>tr, table.bordered>tbody>tr { + border-bottom: 1px solid #424242; +} +.codeview .note-misc, +.note-editor .btn.active, .note-editor .active.btn-large { + background-color: rgb(41, 41, 41)!important; +} + +.note-editor.fullscreen .note-editable { + background: #3a3a3a; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.min.css b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.min.css new file mode 100644 index 000000000..d324af8fb --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note-dark.min.css @@ -0,0 +1 @@ +.note-editor{border-left:3px solid #424242;border-bottom:3px solid #424242;border-right:3px solid #424242;background-color:#424242}.note-editor .note-toolbar{background-color:#424242;color:#fff}.note-editor .note-editable{background-color:#3a3a3a;box-shadow:none}.note-editor .btn,.note-editor .btn-large,.note-popover .popover .popover-content>.btn-group,.note-toolbar>.btn-group,.popover .btn,.popover .btn-large{color:#f3f3f3;background-color:rgba(255,255,255,0)}.note-editor .active.btn-large,.note-editor .btn.active{background-color:rgba(255,255,255,.3)!important}.note-editor .btn-large:hover,.note-editor .btn:hover{background-color:rgba(255,255,255,.2)!important}.note-editor ul.dropdown-menu,.popover ul.dropdown-menu{background-color:#2f2f2f}.editorDialogs .modal,.editorDialogs .modal .modal-footer,.note-editor .modal,.note-editor .modal .modal-footer{background-color:#383838;color:#f2f2f2}.note-dialog .note-help-dialog h4{color:#f2f2f2}.note-dialog .note-help-dialog thead{background-color:#424242}.note-dialog .note-help-dialog tbody{background-color:#383838}table.striped>tbody>tr:nth-child(odd){background-color:#4a4a4a}.note-editor .note-color-palette,.popover .note-color-palette{border:transparent}.editorDialogs .modal .input-field input.datepicker,.editorDialogs .modal .input-field input:not([readonly]),.note-editor .modal .input-field input.datepicker,.note-editor .modal .input-field input:not([readonly]){border-color:#9e9e9e!important}.editorDialogs .modal .input-field .prefix,.editorDialogs .modal .input-field input.datepicker+label,.editorDialogs .modal .input-field input:not([readonly])+label,.editorDialogs .modal .note-editor+label,.editorDialogs .modal label,.note-editor .modal .input-field .prefix,.note-editor .modal .input-field input.datepicker+label,.note-editor .modal .input-field input:not([readonly])+label,.note-editor .modal .note-editor+label,.note-editor .modal label{color:#9e9e9e!important}button.waves-effect.waves-light.btn.disabled,button.waves-effect.waves-light.btn.disabled:hover,button.waves-effect.waves-light.disabled.btn-large,button.waves-effect.waves-light.disabled.btn-large:hover{background:0 0!important}.editorDialogs .modal .btn,.editorDialogs .modal .btn-large,.editorDialogs .modal .btn-large:hover,.editorDialogs .modal .btn:hover,.note-editor .modal .btn,.note-editor .modal .btn-large,.note-editor .modal .btn-large:hover,.note-editor .modal .btn.modal-close:hover,.note-editor .modal .btn:hover{color:#bb86fc!important}.editorDialogs .modal .btn-large:hover,.editorDialogs .modal .btn:hover,.note-editor .modal .btn-large:hover,.note-editor .modal .btn.modal-close:hover,.note-editor .modal .btn:hover,.note-editor .modal .file-field .btn-large:hover,.note-editor .modal .file-field .btn:hover,.note-editor .modal .modal-close.btn-large:hover,.note-editor .modal .modal-footer .note-image-btn:hover,.note-editor .modal .modal-footer .note-link-btn:hover{background:0 0!important}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{background-image:repeating-linear-gradient(0deg,#2f2f2f,#424242 2px,transparent 2px,transparent 26px),repeating-linear-gradient(-90deg,transparent,transparent 2px,#424242 2px,#424242 26px)}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{background-image:repeating-linear-gradient(0deg,#2f2f2f,#424242 2px,transparent 2px,transparent 26px),repeating-linear-gradient(-90deg,transparent,transparent 2px,#777 2px,#777 26px)}.note-editor .dropdown-menu label,.popover .dropdown-menu label{color:#fff!important}table.bordered>tbody>tr,table.bordered>thead>tr{border-bottom:1px solid #424242}.codeview .note-misc,.note-editor .active.btn-large,.note-editor .btn.active{background-color:#292929!important}.note-editor.fullscreen .note-editable{background:#3a3a3a} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.css b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.css similarity index 83% rename from src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.css rename to src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.css index ac77942d8..fb833ea42 100644 --- a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.css +++ b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.css @@ -1,5 +1,4 @@ - -/* variables +/* variables =================================================================================*/ .editorDialogs .modal, .note-editor .modal { background-color: #FFFFFF; @@ -7,40 +6,56 @@ z-index: 1057 !important; backface-visibility: hidden; } + .editorDialogs .modal .input-field input:not([readonly]), .editorDialogs .modal .input-field input.datepicker, .note-editor .modal .input-field input:not([readonly]), .note-editor .modal .input-field input.datepicker { - border-color: #000 !important; } + border-color: #000 !important; +} + .editorDialogs .modal .input-field input:focus:not([readonly]), .editorDialogs .modal .input-field input.datepicker:focus, .editorDialogs .modal textarea.materialize-textarea:focus:not([readonly]), .note-editor .modal .input-field input:focus:not([readonly]), .note-editor .modal .input-field input.datepicker:focus, .note-editor .modal textarea.materialize-textarea:focus:not([readonly]) { - box-shadow: 0 1px 0 0 grey!important; + box-shadow: 0 1px 0 0 grey !important; border-color: grey !important; } + .editorDialogs .modal label, .editorDialogs .modal .input-field input:not([readonly]) + label, .editorDialogs .modal .input-field input.datepicker + label, .editorDialogs .modal .input-field .prefix, .editorDialogs .modal .note-editor + label, .note-editor .modal label, .note-editor .modal .input-field input:not([readonly]) + label, .note-editor .modal .input-field input.datepicker + label, .note-editor .modal .input-field .prefix, .note-editor .modal .note-editor + label { - color: #000 !important; } + color: #000 !important; +} + .editorDialogs .modal .input-field input:focus:not([readonly]) + label, .editorDialogs .modal .input-field input.datepicker:focus + label, .editorDialogs .modal .input-field .prefix.active, .editorDialogs .modal textarea.materialize-textarea:focus:not([readonly]) + label, .note-editor .modal .input-field input:focus:not([readonly]) + label, .note-editor .modal .input-field input.datepicker:focus + label, .note-editor .modal .input-field .prefix.active, .note-editor .modal textarea.materialize-textarea:focus:not([readonly]) + label { color: grey; } + +.note-editor .modal .btn.modal-close:hover, .editorDialogs .modal .btn, .editorDialogs .modal .btn-large, .note-editor .modal .btn, .note-editor .modal .btn-large { - background-color: #2196F3; - color: #fff; + background: transparent !important; + width: 120px; + color: #42A5F5 !important; cursor: pointer; } + .editorDialogs .modal .btn:hover, .editorDialogs .modal .btn-large:hover, .note-editor .modal .btn:hover, .note-editor .modal .btn-large:hover { - background-color: #2196F3 !important; - color: #fff; + background: transparent !important; + width: 120px; + color: #42A5F5 !important; } + .editorDialogs .modal .modal-footer, .note-editor .modal .modal-footer { background-color: #E9E9E9; } + .editorDialogs .modal .modal-footer .btnClose, .note-editor .modal .modal-footer .btnClose { margin-right: 15px; background-color: transparent !important; color: grey; } + .editorDialogs .modal .modal-footer .btnClose:hover, .note-editor .modal .modal-footer .btnClose:hover { color: grey; background-color: transparent !important; } + .editorDialogs .modal .canvasContainerEmpty, .note-editor .modal .canvasContainerEmpty { - border: solid 5px #9c27b0; } + border: solid 5px #9c27b0; +} .note-editor { position: relative; @@ -49,32 +64,51 @@ border-right: 3px solid #e9e9e9; background: #E9E9E9; } + .note-editor .img-circle { - border-radius: 50%; } + border-radius: 50%; +} + .note-editor .img-rounded { - border-radius: 5%; } + border-radius: 5%; +} + .note-editor .img-thumbnail { border: solid 5px #e9e9e9; - height: 200px; } + height: 200px; +} + .note-editor .img-bordered { - border: solid 5px #e9e9e9; } + border: solid 5px #e9e9e9; +} + .note-editor .btn:hover, .note-editor .btn-large:hover { background-color: #E9E9E9 !important; } + .note-editor .btn.active, .note-editor .active.btn-large { background-color: #E0E0E0; } + .note-editor .note-editable ul li { list-style-type: square !important; display: list-item; - list-style-position: inside; } + list-style-position: inside; +} + .note-editor .note-dialog > div { - display: none; } + display: none; +} + .note-editor .note-dialog .form-group { margin-right: 0; - margin-left: 0; } + margin-left: 0; +} + .note-editor .note-dialog .note-modal-form { - margin: 0; } + margin: 0; +} + .note-editor .note-dialog .note-image-dialog .note-dropzone { min-height: 100px; margin-bottom: 10px; @@ -82,19 +116,27 @@ line-height: 4; color: lightgray; text-align: center; - border: 4px dashed lightgray; } + border: 4px dashed lightgray; +} + .note-editor .transparent { - opacity: 0; } + opacity: 0; +} + .note-editor .note-resizebar { background-color: #e9e9e9; width: 100%; height: 13px; cursor: ns-resize; - padding-top: 1px; } + padding-top: 1px; +} + .note-editor .note-resizebar .note-icon-bar { width: 20px; margin: 2px auto; - border-top: 2px solid #545454; } + border-top: 2px solid #545454; +} + .note-editor .note-toolbar { position: relative; color: #000; @@ -103,59 +145,88 @@ z-index: 995 !important; padding: 2%; } + .note-editor .note-toolbar ul { - padding: 0; } + padding: 0; +} + .note-editor .note-toolbar .btn.disabled, .note-editor .note-toolbar .disabled.btn-large, .note-editor .note-toolbar button.disabled { - display: none; } + display: none; +} + .note-editor .note-toolbar .dropdown { - cursor: pointer; } + cursor: pointer; +} + .note-editor .note-toolbar .note-current-fontname { min-width: 134px; display: inline-block; - text-align: left; } + text-align: left; +} + .note-editor .note-handle .note-control-selection { position: absolute; display: none; - border: 2px solid #e9e9e9; } + border: 2px solid #e9e9e9; +} + .note-editor .note-handle .note-control-selection .note-control-selection-bg { width: 100%; height: 100%; z-index: 3; - background-color: rgba(117, 117, 117, 0.3); } + background-color: rgba(117, 117, 117, 0.3); +} + .note-editor .note-handle .note-control-selection > div { - position: absolute; } + position: absolute; +} + .note-editor .note-handle .note-control-selection .note-control-handle { width: 7px; height: 7px; - border: 1px solid black; } + border: 1px solid black; +} + .note-editor .note-handle .note-control-selection .note-control-holder { width: 7px; height: 7px; - border: 1px solid black; } + border: 1px solid black; +} + .note-editor .note-handle .note-control-selection .note-control-sizing { width: 15px; height: 15px; background-color: #e9e9e9; z-index: 5; - cursor: se-resize; } + cursor: se-resize; +} + .note-editor .note-handle .note-control-selection .note-control-nw { top: -5px; left: -5px; border-right: 0; - border-bottom: 0; } + border-bottom: 0; +} + .note-editor .note-handle .note-control-selection .note-control-ne { top: -5px; right: -5px; border-bottom: 0; - border-left: none; } + border-left: none; +} + .note-editor .note-handle .note-control-selection .note-control-sw { bottom: -5px; left: -5px; border-top: 0; - border-right: 0; } + border-right: 0; +} + .note-editor .note-handle .note-control-selection .note-control-se { right: -5px; - bottom: -5px; } + bottom: -5px; +} + .note-editor .note-handle .note-control-selection .note-control-selection-info { right: 0; bottom: 0; @@ -164,34 +235,55 @@ font-size: 15px; color: #000; background-color: #e9e9e9; - z-index: 5; } + z-index: 5; +} .note-dialog .note-help-dialog { color: #777777; } + .note-dialog .note-help-dialog h4 { - color: #000; } + color: #000; +} + .note-dialog .note-help-dialog thead { background-color: #777777; color: #fff; } + +.note-dialog .note-help-dialog td, +.note-dialog .note-help-dialog thead th { + padding-left: 12px !important; + padding-right: 12px !important; +} + .note-dialog .note-help-dialog tbody { - background-color: #e0e0e0; } + background-color: #e0e0e0; +} .note-editor .btn-group, .popover .btn-group { display: inline-block; margin-right: 10px; position: relative; } + .note-editor .btn-group ul, .popover .btn-group ul { - padding: 0; } + padding: 0; +} + .note-editor .btn-group .closeLeft, .popover .btn-group .closeLeft { padding-right: 0 !important; - margin-right: 0 !important; } + margin-right: 0 !important; +} + .note-editor .btn-group .closeLeft i, .popover .btn-group .closeLeft i { - margin-right: 0 !important; } + margin-right: 0 !important; +} + .note-editor .btn-group i.left, .popover .btn-group i.left { - margin-right: 5px; } + margin-right: 5px; +} + .note-editor .btn, .note-editor .btn-large, .popover .btn, .popover .btn-large { border-radius: 0 !important; box-shadow: none !important; @@ -199,41 +291,61 @@ color: #7F7A7A; background: #fff; } + .note-editor .btnSecond, .popover .btnSecond { - background-color: #B71C1C !important; } + background-color: #B71C1C !important; +} + .note-editor .btnThird, .popover .btnThird { - background-color: #4a148c !important; } + background-color: #4a148c !important; +} + .note-editor note-toolbar button, .note-editor button, .popover note-toolbar button, .popover button { border: none; height: 36px; text-transform: none; } + .note-editor [type="checkbox"]:checked + label:before, .note-editor [type="checkbox"]:checked + label:before, .popover [type="checkbox"]:checked + label:before, .popover [type="checkbox"]:checked + label:before { border-right-color: #9e9e9e !important; border-bottom-color: #9e9e9e !important; } + .note-editor .note-palette-title, .popover .note-palette-title { - padding: 0 !important; } + padding: 0 !important; +} + .note-editor .colorName, .popover .colorName { display: inline-block; - color: #000; } + color: #000; +} + @media only screen and (max-width: 600px) { .note-editor .colorName, .popover .colorName { - display: none; } } + display: none; + } +} + .note-editor .note-color-palette, .popover .note-color-palette { line-height: 10px; border: solid 3px #e9e9e9; padding: 0 !important; overflow-x: scroll; - overflow-y: hidden; } + overflow-y: hidden; +} + .note-editor .note-color-palette .note-color-row, .popover .note-color-palette .note-color-row { padding: 0 !important; - min-width: 300px; } + min-width: 300px; +} + .note-editor .note-color-palette button.note-color-btn, .popover .note-color-palette button.note-color-btn { width: 20px; height: 20px; padding: 0; - margin: 0; } + margin: 0; +} + .note-editor .note-color-palette .note-color-btn:hover:after, .popover .note-color-palette .note-color-btn:hover:after { position: absolute; width: 30px; @@ -241,46 +353,70 @@ content: ""; background-color: inherit; margin-top: -15px; - margin-left: -15px; } + margin-left: -15px; +} + .note-editor .note-dimension-picker, .popover .note-dimension-picker { - overflow: hidden; } + overflow: hidden; +} + .note-editor .largeDropdown, .popover .largeDropdown { - width: 290px; } + width: 290px; +} + .note-editor .dropdown-menu, .popover .dropdown-menu { - z-index: 1033; } + z-index: 1033; +} + .note-editor .dropdown-menu.note-check, .popover .dropdown-menu.note-check { - min-width: 80px; } + min-width: 80px; +} + .note-editor .dropdown-menu label, .popover .dropdown-menu label { - color: #000 !important; } + color: #000 !important; +} + .note-editor ul.dropdown-menu, .popover ul.dropdown-menu { position: absolute; top: 20px; background-color: #FFFFFF; - box-shadow: 0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } + .note-editor ul.dropdown-menu#colors, .popover ul.dropdown-menu#colors { - width: 342px; } + width: 342px; +} + .note-editor ul.dropdown-menu#colors .indicator, .popover ul.dropdown-menu#colors .indicator { width: 50%; left: 0; } + .note-editor ul.dropdown-menu .colorTable, .popover ul.dropdown-menu .colorTable { - padding: 3px 0; } + padding: 3px 0; +} + .note-editor ul.dropdown-menu .tabs, .popover ul.dropdown-menu .tabs { background: transparent; } + .popover ul.dropdown-menu .tabs:hover { background-color: #e9e9e9; } + .note-editor ul.dropdown-menu .tabs .tab a, .note-editor ul.dropdown-menu .tabs .tab a:hover, .popover ul.dropdown-menu .tabs .tab a, .popover ul.dropdown-menu .tabs .tab a:hover { color: #7F7A7A; } + .note-editor ul.dropdown-menu .tabs .indicator, .popover ul.dropdown-menu .tabs .indicator { background-color: #868181; } + .note-editor ul.dropdown-menu li, .popover ul.dropdown-menu li { list-style-type: none; - padding: 0 !important; } + padding: 0 !important; +} + .note-editor ul.dropdown-menu li div, .popover ul.dropdown-menu li div { padding: 3px 15px; cursor: pointer; @@ -289,40 +425,57 @@ .note-popover .popover { position: absolute; max-width: none; - color: #000; } + color: #000; +} + .note-popover .popover .arrow { width: 0; height: 0; border-style: solid; border-width: 0 10px 10px 10px; - border-color: transparent transparent #e9e9e9 transparent; } + border-color: transparent transparent #e9e9e9 transparent; +} + .note-popover .popover .popover-content { - background-color: #e9e9e9; } + background-color: #e9e9e9; +} + .note-popover .popover .popover-content > a { - margin-left: 12px; } + margin-left: 12px; +} + .note-popover .popover .popover-content a { display: inline-block; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - vertical-align: middle; } + vertical-align: middle; +} + .note-popover .popover .popover-content .arrow { - left: 20px; } + left: 20px; +} + .note-popover .popover .popover-content .btn-group { - display: inline-block; } + display: inline-block; +} + .note-popover .popover .popover-content .btn-group .btn, .note-popover .popover .popover-content .btn-group .btn-large { border-radius: 0 !important; box-shadow: none !important; padding: 0 9px !important; - background-color: #e9e9e9; } + background-color: #e9e9e9; +} .note-popover .popover .popover-content .note-para .dropdown-menu, .note-toolbar .note-para .dropdown-menu { min-width: 172px; - padding: 5px; } + padding: 5px; +} .note-popover .popover .popover-content .note-para .dropdown-menu > div:first-child, .note-toolbar .note-para .dropdown-menu > div:first-child { - margin-right: 5px; } + margin-right: 5px; +} .note-editor .note-dropzone { position: absolute; @@ -332,47 +485,58 @@ background-color: white; border: 2px dashed #87cefa; opacity: .95; - pointer-event: none; } + pointer-event: none; +} .note-editor .note-dropzone .note-dropzone-message { display: table-cell; font-size: 28px; font-weight: bold; text-align: center; - vertical-align: middle; } + vertical-align: middle; +} .note-editor .note-dropzone.hover { color: #098ddf; - border: 2px dashed #098ddf; } + border: 2px dashed #098ddf; +} .note-editor.dragover .note-dropzone { - display: table; } + display: table; +} .note-editor.fullscreen { position: fixed; top: 0; left: 0; z-index: 2021; - width: 100%; } + width: 100%; +} .note-editor.fullscreen .note-editable { - background-color: white; } + background-color: white; +} .note-editor.fullscreen .note-resizebar { - display: none; } + display: none; +} .note-editor.codeview .note-editable { - display: none; } + display: none; +} .note-editor.codeview .note-codable { - display: block; } + display: block; +} .note-editor .note-statusbar { - background-color: #f5f5f5; } + background-color: #f5f5f5; +} .note-editor .note-editable[contenteditable=true]:empty:not(:focus):before { color: #a9a9a9; - content: attr(data-placeholder); } + content: attr(data-placeholder); +} .note-editor .note-editable { padding: 10px; @@ -380,11 +544,12 @@ outline: 0; background: #fff; margin: 2%; - box-shadow: 0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } .note-editor .note-editable[contenteditable="false"] { - background-color: #e5e5e5; } + background-color: #e5e5e5; +} .note-editor .note-codable { display: none; @@ -404,15 +569,18 @@ -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; - resize: none; } + resize: none; +} .note-air-editor { - outline: 0; } + outline: 0; +} .note-popover .popover .popover-content, .note-toolbar { padding: 0; - margin: 0; } + margin: 0; +} .note-popover .popover .popover-content > .btn-group, .note-toolbar > .btn-group { @@ -421,17 +589,19 @@ margin-left: 0; background: #fff; margin: 4px; - box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12); + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); } .note-popover .popover .popover-content .btn-group .note-table, .note-toolbar .btn-group .note-table { min-width: 0; - padding: 5px; } + padding: 5px; +} .note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker, .note-toolbar .btn-group .note-table .note-dimension-picker { - font-size: 18px; } + font-size: 18px; +} .note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher, .note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher { @@ -439,7 +609,8 @@ z-index: 3; width: 260px; height: 260px; - cursor: pointer; } + cursor: pointer; +} .note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted { @@ -475,27 +646,32 @@ .note-toolbar .note-style h6, .note-popover .popover .popover-content .note-style blockquote, .note-toolbar .note-style blockquote { - margin: 0; } + margin: 0; +} .note-popover .popover .popover-content .note-color .dropdown-toggle, .note-toolbar .note-color .dropdown-toggle { width: 20px; - padding-left: 5px; } + padding-left: 5px; +} .note-popover .popover .popover-content .note-color .dropdown-menu .btn-group, .note-toolbar .note-color .dropdown-menu .btn-group { - margin: 0; } + margin: 0; +} .note-popover .popover .popover-content .note-color .dropdown-menu .btn-group:first-child, .note-toolbar .note-color .dropdown-menu .btn-group:first-child { - margin: 0 5px; } + margin: 0 5px; +} .note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title, .note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title { margin: 2px 7px; font-size: 12px; text-align: center; - border-bottom: 1px solid #eee; } + border-bottom: 1px solid #eee; +} .note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset, .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset { @@ -505,15 +681,18 @@ cursor: pointer; -webkit-border-radius: 5px; -moz-border-radius: 5px; - border-radius: 5px; } + border-radius: 5px; +} .note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-row, .note-toolbar .note-color .dropdown-menu .btn-group .note-color-row { - height: 20px; } + height: 20px; +} .note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover, .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover { - background: #eee; } + background: #eee; +} /*.note-popover .popover .popover-content .dropdown-menu, .note-toolbar .dropdown-menu { @@ -522,36 +701,42 @@ .note-popover .popover .popover-content .dropdown-menu.right, .note-toolbar .dropdown-menu.right { right: 0; - left: auto; } + left: auto; +} .note-popover .popover .popover-content .dropdown-menu.right::before, .note-toolbar .dropdown-menu.right::before { right: 9px; - left: auto !important; } + left: auto !important; +} .note-popover .popover .popover-content .dropdown-menu.right::after, .note-toolbar .dropdown-menu.right::after { right: 10px; - left: auto !important; } + left: auto !important; +} .note-popover .popover .popover-content .dropdown-menu.note-check li a i, .note-toolbar .dropdown-menu.note-check li a i { color: deepskyblue; - visibility: hidden; } + visibility: hidden; +} .note-popover .popover .popover-content .dropdown-menu.note-check li a.checked i, .note-toolbar .dropdown-menu.note-check li a.checked i { - visibility: visible; } + visibility: visible; +} .note-popover .popover .popover-content .note-fontsize-10, .note-toolbar .note-fontsize-10 { - font-size: 10px; } + font-size: 10px; +} -.codeview .note-style, .codeview .note-fonts, .codeview .note-color, .codeview .note-undo, .codeview .note-para, .codeview .note-height { +.codeview .note-style, .codeview .note-fonts, .codeview .note-color, .codeview .note-undo, .codeview .note-para, .codeview .note-height { display: none; } -.codeview .note-misc{ +.codeview .note-misc { background: #E0E0E0 !important; padding-right: 12px !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.min.css b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.min.css new file mode 100644 index 000000000..f89d78f88 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material-note.min.css @@ -0,0 +1 @@ +.editorDialogs .modal,.note-editor .modal{background-color:#fff;color:#404040;z-index:1057!important;backface-visibility:hidden}.editorDialogs .modal .input-field input.datepicker,.editorDialogs .modal .input-field input:not([readonly]),.note-editor .modal .input-field input.datepicker,.note-editor .modal .input-field input:not([readonly]){border-color:#000!important}.editorDialogs .modal .input-field input.datepicker:focus,.editorDialogs .modal .input-field input:focus:not([readonly]),.editorDialogs .modal textarea.materialize-textarea:focus:not([readonly]),.note-editor .modal .input-field input.datepicker:focus,.note-editor .modal .input-field input:focus:not([readonly]),.note-editor .modal textarea.materialize-textarea:focus:not([readonly]){box-shadow:0 1px 0 0 grey!important;border-color:grey!important}.editorDialogs .modal .input-field .prefix,.editorDialogs .modal .input-field input.datepicker+label,.editorDialogs .modal .input-field input:not([readonly])+label,.editorDialogs .modal .note-editor+label,.editorDialogs .modal label,.note-editor .modal .input-field .prefix,.note-editor .modal .input-field input.datepicker+label,.note-editor .modal .input-field input:not([readonly])+label,.note-editor .modal .note-editor+label,.note-editor .modal label{color:#000!important}.editorDialogs .modal .input-field .prefix.active,.editorDialogs .modal .input-field input.datepicker:focus+label,.editorDialogs .modal .input-field input:focus:not([readonly])+label,.editorDialogs .modal textarea.materialize-textarea:focus:not([readonly])+label,.note-editor .modal .input-field .prefix.active,.note-editor .modal .input-field input.datepicker:focus+label,.note-editor .modal .input-field input:focus:not([readonly])+label,.note-editor .modal textarea.materialize-textarea:focus:not([readonly])+label{color:grey}.editorDialogs .modal .btn,.editorDialogs .modal .btn-large,.note-editor .modal .btn,.note-editor .modal .btn-large{background-color:#2196f3;color:#fff;cursor:pointer}.editorDialogs .modal .btn-large:hover,.editorDialogs .modal .btn:hover,.note-editor .modal .btn-large:hover,.note-editor .modal .btn:hover{background-color:#2196f3!important;color:#fff}.editorDialogs .modal .modal-footer,.note-editor .modal .modal-footer{background-color:#e9e9e9}.editorDialogs .modal .modal-footer .btnClose,.note-editor .modal .modal-footer .btnClose{margin-right:15px;background-color:transparent!important;color:grey}.editorDialogs .modal .btn,.editorDialogs .modal .btn-large,.note-editor .modal .btn,.note-editor .modal .btn-large{background:0 0!important;width:120px;color:#42a5f5!important}.editorDialogs .modal .modal-footer .btnClose:hover,.note-editor .modal .modal-footer .btnClose:hover{color:grey;background-color:transparent!important}.editorDialogs .modal .canvasContainerEmpty,.note-editor .modal .canvasContainerEmpty{border:solid 5px #9c27b0}.note-editor{position:relative;border-left:3px solid #e9e9e9;border-bottom:3px solid #e9e9e9;border-right:3px solid #e9e9e9;background:#e9e9e9}.note-editor .img-circle{border-radius:50%}.note-editor .img-rounded{border-radius:5%}.note-editor .img-thumbnail{border:solid 5px #e9e9e9;height:200px}.note-editor .img-bordered{border:solid 5px #e9e9e9}.note-editor .btn-large:hover,.note-editor .btn:hover{background-color:#e9e9e9!important}.note-editor .active.btn-large,.note-editor .btn.active{background-color:#e0e0e0}.note-editor .note-editable ul li{list-style-type:square!important;display:list-item;list-style-position:inside}.note-editor .note-dialog>div{display:none}.note-editor .note-dialog .form-group{margin-right:0;margin-left:0}.note-editor .note-dialog .note-modal-form{margin:0}.note-editor .note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:#d3d3d3;text-align:center;border:4px dashed #d3d3d3}.note-editor .transparent{opacity:0}.note-editor .note-resizebar{background-color:#e9e9e9;width:100%;height:13px;cursor:ns-resize;padding-top:1px}.note-editor .note-resizebar .note-icon-bar{width:20px;margin:2px auto;border-top:2px solid #545454}.note-editor .note-toolbar{position:relative;color:#000;background-color:#e9e9e9;margin:0;z-index:995!important;padding:2%}.note-editor .note-toolbar ul{padding:0}.note-editor .note-toolbar .btn.disabled,.note-editor .note-toolbar .disabled.btn-large,.note-editor .note-toolbar button.disabled{display:none}.note-editor .note-toolbar .dropdown{cursor:pointer}.note-editor .note-toolbar .note-current-fontname{min-width:134px;display:inline-block;text-align:left}.note-editor .note-handle .note-control-selection{position:absolute;display:none;border:2px solid #e9e9e9}.note-editor .note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;z-index:3;background-color:rgba(117,117,117,.3)}.note-editor .note-handle .note-control-selection>div{position:absolute}.note-editor .note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid #000}.note-editor .note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-editor .note-handle .note-control-selection .note-control-sizing{width:15px;height:15px;background-color:#e9e9e9;z-index:5;cursor:se-resize}.note-editor .note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-editor .note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-editor .note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-editor .note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px}.note-editor .note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:17px;font-size:15px;color:#000;background-color:#e9e9e9;z-index:5}.note-dialog .note-help-dialog{color:#777}.note-dialog .note-help-dialog h4{color:#000}.note-dialog .note-help-dialog thead{background-color:#777;color:#fff}.note-dialog .note-help-dialog td,.note-dialog .note-help-dialog thead th{padding-left:12px!important;padding-right:12px!important}.note-dialog .note-help-dialog tbody{background-color:#e0e0e0}.note-editor .btn-group,.popover .btn-group{display:inline-block;margin-right:10px;position:relative}.note-editor .btn-group ul,.popover .btn-group ul{padding:0}.note-editor .btn-group .closeLeft,.popover .btn-group .closeLeft{padding-right:0!important;margin-right:0!important}.note-editor .btn-group .closeLeft i,.popover .btn-group .closeLeft i{margin-right:0!important}.note-editor .btn-group i.left,.popover .btn-group i.left{margin-right:5px}.note-editor .btn,.note-editor .btn-large,.popover .btn,.popover .btn-large{border-radius:0!important;box-shadow:none!important;padding:0 9px!important;color:#7f7a7a;background:#fff}.note-editor .btnSecond,.popover .btnSecond{background-color:#b71c1c!important}.note-editor .btnThird,.popover .btnThird{background-color:#4a148c!important}.note-editor button,.note-editor note-toolbar button,.popover button,.popover note-toolbar button{border:none;height:36px;text-transform:none}.note-editor [type=checkbox]:checked+label:before,.popover [type=checkbox]:checked+label:before{border-right-color:#9e9e9e!important;border-bottom-color:#9e9e9e!important}.note-editor .note-palette-title,.popover .note-palette-title{padding:0!important}.note-editor .colorName,.popover .colorName{display:inline-block;color:#000}@media only screen and (max-width:600px){.note-editor .colorName,.popover .colorName{display:none}}.note-editor .note-color-palette,.popover .note-color-palette{line-height:10px;border:solid 3px #e9e9e9;padding:0!important;overflow-x:scroll;overflow-y:hidden}.note-editor .note-color-palette .note-color-row,.popover .note-color-palette .note-color-row{padding:0!important;min-width:300px}.note-editor .note-color-palette button.note-color-btn,.popover .note-color-palette button.note-color-btn{width:20px;height:20px;padding:0;margin:0}.note-editor .note-color-palette .note-color-btn:hover:after,.popover .note-color-palette .note-color-btn:hover:after{position:absolute;width:30px;height:30px;content:"";background-color:inherit;margin-top:-15px;margin-left:-15px}.note-editor .note-dimension-picker,.popover .note-dimension-picker{overflow:hidden}.note-editor .largeDropdown,.popover .largeDropdown{width:290px}.note-editor .dropdown-menu,.popover .dropdown-menu{z-index:1033}.note-editor .dropdown-menu.note-check,.popover .dropdown-menu.note-check{min-width:80px}.note-editor .dropdown-menu label,.popover .dropdown-menu label{color:#000!important}.note-editor ul.dropdown-menu,.popover ul.dropdown-menu{position:absolute;top:20px;background-color:#fff;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.note-editor ul.dropdown-menu#colors,.popover ul.dropdown-menu#colors{width:342px}.note-editor ul.dropdown-menu#colors .indicator,.popover ul.dropdown-menu#colors .indicator{width:50%;left:0}.note-editor ul.dropdown-menu .colorTable,.popover ul.dropdown-menu .colorTable{padding:3px 0}.note-editor ul.dropdown-menu .tabs,.popover ul.dropdown-menu .tabs{background:0 0}.popover ul.dropdown-menu .tabs:hover{background-color:#e9e9e9}.note-editor ul.dropdown-menu .tabs .tab a,.note-editor ul.dropdown-menu .tabs .tab a:hover,.popover ul.dropdown-menu .tabs .tab a,.popover ul.dropdown-menu .tabs .tab a:hover{color:#7f7a7a}.note-editor ul.dropdown-menu .tabs .indicator,.popover ul.dropdown-menu .tabs .indicator{background-color:#868181}.note-editor ul.dropdown-menu li,.popover ul.dropdown-menu li{list-style-type:none;padding:0!important}.note-editor ul.dropdown-menu li div,.popover ul.dropdown-menu li div{padding:3px 15px;cursor:pointer}.note-popover .popover{position:absolute;max-width:none;color:#000}.note-popover .popover .arrow{width:0;height:0;border-style:solid;border-width:0 10px 10px 10px;border-color:transparent transparent #e9e9e9 transparent}.note-popover .popover .popover-content{background-color:#e9e9e9}.note-popover .popover .popover-content>a{margin-left:12px}.note-popover .popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover .popover .popover-content .arrow{left:20px}.note-popover .popover .popover-content .btn-group{display:inline-block}.note-popover .popover .popover-content .btn-group .btn,.note-popover .popover .popover-content .btn-group .btn-large{border-radius:0!important;box-shadow:none!important;padding:0 9px!important;background-color:#e9e9e9}.note-popover .popover .popover-content .note-para .dropdown-menu,.note-toolbar .note-para .dropdown-menu{min-width:172px;padding:5px}.note-popover .popover .popover-content .note-para .dropdown-menu>div:first-child,.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:#fff;border:2px dashed #87cefa;opacity:.95;pointer-event:none}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf;border:2px dashed #098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor.fullscreen{position:fixed;top:0;left:0;z-index:2021;width:100%}.note-editor.fullscreen .note-editable{background-color:#fff}.note-editor.fullscreen .note-resizebar{display:none}.note-editor.codeview .note-editable{display:none}.note-editor.codeview .note-codable{display:block}.note-editor .note-statusbar{background-color:#f5f5f5}.note-editor .note-editable[contenteditable=true]:empty:not(:focus):before{color:#a9a9a9;content:attr(data-placeholder)}.note-editor .note-editable{padding:10px;overflow:auto;outline:0;background:#fff;margin:2%;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.note-editor .note-editable[contenteditable=false]{background-color:#e5e5e5}.note-editor .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-air-editor{outline:0}.note-popover .popover .popover-content,.note-toolbar{padding:0;margin:0}.note-popover .popover .popover-content>.btn-group,.note-toolbar>.btn-group{margin-top:0;margin-right:5px;margin-left:0;background:#fff;margin:4px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.note-popover .popover .popover-content .btn-group .note-table,.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker,.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:260px;height:260px;cursor:pointer}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:312px;height:130px;background-size:26px 26px;background-image:repeating-linear-gradient(0deg,#fff,#fff 2px,transparent 2px,transparent 26px),repeating-linear-gradient(-90deg,transparent,transparent 2px,#e9e9e9 2px,#e9e9e9 26px)}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:26px;height:26px;background-size:26px 26px;background-image:repeating-linear-gradient(0deg,#fff,#fff 2px,transparent 2px,transparent 26px),repeating-linear-gradient(-90deg,transparent,transparent 2px,#9e9e9e 2px,#9e9e9e 26px)}.note-popover .popover .popover-content .note-style blockquote,.note-popover .popover .popover-content .note-style h1,.note-popover .popover .popover-content .note-style h2,.note-popover .popover .popover-content .note-style h3,.note-popover .popover .popover-content .note-style h4,.note-popover .popover .popover-content .note-style h5,.note-popover .popover .popover-content .note-style h6,.note-toolbar .note-style blockquote,.note-toolbar .note-style h1,.note-toolbar .note-style h2,.note-toolbar .note-style h3,.note-toolbar .note-style h4,.note-toolbar .note-style h5,.note-toolbar .note-style h6{margin:0}.note-popover .popover .popover-content .note-color .dropdown-toggle,.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group,.note-toolbar .note-color .dropdown-menu .btn-group{margin:0}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group:first-child,.note-toolbar .note-color .dropdown-menu .btn-group:first-child{margin:0 5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title,.note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset{padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-row,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-row{height:20px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover{background:#eee}.note-popover .popover .popover-content .dropdown-menu.right,.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover .popover-content .dropdown-menu.right::before,.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu.right::after,.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu.note-check li a i,.note-toolbar .dropdown-menu.note-check li a i{color:#00bfff;visibility:hidden}.note-popover .popover .popover-content .dropdown-menu.note-check li a.checked i,.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover .popover-content .note-fontsize-10,.note-toolbar .note-fontsize-10{font-size:10px}.codeview .note-color,.codeview .note-fonts,.codeview .note-height,.codeview .note-para,.codeview .note-style,.codeview .note-undo{display:none}.codeview .note-misc{background:#e0e0e0!important;padding-right:12px!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.min.css b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.min.css deleted file mode 100644 index b48903801..000000000 --- a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/css/material_note.min.css +++ /dev/null @@ -1 +0,0 @@ -.editorDialogs .modal,.note-editor .modal{background-color:#FFF;color:#404040;z-index:1057!important;backface-visibility:hidden}.editorDialogs .modal .input-field input.datepicker,.editorDialogs .modal .input-field input:not([readonly]),.note-editor .modal .input-field input.datepicker,.note-editor .modal .input-field input:not([readonly]){border-color:#000!important}.editorDialogs .modal .input-field input.datepicker:focus,.editorDialogs .modal .input-field input:focus:not([readonly]),.editorDialogs .modal textarea.materialize-textarea:focus:not([readonly]),.note-editor .modal .input-field input.datepicker:focus,.note-editor .modal .input-field input:focus:not([readonly]),.note-editor .modal textarea.materialize-textarea:focus:not([readonly]){box-shadow:0 1px 0 0 grey!important;border-color:grey!important}.editorDialogs .modal .input-field .prefix,.editorDialogs .modal .input-field input.datepicker+label,.editorDialogs .modal .input-field input:not([readonly])+label,.editorDialogs .modal .note-editor+label,.editorDialogs .modal label,.note-editor .modal .input-field .prefix,.note-editor .modal .input-field input.datepicker+label,.note-editor .modal .input-field input:not([readonly])+label,.note-editor .modal .note-editor+label,.note-editor .modal label{color:#000!important}.editorDialogs .modal .input-field .prefix.active,.editorDialogs .modal .input-field input.datepicker:focus+label,.editorDialogs .modal .input-field input:focus:not([readonly])+label,.editorDialogs .modal textarea.materialize-textarea:focus:not([readonly])+label,.note-editor .modal .input-field .prefix.active,.note-editor .modal .input-field input.datepicker:focus+label,.note-editor .modal .input-field input:focus:not([readonly])+label,.note-editor .modal textarea.materialize-textarea:focus:not([readonly])+label{color:grey}.editorDialogs .modal .btn,.editorDialogs .modal .btn-large,.note-editor .modal .btn,.note-editor .modal .btn-large{background-color:#2196F3;color:#fff;cursor:pointer}.editorDialogs .modal .btn-large:hover,.editorDialogs .modal .btn:hover,.note-editor .modal .btn-large:hover,.note-editor .modal .btn:hover{background-color:#2196F3!important;color:#fff}.editorDialogs .modal .modal-footer,.note-editor .modal .modal-footer{background-color:#E9E9E9}.editorDialogs .modal .modal-footer .btnClose,.note-editor .modal .modal-footer .btnClose{margin-right:15px;background-color:transparent!important;color:grey}.editorDialogs .modal .modal-footer .btnClose:hover,.note-editor .modal .modal-footer .btnClose:hover{color:grey;background-color:transparent!important}.editorDialogs .modal .canvasContainerEmpty,.note-editor .modal .canvasContainerEmpty{border:5px solid #9c27b0}.note-editor{position:relative;border-left:3px solid #e9e9e9;border-bottom:3px solid #e9e9e9;border-right:3px solid #e9e9e9;background:#E9E9E9}.note-editor .img-circle{border-radius:50%}.note-editor .img-rounded{border-radius:5%}.note-editor .img-thumbnail{border:5px solid #e9e9e9;height:200px}.note-editor .img-bordered{border:5px solid #e9e9e9}.note-editor .btn-large:hover,.note-editor .btn:hover{background-color:#E9E9E9!important}.note-editor .active.btn-large,.note-editor .btn.active{background-color:#E0E0E0}.note-editor .note-editable ul li{list-style-type:square!important;display:list-item;list-style-position:inside}.note-editor .note-dialog>div,.note-editor .note-toolbar .btn.disabled,.note-editor .note-toolbar .disabled.btn-large,.note-editor .note-toolbar button.disabled{display:none}.note-editor .note-dialog .form-group{margin-right:0;margin-left:0}.note-editor .note-dialog .note-modal-form{margin:0}.note-editor .note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:#d3d3d3;text-align:center;border:4px dashed #d3d3d3}.note-editor .transparent{opacity:0}.note-editor .note-resizebar{background-color:#e9e9e9;width:100%;height:13px;cursor:ns-resize;padding-top:1px}.note-editor .note-resizebar .note-icon-bar{width:20px;margin:2px auto;border-top:2px solid #545454}.note-editor .note-toolbar{position:relative;color:#000;background-color:#e9e9e9;margin:0;z-index:995!important;padding:2%}.note-editor .note-toolbar ul{padding:0}.note-editor .note-toolbar .dropdown{cursor:pointer}.note-editor .note-toolbar .note-current-fontname{min-width:134px;display:inline-block;text-align:left}.note-editor .note-handle .note-control-selection{position:absolute;display:none;border:2px solid #e9e9e9}.note-editor .note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;z-index:3;background-color:rgba(117,117,117,.3)}.note-editor .note-handle .note-control-selection>div{position:absolute}.note-editor .note-handle .note-control-selection .note-control-handle,.note-editor .note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-editor .note-handle .note-control-selection .note-control-sizing{width:15px;height:15px;background-color:#e9e9e9;z-index:5;cursor:se-resize}.note-editor .note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-editor .note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-editor .note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-editor .note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px}.note-editor .note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:17px;font-size:15px;color:#000;background-color:#e9e9e9;z-index:5}.note-dialog .note-help-dialog{color:#777}.note-dialog .note-help-dialog h4{color:#000}.note-dialog .note-help-dialog thead{background-color:#777;color:#fff}.note-dialog .note-help-dialog tbody{background-color:#e0e0e0}.note-editor .btn-group,.popover .btn-group{display:inline-block;margin-right:10px;position:relative}.note-editor .btn-group ul,.popover .btn-group ul{padding:0}.note-editor .btn-group .closeLeft,.popover .btn-group .closeLeft{padding-right:0!important;margin-right:0!important}.note-editor .btn-group .closeLeft i,.popover .btn-group .closeLeft i{margin-right:0!important}.note-editor .btn-group i.left,.popover .btn-group i.left{margin-right:5px}.note-editor .btn,.note-editor .btn-large,.popover .btn,.popover .btn-large{border-radius:0!important;box-shadow:none!important;padding:0 9px!important;color:#7F7A7A;background:#fff}.note-editor .btnSecond,.popover .btnSecond{background-color:#B71C1C!important}.note-editor .btnThird,.popover .btnThird{background-color:#4a148c!important}.note-editor button,.note-editor note-toolbar button,.popover button,.popover note-toolbar button{border:none;height:36px;text-transform:none}.note-editor [type=checkbox]:checked+label:before,.popover [type=checkbox]:checked+label:before{border-right-color:#9e9e9e!important;border-bottom-color:#9e9e9e!important}.note-editor .note-palette-title,.popover .note-palette-title{padding:0!important}.note-editor .colorName,.popover .colorName{display:inline-block;color:#000}@media only screen and (max-width:600px){.note-editor .colorName,.popover .colorName{display:none}}.note-editor .note-color-palette,.popover .note-color-palette{line-height:10px;border:3px solid #e9e9e9;padding:0!important;overflow-x:scroll;overflow-y:hidden}.note-editor .note-color-palette .note-color-row,.popover .note-color-palette .note-color-row{padding:0!important;min-width:300px}.note-editor .note-color-palette button.note-color-btn,.popover .note-color-palette button.note-color-btn{width:20px;height:20px;padding:0;margin:0}.note-editor .note-color-palette .note-color-btn:hover:after,.popover .note-color-palette .note-color-btn:hover:after{position:absolute;width:30px;height:30px;content:"";background-color:inherit;margin-top:-15px;margin-left:-15px}.note-editor .note-dimension-picker,.popover .note-dimension-picker{overflow:hidden}.note-editor .largeDropdown,.popover .largeDropdown{width:290px}.note-editor .dropdown-menu,.popover .dropdown-menu{z-index:1033}.note-editor .dropdown-menu.note-check,.popover .dropdown-menu.note-check{min-width:80px}.note-editor .dropdown-menu label,.popover .dropdown-menu label{color:#000!important}.note-editor ul.dropdown-menu,.popover ul.dropdown-menu{position:absolute;top:20px;background-color:#FFF;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.note-editor ul.dropdown-menu#colors,.popover ul.dropdown-menu#colors{width:342px}.note-editor ul.dropdown-menu#colors .indicator,.popover ul.dropdown-menu#colors .indicator{width:50%;left:0}.note-editor ul.dropdown-menu .colorTable,.popover ul.dropdown-menu .colorTable{padding:3px 0}.note-editor ul.dropdown-menu .tabs,.popover ul.dropdown-menu .tabs{background:0 0}.popover ul.dropdown-menu .tabs:hover{background-color:#e9e9e9}.note-editor ul.dropdown-menu .tabs .tab a,.note-editor ul.dropdown-menu .tabs .tab a:hover,.popover ul.dropdown-menu .tabs .tab a,.popover ul.dropdown-menu .tabs .tab a:hover{color:#7F7A7A}.note-editor ul.dropdown-menu .tabs .indicator,.popover ul.dropdown-menu .tabs .indicator{background-color:#868181}.note-editor ul.dropdown-menu li,.popover ul.dropdown-menu li{list-style-type:none;padding:0!important}.note-editor ul.dropdown-menu li div,.popover ul.dropdown-menu li div{padding:3px 15px;cursor:pointer}.note-popover .popover{position:absolute;max-width:none;color:#000}.note-popover .popover .arrow{width:0;height:0;border-style:solid;border-width:0 10px 10px;border-color:transparent transparent #e9e9e9}.note-popover .popover .popover-content{background-color:#e9e9e9}.note-popover .popover .popover-content>a{margin-left:12px}.note-popover .popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover .popover .popover-content .arrow{left:20px}.note-popover .popover .popover-content .btn-group{display:inline-block}.note-popover .popover .popover-content .btn-group .btn,.note-popover .popover .popover-content .btn-group .btn-large{border-radius:0!important;box-shadow:none!important;padding:0 9px!important;background-color:#e9e9e9}.note-popover .popover .popover-content .note-para .dropdown-menu,.note-toolbar .note-para .dropdown-menu{min-width:172px;padding:5px}.note-popover .popover .popover-content .note-para .dropdown-menu>div:first-child,.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:#fff;border:2px dashed #87cefa;opacity:.95;pointer-event:none}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf;border:2px dashed #098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor.fullscreen{position:fixed;top:0;left:0;z-index:2021;width:100%}.note-editor.fullscreen .note-editable{background-color:#fff}.note-editor.codeview .note-editable,.note-editor.fullscreen .note-resizebar{display:none}.note-editor.codeview .note-codable{display:block}.note-editor .note-statusbar{background-color:#f5f5f5}.note-editor .note-editable[contenteditable=true]:empty:not(:focus):before{color:#a9a9a9;content:attr(data-placeholder)}.note-editor .note-editable{padding:10px;overflow:auto;outline:0;background:#fff;margin:2%;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.note-editor .note-editable[contenteditable=false]{background-color:#e5e5e5}.note-editor .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-air-editor{outline:0}.note-popover .popover .popover-content,.note-toolbar{padding:0;margin:0}.note-popover .popover .popover-content>.btn-group,.note-toolbar>.btn-group{background:#fff;margin:4px;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group,.note-popover .popover .popover-content .note-style blockquote,.note-popover .popover .popover-content .note-style h1,.note-popover .popover .popover-content .note-style h2,.note-popover .popover .popover-content .note-style h3,.note-popover .popover .popover-content .note-style h4,.note-popover .popover .popover-content .note-style h5,.note-popover .popover .popover-content .note-style h6,.note-toolbar .note-color .dropdown-menu .btn-group,.note-toolbar .note-style blockquote,.note-toolbar .note-style h1,.note-toolbar .note-style h2,.note-toolbar .note-style h3,.note-toolbar .note-style h4,.note-toolbar .note-style h5,.note-toolbar .note-style h6{margin:0}.note-popover .popover .popover-content .btn-group .note-table,.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker,.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:260px;height:260px;cursor:pointer}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:312px;height:130px;background-size:26px 26px;background-image:repeating-linear-gradient(0deg,#FFF,#FFF 2px,transparent 2px,transparent 26px),repeating-linear-gradient(-90deg,transparent,transparent 2px,#E9E9E9 2px,#E9E9E9 26px)}.note-popover .popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:26px;height:26px;background-size:26px 26px;background-image:repeating-linear-gradient(0deg,#fff,#fff 2px,transparent 2px,transparent 26px),repeating-linear-gradient(-90deg,transparent,transparent 2px,#9e9e9e 2px,#9e9e9e 26px)}.note-popover .popover .popover-content .note-color .dropdown-toggle,.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group:first-child,.note-toolbar .note-color .dropdown-menu .btn-group:first-child{margin:0 5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title,.note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset{padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-row,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-row{height:20px}.note-popover .popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover,.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover{background:#eee}.note-popover .popover .popover-content .dropdown-menu.right,.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover .popover-content .dropdown-menu.right::before,.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu.right::after,.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover .popover-content .dropdown-menu.note-check li a i,.note-toolbar .dropdown-menu.note-check li a i{color:#00bfff;visibility:hidden}.note-popover .popover .popover-content .dropdown-menu.note-check li a.checked i,.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover .popover-content .note-fontsize-10,.note-toolbar .note-fontsize-10{font-size:10px}.codeview .note-color,.codeview .note-fonts,.codeview .note-height,.codeview .note-para,.codeview .note-style,.codeview .note-undo{display:none}.codeview .note-misc{background:#E0E0E0!important;padding-right:12px!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material_note.js b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material-note.js similarity index 100% rename from src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material_note.js rename to src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material-note.js diff --git a/src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material_note.min.js b/src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material-note.min.js similarity index 100% rename from src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material_note.min.js rename to src/main/resources/gwt/material/design/addins/client/richeditor/resources/js/material-note.min.js diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css index 6f3215709..153463a58 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.css @@ -1,43 +1,48 @@ .lolliclock-header { - background-color: #1e1f22 !important; + background-color: #1e1f22 !important } .lolliclock-popover { - background-color: #2e3033; + background-color: #2e3033 } .lolliclock-plate { - background-color: #282828; + background-color: #282828 } .lolliclock-active-button-background { - background: #bb86fc !important; + background: #bb86fc !important } .lolliclock-btn-text { - color: #d2d2d2; + color: #d2d2d2 } .lolliclock-active-button-text { - color: #000; + color: #000 } .lolliclock-button { - color: #bb86fc !important; + color: #bb86fc !important } .lolliclock-canvas-bg { - fill: #d6b5ff !important; + fill: #d6b5ff !important } .lolliclock-canvas-fg { - fill: #bb86fc !important; + fill: #bb86fc !important } .lolliclock-canvas line { - stroke: white !important; + stroke: #fff !important } .lolliclock-tick.active, .lolliclock-tick:hover { - background-color: #bb86fc !important; + background-color: #bb86fc !important +} + +.input-field.timepicker input.valid { + border-bottom: 1px solid #bb86fc; + box-shadow: 0 1px 0 0 #bb86fc; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css index 86fb1ac96..a4ef197ee 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker-dark.min.css @@ -1 +1 @@ -.lolliclock-header{background-color:#1e1f22!important}.lolliclock-popover{background-color:#2e3033}.lolliclock-plate{background-color:#282828}.lolliclock-active-button-background{background:#bb86fc!important}.lolliclock-btn-text{color:#d2d2d2}.lolliclock-active-button-text{color:#000}.lolliclock-button{color:#bb86fc!important}.lolliclock-canvas-bg{fill:#d6b5ff!important}.lolliclock-canvas-fg{fill:#bb86fc!important}.lolliclock-canvas line{stroke:#fff!important}.lolliclock-tick.active,.lolliclock-tick:hover{background-color:#bb86fc!important} \ No newline at end of file +.lolliclock-header{background-color:#1e1f22!important}.lolliclock-popover{background-color:#2e3033}.lolliclock-plate{background-color:#282828}.lolliclock-active-button-background{background:#bb86fc!important}.lolliclock-btn-text{color:#d2d2d2}.lolliclock-active-button-text{color:#000}.lolliclock-button{color:#bb86fc!important}.lolliclock-canvas-bg{fill:#d6b5ff!important}.lolliclock-canvas-fg{fill:#bb86fc!important}.lolliclock-canvas line{stroke:#fff!important}.lolliclock-tick.active,.lolliclock-tick:hover{background-color:#bb86fc!important}.input-field.timepicker input.valid{border-bottom:1px solid #bb86fc;box-shadow:0 1px 0 0 #bb86fc} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css index 5c2513e23..a4ef197ee 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css @@ -1 +1 @@ -.lolliclock-popover{border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26),0 2px 10px 0 rgba(0,0,0,.16);font-family:Roboto,'Helvetica Neue, Helvetica, Arial',sans-serif;background-color:#fff;font-size:20px;user-select:none;margin:10% auto auto;width:250px;height:380px;z-index:999;position:relative}.landscape .lolliclock-popover{width:450px;height:250px}.landscape .lolliclock-header{display:inline-block!important;vertical-align:middle!important;width:140px!important;height:100%!important;padding-top:20%!important;padding-left:10px!important;animation:none!important;-webkit-animation:none!important;-moa-animation:none!important}.landscape .popover-content{display:inline-block!important;vertical-align:top!important;width:310px!important}.landscape .lolliclock-buttons{margin-top:-40px!important}.landscape .lolliclock-am-pm{padding-left:50px!important;font-size:20px!important}.landscape .lolliclock-ampm-block{display:none!important}.clock-overlay{position:fixed!important;width:100%!important;top:0!important;left:0!important;bottom:0!important;right:0!important;height:100%!important;background:rgba(0,0,0,.3);z-index:10000}.lolliclock-popover.animate{max-height:0;animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-popover.animate-out{animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-header{background:#03a9f4;height:85px;width:250px;display:flex;color:#fff;font-size:2.3em;font-weight:400;align-items:center;justify-content:center;overflow:hidden}.lolliclock-hours,.lolliclock-minutes{width:51px;overflow:hidden;opacity:.6}.lolliclock-header.animate{height:0;animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-header.animate-out{animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time{display:flex;align-self:center}.lolliclock-hours{text-align:right;cursor:pointer;height:54px}.lolliclock-colon{opacity:.6;cursor:default}.lolliclock-minutes{cursor:pointer;height:54px}.lolliclock-am-pm{cursor:pointer;font-size:10px;top:47px;left:157px;opacity:.6;padding:3px}.lolliclock-primary-text{color:#fff;opacity:1}.lolliclock-time-old{opacity:1;height:54px}.lolliclock-time-new{opacity:0}.lolliclock-time .old-up{animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-up{animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .old-down{animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-down{animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-old.animate{animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-old.animate{animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.popover-content{padding:18px 14px;width:250px;height:203px}.lolliclock-canvas,.lolliclock-dial,.lolliclock-plate{width:168px;height:168px}.lolliclock-dial{transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s}.lolliclock-dial-out{transform:scale(1.25,1.25);-webkit-transform:scale(1.25,1.25);-moz-transform:scale(1.25,1.25);opacity:0}.lolliclock-plate{background:#f0f0f0;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;position:relative;margin:auto}.lolliclock-ampm-btn,.lolliclock-tick{border-radius:100%;font-weight:600;cursor:pointer}.lolliclock-canvas,.lolliclock-dial,.lolliclock-tick{position:absolute}.lolliclock-plate.animate{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0);animation:open-clock 150ms 150ms forwards;-webkit-animation:open-clock 150ms 150ms forwards;-moz-animation:open-clock 150ms 150ms forwards}.lolliclock-plate.animate-out{animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-dial-minutes{visibility:hidden}.lolliclock-bearing{fill:#000;stroke-width:1}.lolliclock-canvas line{stroke:#b3e5fc;stroke-width:1;stroke-linecap:round}.lolliclock-canvas-fg{stroke:none;fill:#0288d1}.lolliclock-canvas-bg{fill:rgba(3,169,244,.25)}.lolliclock-tick{-webkit-border-radius:100%;-moz-border-radius:100%;color:#666;line-height:24px;text-align:center;width:24px;height:24px;font-size:.55em}.lolliclock-tick.active,.lolliclock-tick:hover{background:#b3e5fc}.lolliclock-ampm-block{display:flex;justify-content:space-around;margin-top:20px}.lolliclock-ampm-btn{position:relative;height:35px;width:35px;-webkit-border-radius:100%;-moz-border-radius:100%;font-size:10px}.lolliclock-ampm-btn.animate{opacity:0;animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-ampm-btn.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate{opacity:0;animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-btn-background{position:absolute;height:35px;width:35px;opacity:0;transform:scale(0);-moz-transform:scale(0);-webkit-transform:scale(0)}.lolliclock-btn-text{position:absolute;width:100%;text-align:center;line-height:35px;vertical-align:middle;color:#212121}.lolliclock-active-button-background{background-color:#03a9f4;border-radius:100%;transition:transform 175ms;-webkit-transition:transform 175ms;-moz-transition:transform 175ms;transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1}.lolliclock-active-button-text{color:#fff}.lolliclock-ampm-btn:focus{outline:0}.lolliclock-clickable{cursor:pointer}.lolliclock-moving{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.lolliclock-export{display:hidden}.lolliclock-buttons{font-size:11px;display:flex;justify-content:flex-end;margin-top:50px;margin-right:8px}.lolliclock-button{font-weight:500;color:#03a9f4;cursor:pointer;padding:8px;min-width:32px;margin:0 4px;background:0 0;text-align:center;text-transform:uppercase;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}@-moz-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-webkit-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-o-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-moz-keyframes slide-header{0%{height:0}100%{height:85px}}@-webkit-keyframes slide-header{0%{height:0}100%{height:85px}}@-o-keyframes slide-header{0%{height:0}100%{height:85px}}@keyframes slide-header{0%{height:0}100%{height:85px}}@-moz-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-webkit-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-o-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-moz-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-o-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-moz-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-webkit-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-o-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-moz-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@-o-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}.timepicker input{position:relative}.input-field.filled input.disabled{background:0 0}.input-field.outlined.timepicker input.valid,.input-field.outlined.timepicker input:focus{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.timepicker input.field-error,.input-field.outlined.timepicker input.field-error:focus{border:2px solid #f44336!important;box-shadow:none!important;margin-bottom:8px}.input-field.outlined.timepicker input.field-success,.input-field.outlined.timepicker input.field-success:focus{border:2px solid #4caf50!important;box-shadow:none!important;margin-bottom:8px}.input-field.timepicker input.valid{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.timepicker input.disabled+label.required:before{display:none} \ No newline at end of file +.lolliclock-header{background-color:#1e1f22!important}.lolliclock-popover{background-color:#2e3033}.lolliclock-plate{background-color:#282828}.lolliclock-active-button-background{background:#bb86fc!important}.lolliclock-btn-text{color:#d2d2d2}.lolliclock-active-button-text{color:#000}.lolliclock-button{color:#bb86fc!important}.lolliclock-canvas-bg{fill:#d6b5ff!important}.lolliclock-canvas-fg{fill:#bb86fc!important}.lolliclock-canvas line{stroke:#fff!important}.lolliclock-tick.active,.lolliclock-tick:hover{background-color:#bb86fc!important}.input-field.timepicker input.valid{border-bottom:1px solid #bb86fc;box-shadow:0 1px 0 0 #bb86fc} \ No newline at end of file From bcfe9628fa9596fc3e6dbd032bc727fcda212a2c Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 21 Dec 2019 21:06:51 +0800 Subject: [PATCH 133/247] RichEditor - standardized PasteEvent WIP : Stepper Dark Theme --- .../client/dark/AddinsDarkThemeLoader.java | 2 + .../client/richeditor/MaterialRichEditor.java | 28 ++++++----- .../richeditor/base/HasPasteHandlers.java | 34 -------------- .../client/richeditor/events/PasteEvent.java | 47 ------------------- .../client/stepper/MaterialStepper.java | 9 +++- .../stepper/MaterialStepperClientBundle.java | 3 ++ .../stepper/MaterialStepperDarkTheme.java | 12 +++++ .../MaterialStepperDebugClientBundle.java | 3 ++ .../stepper/resources/css/stepper-dark.css | 32 +++++++++++++ .../resources/css/stepper-dark.min.css | 1 + .../client/stepper/resources/css/stepper.css | 11 +++-- 11 files changed, 85 insertions(+), 97 deletions(-) delete mode 100644 src/main/java/gwt/material/design/addins/client/richeditor/base/HasPasteHandlers.java delete mode 100644 src/main/java/gwt/material/design/addins/client/richeditor/events/PasteEvent.java create mode 100644 src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 88f5d2b74..bd26d038e 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -23,6 +23,7 @@ import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; import gwt.material.design.addins.client.rating.MaterialRatingDarkTheme; import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; +import gwt.material.design.addins.client.stepper.MaterialStepperDarkTheme; import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; @@ -33,6 +34,7 @@ public AddinsDarkThemeLoader() { new MaterialComboBoxDarkTheme(), new MaterialTimePickerDarkTheme(), new MaterialRatingDarkTheme(), + new MaterialStepperDarkTheme(), new MaterialRichEditorDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java index b00983924..9e50bb06f 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java @@ -7,9 +7,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. @@ -33,17 +33,17 @@ import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; -import gwt.material.design.addins.client.richeditor.base.HasPasteHandlers; import gwt.material.design.addins.client.richeditor.base.ToolBarManager; import gwt.material.design.addins.client.richeditor.base.constants.RichEditorEvents; import gwt.material.design.addins.client.richeditor.base.constants.ToolbarButton; -import gwt.material.design.addins.client.richeditor.events.PasteEvent; import gwt.material.design.addins.client.richeditor.js.JsRichEditor; import gwt.material.design.addins.client.richeditor.js.JsRichEditorOptions; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.AbstractValueWidget; +import gwt.material.design.client.base.HasPasteHandlers; import gwt.material.design.client.base.HasPlaceholder; import gwt.material.design.client.base.JsLoader; +import gwt.material.design.client.events.PasteEvent; import gwt.material.design.client.ui.MaterialDialog; import gwt.material.design.client.ui.MaterialDialogContent; import gwt.material.design.jquery.client.api.JQueryElement; @@ -74,7 +74,8 @@ * @see 1.2.1 */ //@formatter:on -public class MaterialRichEditor extends AbstractValueWidget implements JsLoader, HasValueChangeHandlers, HasPasteHandlers, HasPlaceholder, HasHTML { +public class MaterialRichEditor extends AbstractValueWidget implements JsLoader, HasValueChangeHandlers, + HasPasteHandlers, HasPlaceholder, HasHTML { static { if (MaterialAddins.isDebug()) { @@ -129,23 +130,28 @@ public void load() { // Events jsRichEditor.on(RichEditorEvents.MATERIALNOTE_BLUR, event -> { - fireEvent(new BlurEvent() {}); + fireEvent(new BlurEvent() { + }); return true; }); jsRichEditor.on(RichEditorEvents.MATERIALNOTE_FOCUS, event -> { - fireEvent(new FocusEvent() {}); + fireEvent(new FocusEvent() { + }); return true; }); jsRichEditor.on(RichEditorEvents.MATERIALNOTE_KEYUP, event -> { - fireEvent(new KeyUpEvent() {}); + fireEvent(new KeyUpEvent() { + }); return true; }); jsRichEditor.on(RichEditorEvents.MATERIALNOTE_KEYDOWN, event -> { - fireEvent(new KeyDownEvent() {}); + fireEvent(new KeyDownEvent() { + }); return true; }); jsRichEditor.on(RichEditorEvents.MATERIALNOTE_PASTE, event -> { - fireEvent(new PasteEvent() {}); + fireEvent(new PasteEvent(getValue()) { + }); return true; }); jsRichEditor.on(RichEditorEvents.MATERIALNOTE_CHANGE, event -> { @@ -405,7 +411,7 @@ public void setValue(String value, boolean fireEvents) { } @Override - public HandlerRegistration addPasteHandler(final PasteEvent.PasteHandler handler) { + public HandlerRegistration addPasteHandler(final PasteEvent.PasteEventHandler handler) { return addHandler(handler, PasteEvent.TYPE); } } \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/base/HasPasteHandlers.java b/src/main/java/gwt/material/design/addins/client/richeditor/base/HasPasteHandlers.java deleted file mode 100644 index 4a36d5b7e..000000000 --- a/src/main/java/gwt/material/design/addins/client/richeditor/base/HasPasteHandlers.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.addins.client.richeditor.base; - -import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.event.shared.HasHandlers; -import gwt.material.design.addins.client.richeditor.events.PasteEvent; - -/** - * Handler Registration for Paste Event - * - * @author kevzlou7979 - */ -public interface HasPasteHandlers extends HasHandlers { - - HandlerRegistration addPasteHandler(PasteEvent.PasteHandler handler); -} diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/events/PasteEvent.java b/src/main/java/gwt/material/design/addins/client/richeditor/events/PasteEvent.java deleted file mode 100644 index 386cddee6..000000000 --- a/src/main/java/gwt/material/design/addins/client/richeditor/events/PasteEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * #%L - * GwtMaterial - * %% - * Copyright (C) 2015 - 2017 GwtMaterialDesign - * %% - * 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% - */ -package gwt.material.design.addins.client.richeditor.events; - -import com.google.gwt.event.shared.EventHandler; -import com.google.gwt.event.shared.GwtEvent; -import com.google.gwt.event.shared.HasHandlers; - -public class PasteEvent extends GwtEvent { - - public interface PasteHandler extends EventHandler { - void onPaste(PasteEvent event); - } - - public static final Type TYPE = new Type<>(); - - public static void fire(HasHandlers source) { - source.fireEvent(new PasteEvent()); - } - - @Override - public Type getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(PasteHandler handler) { - handler.onPaste(this); - } -} \ No newline at end of file diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 85b9aaef6..d86dca6de 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -31,6 +31,7 @@ import com.google.gwt.view.client.SelectionChangeEvent.HasSelectionChangedHandlers; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.stepper.base.HasStepsHandler; import gwt.material.design.addins.client.stepper.constants.State; import gwt.material.design.addins.client.stepper.events.CompleteEvent; @@ -107,7 +108,7 @@ public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatu private Div divFeedback = new Div(); private Span feedbackSpan = new Span(); private HandlerRegistration orientationHandler; - + private MaterialLoader loader = new MaterialLoader(); private ToggleStyleMixin toggleFixedStepWidth; private CssNameMixin axisMixin; private StepperTransitionMixin stepperTransitionMixin; @@ -130,6 +131,7 @@ protected void onLoad() { setDetectOrientation(detectOrientation); updateStepWidth(); + AddinsDarkThemeReloader.get().reload(MaterialStepperDarkTheme.class); } public void updateStepWidth() { @@ -482,7 +484,9 @@ public String getFeedback() { public void showFeedback(String feedbackText) { feedbackSpan.setText(feedbackText); new MaterialAnimation().transition(Transition.FADEINUP).duration(400).animate(feedbackSpan); - MaterialLoader.loading(true, getCurrentStep().getDivBody()); + loader.setMessage(feedbackText); + loader.setContainer(divFeedback); + loader.show(); add(divFeedback); } @@ -490,6 +494,7 @@ public void showFeedback(String feedbackText) { * Hide feedback message and circular loader on body container. */ public void hideFeedback() { + loader.hide(); divFeedback.removeFromParent(); } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java index be8012461..ef139b3e1 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperClientBundle.java @@ -34,4 +34,7 @@ interface MaterialStepperClientBundle extends ClientBundle { @Source("resources/css/stepper.min.css") TextResource stepperCss(); + + @Source("resources/css/stepper-dark.min.css") + TextResource stepperDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java new file mode 100644 index 000000000..7f8210a42 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java @@ -0,0 +1,12 @@ +package gwt.material.design.addins.client.stepper; + +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialStepperDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialStepperDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialStepperDebugClientBundle.INSTANCE.stepperDarkCss() : MaterialStepperClientBundle.INSTANCE.stepperDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java index fac76208e..e11bc891b 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDebugClientBundle.java @@ -34,4 +34,7 @@ interface MaterialStepperDebugClientBundle extends ClientBundle { @Source("resources/css/stepper.css") TextResource stepperDebugCss(); + + @Source("resources/css/stepper-dark.css") + TextResource stepperDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.css new file mode 100644 index 000000000..03c5b7ca6 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.css @@ -0,0 +1,32 @@ +.stepper.horizontal .step .step-header { + background: #292929; +} + +.stepper .line { + border-left: 2px solid #414141; +} + +.stepper.horizontal .step .line { + border-top: 2px solid #414141; +} + +.stepper .step:hover, .stepper.horizontal .step:hover .step-header { + background: #303030; +} + +.stepper .step > div:first-child .circle { + background: #bb86fc !important; +} + +.stepper .step.success > div:first-child i, +.stepper .step.success .title, .stepper .step.success .description { + color: #bb86fc !important; +} + +.feedback { + background: transparent; +} + +.feedback .loader-wrapper { + background-color: rgb(59, 59, 59) !important; +} diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.min.css new file mode 100644 index 000000000..759758721 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper-dark.min.css @@ -0,0 +1 @@ +.stepper.horizontal .step .step-header{background:#292929}.stepper .line{border-left:2px solid #414141}.stepper.horizontal .step .line{border-top:2px solid #414141}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#303030}.stepper .step>div:first-child .circle{background:#bb86fc!important}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#bb86fc!important}.feedback{background:0 0}.feedback .loader-wrapper{background-color:#3b3b3b!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css index 78d00bb50..3ac1dd79d 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css @@ -42,7 +42,7 @@ .stepper .line { position: absolute; - border-left: 1px solid #dcdcdc; + border-left: 2px solid #dcdcdc; left: 28px; bottom: 0; top: 56px; @@ -119,7 +119,7 @@ .stepper.horizontal .step .description { margin-left: 40px; font-size: .8em; - margin-top: -12px + margin-top: -8px } .stepper.horizontal .step .body { @@ -187,7 +187,7 @@ } .feedback { - position: absolute; + position: absolute !important; left: 0; font-size: 1.1em; top: 0; @@ -197,6 +197,11 @@ padding: 36px } + +.feedback .loader-wrapper { + background-color: #dfdfdf!important; +} + /** Vertical Stepper **/ .stepper.vertical .step { width: 100% !important; From 6ac3a2ba0a2e2b7bf68eef0225a9937f750f9e5b Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 21 Dec 2019 21:23:31 +0800 Subject: [PATCH 134/247] Fixed Travis Build --- .../addins/client/ui/MaterialRichEditorTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java index 3061377f2..9b7c994db 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java @@ -7,9 +7,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. @@ -26,8 +26,8 @@ import gwt.material.design.addins.client.base.constants.AddinsCssName; import gwt.material.design.addins.client.richeditor.MaterialRichEditor; import gwt.material.design.addins.client.richeditor.base.constants.ToolbarButton; -import gwt.material.design.addins.client.richeditor.events.PasteEvent; import gwt.material.design.addins.client.ui.base.AbstractValueWidgetTest; +import gwt.material.design.client.events.PasteEvent; /** * Test case for rich editor component @@ -167,7 +167,8 @@ protected void checkEvents(MaterialRichEditor editor) { // Paste Event final boolean[] isPasteEventFired = {false}; editor.addPasteHandler(event -> isPasteEventFired[0] = true); - editor.fireEvent(new PasteEvent() {}); + editor.fireEvent(new PasteEvent("Test") { + }); assertTrue(isPasteEventFired[0]); // Blur Event final boolean[] isBlurEventFired = {false}; @@ -177,7 +178,8 @@ protected void checkEvents(MaterialRichEditor editor) { // Focus Event final boolean[] isFocusEventFired = {false}; editor.addFocusHandler(event -> isFocusEventFired[0] = true); - editor.fireEvent(new FocusEvent() {}); + editor.fireEvent(new FocusEvent() { + }); fireFocusEvent(editor); // KeyUp Event final boolean[] isKeyUpEventFired = {false}; From 8480aba20e67b28f00d17dd29d17c8e74980549b Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 22 Dec 2019 17:43:54 +0800 Subject: [PATCH 135/247] ComboBox - added focus --- .../client/combobox/MaterialComboBox.java | 11 ++++++++--- .../client/inputmask/AbstractInputMask.java | 4 ++-- .../rating/MaterialRatingClientBundle.java | 4 ++-- .../rating/MaterialRatingDarkTheme.java | 19 +++++++++++++++++++ .../MaterialRatingDebugClientBundle.java | 4 ++-- .../client/richeditor/MaterialRichEditor.java | 6 +++--- .../MaterialRichEditorDarkTheme.java | 19 +++++++++++++++++++ .../stepper/MaterialStepperDarkTheme.java | 19 +++++++++++++++++++ .../MaterialTimePickerDarkTheme.java | 4 ++-- .../client/toggle/GroupToggleButton.java | 4 ++-- .../client/ui/MaterialRichEditorTest.java | 4 ++-- 11 files changed, 80 insertions(+), 18 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index ce479327e..86f3446fe 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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. @@ -189,7 +189,7 @@ public void load() { jsComboBox.on(ComboBoxEvents.CLOSING, (e, param1) -> { ClosingEvent.fire(this); if (getValue() != null && !getValue().isEmpty()) { - jsComboBox.select2("focus"); + focus(); } return true; }); @@ -228,6 +228,11 @@ public void unload() { jsComboBox.select2("destroy"); } + public void focus() { + JsComboBox jsComboBox = $(listbox.getElement()); + jsComboBox.select2("focus"); + } + @Override public void reload() { unload(); diff --git a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java index db884d4d4..8bccae565 100644 --- a/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java +++ b/src/main/java/gwt/material/design/addins/client/inputmask/AbstractInputMask.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java index e9a302462..c2895b5f2 100644 --- a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingClientBundle.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java index 0e2e0960b..6e744c9cd 100644 --- a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.rating; import gwt.material.design.addins.client.MaterialAddins; diff --git a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java index cd63c8bb8..9c24a00a0 100644 --- a/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/rating/MaterialRatingDebugClientBundle.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java index 9e50bb06f..682ccfcb8 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditor.java @@ -7,9 +7,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. @@ -414,4 +414,4 @@ public void setValue(String value, boolean fireEvents) { public HandlerRegistration addPasteHandler(final PasteEvent.PasteEventHandler handler) { return addHandler(handler, PasteEvent.TYPE); } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java index ee02a27dc..b5a91957d 100644 --- a/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/richeditor/MaterialRichEditorDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.richeditor; import gwt.material.design.addins.client.MaterialAddins; diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java index 7f8210a42..4cbd19133 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepperDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.stepper; import com.google.gwt.resources.client.TextResource; diff --git a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java index 669dc3d34..3e06e5fd3 100644 --- a/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/timepicker/MaterialTimePickerDarkTheme.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java index fc87edfa7..f5d260c49 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java @@ -7,9 +7,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. diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java index 9b7c994db..a248d477e 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialRichEditorTest.java @@ -7,9 +7,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 b17dcaf23046dc89cfbb3d87e30bc2b57dc133f1 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 29 Dec 2019 06:56:54 +0800 Subject: [PATCH 136/247] Minor update on combobox padding on search input. --- .../client/combobox/resources/css/select2.css | 3 +- .../combobox/resources/css/select2.min.css | 900 +----------------- 2 files changed, 3 insertions(+), 900 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css index 881bcd7a0..1dfb381c0 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.css @@ -292,7 +292,8 @@ } .select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa + border: 1px solid #aaa; + padding-left: 16px; } .select2-container--default .select2-search--inline .select2-search__field { diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css index 45e9fd3b7..ec16803fa 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/css/select2.min.css @@ -1,899 +1 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle -} - -.select2 { - width: 100% !important -} - -.select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none -} - -.select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap -} - -.select2-container .select2-selection--single .select2-selection__clear { - position: relative -} - -.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px -} - -.select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none -} - -.select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap -} - -.select2-container .select2-search--inline { - float: left -} - -.select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; - width: inherit !important; - padding-left: 0 !important -} - -.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none -} - -.select2-dropdown { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051 -} - -.select2-results { - display: block -} - -.select2-results__option { - padding: 1rem; - min-height: 52px -} - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0 -} - -.select2-results__option { - user-select: none; - -webkit-user-select: none -} - -.select2-results__option[aria-selected] { - cursor: pointer -} - -.select2-container--open .select2-dropdown { - left: 0 -} - -.select2-container--open .select2-dropdown--above { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0 -} - -.select2-container--open .select2-dropdown--below { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.select2-search--dropdown { - display: block; - padding: 0 -} - -.select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; - margin-bottom: 0 -} - -.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none -} - -.select2-search--dropdown.select2-search--hide { - display: none -} - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff -} - -.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear, .select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none -} - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - height: 1px !important; - margin: -1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important -} - -.select2-container--classic .select2-results > .select2-results__options, .select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto -} - -.select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444 -} - -.select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-size: 2em; - font-weight: 400; - color: #b5b5b5 -} - -.select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #ccc -} - -.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { - float: left -} - -.select2-container--default.select2-container--disabled .select2-selection--single { - color: rgba(0, 0, 0, .3); - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - border-bottom: 1px solid rgba(0, 0, 0, .14) -} - -.select2-container--disabled .select2-selection__rendered { - color: rgba(0, 0, 0, .4) !important -} - -.select2-container--default .select2-selection--multiple { - cursor: text -} - -.select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0; - width: 100% -} - -.select2-container--default .select2-selection--multiple .select2-selection__placeholder { - color: #ccc; - margin-top: 5px; - float: left -} - -.select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - margin-top: 0; - margin-right: 10px; - font-size: 2em; - margin-bottom: -4px; - color: #9e9e9e !important -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice { - cursor: default; - float: left; - margin-right: 5px; - margin-top: 8px -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - font-size: 20px; - font-weight: 300; - float: right; - color: rgba(0, 0, 0, .6); - line-height: 28px; - padding-left: 8px; - cursor: pointer -} - -.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder { - float: right -} - -.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto -} - -.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto -} - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - color: rgba(0, 0, 0, .3); - cursor: default; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - border-bottom: 1px solid rgba(0, 0, 0, .14) -} - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--below .select2-selection--single { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0 -} - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa -} - -.select2-container--default .select2-search--inline .select2-search__field { - background: 0 0; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield -} - -.select2-container--default .select2-results__option[role=group] { - padding: 0 -} - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999 -} - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd -} - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0 -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em -} - -.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em -} - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px -} - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, #fff 50%, #eee 100%); - background-image: -o-linear-gradient(top, #fff 50%, #eee 100%); - background-image: linear-gradient(to bottom, #fff 50%, #eee 100%); - background-repeat: repeat-x -} - -.select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb -} - -.select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px -} - -.select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: 700; - margin-right: 10px -} - -.select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #ccc -} - -header nav .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent rgba(255, 255, 255, .5) !important -} - -.combobox .select2-container--open .select2-selection__arrow b, .combobox .select2-selection__arrow b { - content: ""; - position: absolute; - right: 8px; - bottom: 12px; - width: 0; - height: 0; - border-style: solid; - border-width: 0 0 12px 12px; - border-color: transparent transparent #9c9c9c transparent !important -} - -.combobox.outlined .select2-container--open .select2-selection__arrow b, .combobox.outlined .select2-selection__arrow b { - bottom: 17px -} - -.combobox.outlined .select2-container .select2-search--inline .select2-search__field { - margin-top: 8px; - margin-bottom: 0 !important -} - -.combobox .select2-container--disabled .select2-selection__arrow b { - border-color: transparent transparent #c7c7c7 transparent !important -} - -.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 4px 0 0 4px; - left: 1px; - right: auto -} - -.select2-container--default .select2-selection--single .select2-selection__arrow { - height: 46px -} - -.read-only.combobox .select2-selection__arrow { - display: none !important -} - -.select2-container--default .select2-selection--single .select2-selection__arrow { - position: absolute; - top: 1px; - right: 1px; - width: 20px -} - -.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto -} - -.select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eee 50%, #ccc 100%); - background-image: -o-linear-gradient(top, #eee 50%, #ccc 100%); - background-image: linear-gradient(to bottom, #eee 50%, #ccc 100%); - background-repeat: repeat-x -} - -.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear { - float: left -} - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb -} - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, #fff 0, #eee 50%); - background-image: -o-linear-gradient(top, #fff 0, #eee 50%); - background-image: linear-gradient(to bottom, #fff 0, #eee 50%); - background-repeat: repeat-x -} - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eee 50%, #fff 100%); - background-image: -o-linear-gradient(top, #eee 50%, #fff 100%); - background-image: linear-gradient(to bottom, #eee 50%, #fff 100%); - background-repeat: repeat-x -} - -.select2-container--classic .select2-selection--multiple { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0 -} - -.select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb -} - -.select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px -} - -.select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none -} - -.select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px -} - -.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: 700; - margin-right: 2px -} - -.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555 -} - -.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto -} - -.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto -} - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb -} - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0 -} - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0 -} - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none -} - -.select2-container--classic .select2-dropdown { - background-color: #fff; - border: 1px solid transparent -} - -.select2-container--classic .select2-dropdown--above { - border-bottom: none -} - -.select2-container--classic .select2-dropdown--below { - border-top: none -} - -.select2-container--classic .select2-results__option[role=group] { - padding: 0 -} - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey -} - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: #fff -} - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px -} - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb -} - -.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single, .select2-container--default.select2-container--focus .select2-selection--multiple { - height: 46px; - border: none; - border-bottom: 1px solid #9e9e9e; - border-radius: 0; - outline: 0 -} - -.select2-container--default .select2-selection--multiple, .select2-container--default.select2-container--focus .select2-selection--multiple { - height: auto -} - -.select2-container--default .select2-search--inline .select2-search__field { - height: 30px -} - -.select2-container--default .select2-selection--multiple input { - margin: 0 -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice { - display: inline-block; - height: 32px; - font-size: 13px; - font-weight: 500; - color: rgba(0, 0, 0, .6); - line-height: 32px; - padding: 0 12px; - border-radius: 16px; - background-color: #e4e4e4 -} - -.select2-container--default .select2-selection--single .select2-selection__rendered { - line-height: 46px; - padding-left: 0 -} - -.select2-container--open .select2-dropdown--above, .select2-container--open .select2-dropdown--below { - border: none; - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12) -} - -.select2-results__option { - padding: 1rem -} - -.select2-container--default .select2-search--dropdown .select2-search__field { - border-top: none; - border-right: none; - border-left: none -} - -.field-error.combobox, .field-success.combobox { - border: none !important; - box-shadow: none !important -} - -.field-error.combobox .select2-selection { - border-bottom: 1px solid #f44336; - box-shadow: 0 1px 0 0 #f44336 -} - -.field-success.combobox .select2-selection { - border-bottom: 1px solid #4caf50; - box-shadow: 0 1px 0 0 #4caf50 -} - -.read-only.combobox .select2-selection { - border: none !important -} - -.select2-container--default .select2-results__option--highlighted[aria-selected], div.tagsinput span.tag { - background-color: #eee; - transition: .3s ease -} - -.select2label { - left: 0 !important; - font-size: .8rem !important; - transform: translateY(-140%) -} - -.combobox { - margin-bottom: 15px -} - -.select2-container--default { - font-size: 1rem -} - -.field-success .select2label { - color: #4caf50 !important -} - -.field-error .select2label { - color: #f44336 !important -} - -.col.combobox .select2label { - left: 12px !important -} - -.read-only .select2-selection__rendered { - color: #000 !important -} - -header nav .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #fff !important -} - -header nav .select2-container--default .select2-selection--multiple, header nav .select2-container--default .select2-selection--single, header nav .select2-container--default.select2-container--focus .select2-selection--multiple { - border-bottom: none -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]) { - position: relative; - padding-left: 3rem !important -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before { - content: ''; - position: absolute; - z-index: 0; - border-radius: 1px; - transition: .2s; - margin: 1rem; - width: 0; - height: 0; - border: 3px solid transparent; - left: 6px; - top: 10px; - -webkit-transform: rotateZ(37deg); - transform: rotateZ(37deg); - -webkit-transform-origin: 20% 40%; - transform-origin: 100% 100% -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after { - height: 20px; - width: 20px; - background-color: transparent; - border: 2px solid #5a5a5a; - top: 0; - content: ''; - left: 0; - position: absolute; - transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s; - z-index: 1; - border-radius: 2px; - margin: 1rem -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after { - top: 0; - width: 20px; - height: 20px; - border: 2px solid #26a69a; - background-color: #26a69a; - z-index: 0 -} - -ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before { - top: 2px; - left: 1px; - width: 8px; - height: 13px; - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: 2px solid #fff; - border-bottom: 2px solid #fff; - -webkit-transform: rotateZ(37deg); - transform: rotateZ(37deg); - -webkit-transform-origin: 100% 100%; - transform-origin: 100% 100%; - z-index: 1 -} - -.select2-container--default .select2-results__group { - opacity: .6; - font-size: 1em -} - -.input-field.aligned-label.combobox .select2-container { - width: 70% !important; - display: inline-block; - position: relative; - vertical-align: middle -} - -.input-field.aligned-label.combobox label.select2label { - font-size: 1em !important -} - -.input-field.combobox .select2-container--focus .select2-selection, .select2-container--default.select2-container--disabled .select2-selection--single { - color: rgba(0, 0, 0, .26); - border-bottom: 1px dotted rgba(0, 0, 0, .26); - box-shadow: none !important -} - -.input-field.outlined.combobox .select2-selection { - border: 1px solid #e9e9e9; - border-radius: 4px; - height: 3em -} - -.input-field.outlined.combobox .select2-container--default .select2-search--inline .select2-search__field:focus { - border: none !important -} - -.input-field.outlined.combobox .select2-container--default .select2-selection--multiple { - height: auto; - padding-left: 20px -} - -.input-field.outlined.combobox label.select2label { - top: 16px; - margin-left: 8px; - padding-left: 4px; - padding-right: 4px; - background: #fff -} - -.modal .input-field.outlined.combobox label.select2label { - background-color: #fafafa -} - -.input-field.outlined.combobox .select2-container--open .select2-selection { - border: 2px solid #42a5f5; - box-shadow: none -} - -.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { - padding-left: 12px -} - -.input-field.outlined.field-error.combobox .select2-container--open .select2-selection, .input-field.outlined.field-error.combobox .select2-selection { - border: 2px solid #f44336; - box-shadow: none -} - -.input-field.outlined.field-success.combobox .select2-container--open .select2-selection, .input-field.outlined.field-success.combobox .select2-selection { - border: 2px solid #4caf50; - box-shadow: none -} - -.input-field.outlined.combobox .select2-container--default .select2-selection--multiple { - padding-left: 12px !important -} - -.input-field.filled.combobox .select2-container { - background: rgba(0, 0, 0, .04); - border-radius: 4px 4px 0 0 -} - -.input-field.filled.combobox .select2-container.select2-container--disabled { - background: 0 0 -} - -.input-field.filled.combobox label.select2label { - margin-top: 14px; - margin-left: 12px -} - -.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered, .input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered { - padding-left: 12px; - padding-top: 4px -} - -.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered { - padding-top: 12px -} - -.input-field.combobox .select2-container--focus .select2-selection { - border-bottom: 1px solid #42a5f5; - box-shadow: 0 1px 0 0 #42a5f5 -} - -.input-field.outlined.combobox .select2-container--focus .select2-selection { - border: 2px solid #42a5f5; - box-shadow: none -} - -.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection { - border: none -} - -.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow, .input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow { - display: none -} - -.input-field.combobox select.disabled + span + label.required:before { - display: none -} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2{width:100%!important}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0;width:inherit!important;padding-left:0!important}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__option{padding:1rem;min-height:52px}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;margin-bottom:0}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-size:2em;font-weight:400;color:#b5b5b5}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#ccc}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--disabled .select2-selection__rendered{color:rgba(0,0,0,.4)!important}.select2-container--default .select2-selection--multiple{cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#ccc;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:0;margin-right:10px;font-size:2em;margin-bottom:-4px;color:#9e9e9e!important}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:8px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{font-size:20px;font-weight:300;float:right;color:rgba(0,0,0,.6);line-height:28px;padding-left:8px;cursor:pointer}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.14)}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;padding-left:16px}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#ccc}header nav .select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent rgba(255,255,255,.5)!important}.combobox .select2-container--open .select2-selection__arrow b,.combobox .select2-selection__arrow b{content:"";position:absolute;right:8px;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c transparent!important}.combobox.outlined .select2-container--open .select2-selection__arrow b,.combobox.outlined .select2-selection__arrow b{bottom:17px}.combobox.outlined .select2-container .select2-search--inline .select2-search__field{margin-top:8px;margin-bottom:0!important}.combobox .select2-container--disabled .select2-selection__arrow b{border-color:transparent transparent #c7c7c7 transparent!important}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.read-only.combobox .select2-selection__arrow{display:none!important}.select2-container--default .select2-selection--single .select2-selection__arrow{position:absolute;top:1px;right:1px;width:20px}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--default .select2-selection--multiple,.select2-container--default .select2-selection--single,.select2-container--default.select2-container--focus .select2-selection--multiple{height:46px;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:0}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{height:auto}.select2-container--default .select2-search--inline .select2-search__field{height:30px}.select2-container--default .select2-selection--multiple input{margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4}.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0}.select2-container--open .select2-dropdown--above,.select2-container--open .select2-dropdown--below{border:none;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.select2-results__option{padding:1rem}.select2-container--default .select2-search--dropdown .select2-search__field{border-top:none;border-right:none;border-left:none}.field-error.combobox,.field-success.combobox{border:none!important;box-shadow:none!important}.field-error.combobox .select2-selection{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}.field-success.combobox .select2-selection{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}.read-only.combobox .select2-selection{border:none!important}.select2-container--default .select2-results__option--highlighted[aria-selected],div.tagsinput span.tag{background-color:#eee;transition:.3s ease}.select2label{left:0!important;font-size:.8rem!important;transform:translateY(-140%)}.combobox{margin-bottom:15px}.select2-container--default{font-size:1rem}.field-success .select2label{color:#4caf50!important}.field-error .select2label{color:#f44336!important}.col.combobox .select2label{left:12px!important}.read-only .select2-selection__rendered{color:#000!important}header nav .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff!important}header nav .select2-container--default .select2-selection--multiple,header nav .select2-container--default .select2-selection--single,header nav .select2-container--default.select2-container--focus .select2-selection--multiple{border-bottom:none}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]){position:relative;padding-left:3rem!important}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):before{content:'';position:absolute;z-index:0;border-radius:1px;transition:.2s;margin:1rem;width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group]):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1;border-radius:2px;margin:1rem}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}ul.select2-results__options[aria-multiselectable=true] li.select2-results__option:not([role=group])[aria-selected=true]:before{top:2px;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;z-index:1}.select2-container--default .select2-results__group{opacity:.6;font-size:1em}.input-field.aligned-label.combobox .select2-container{width:70%!important;display:inline-block;position:relative;vertical-align:middle}.input-field.aligned-label.combobox label.select2label{font-size:1em!important}.input-field.combobox .select2-container--focus .select2-selection,.select2-container--default.select2-container--disabled .select2-selection--single{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26);box-shadow:none!important}.input-field.outlined.combobox .select2-selection{border:1px solid #e9e9e9;border-radius:4px;height:3em}.input-field.outlined.combobox .select2-container--default .select2-search--inline .select2-search__field:focus{border:none!important}.input-field.outlined.combobox .select2-container--default .select2-selection--multiple{height:auto;padding-left:20px}.input-field.outlined.combobox label.select2label{top:16px;margin-left:8px;padding-left:4px;padding-right:4px;background:#fff}.modal .input-field.outlined.combobox label.select2label{background-color:#fafafa}.input-field.outlined.combobox .select2-container--open .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px}.input-field.outlined.field-error.combobox .select2-container--open .select2-selection,.input-field.outlined.field-error.combobox .select2-selection{border:2px solid #f44336;box-shadow:none}.input-field.outlined.field-success.combobox .select2-container--open .select2-selection,.input-field.outlined.field-success.combobox .select2-selection{border:2px solid #4caf50;box-shadow:none}.input-field.outlined.combobox .select2-container--default .select2-selection--multiple{padding-left:12px!important}.input-field.filled.combobox .select2-container{background:rgba(0,0,0,.04);border-radius:4px 4px 0 0}.input-field.filled.combobox .select2-container.select2-container--disabled{background:0 0}.input-field.filled.combobox label.select2label{margin-top:14px;margin-left:12px}.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered,.input-field.filled.combobox .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:12px;padding-top:4px}.input-field.filled.combobox .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-top:12px}.input-field.combobox .select2-container--focus .select2-selection{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.outlined.combobox .select2-container--focus .select2-selection{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.select2-container--focus.select2-container--disabled .select2-selection{border:none}.input-field.hoverable-status.field-error .select2-container--default .select2-selection--single .select2-selection__arrow,.input-field.hoverable-status.field-success .select2-container--default .select2-selection--single .select2-selection__arrow{display:none}.input-field.combobox select.disabled+span+label.required:before{display:none} \ No newline at end of file From 710c1e5a3c17d5b73f7bd36e5ca23964a9974b0e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 29 Dec 2019 08:30:45 +0800 Subject: [PATCH 137/247] Carousel Dark Theme implementation --- .../client/carousel/MaterialCarousel.java | 2 ++ .../MaterialCarouselClientBundle.java | 3 ++ .../carousel/MaterialCarouselDarkTheme.java | 32 +++++++++++++++++++ .../MaterialCarouselDebugClientBundle.java | 3 ++ .../client/dark/AddinsDarkThemeLoader.java | 2 ++ .../carousel/resources/css/slick-dark.css | 14 ++++++++ .../carousel/resources/css/slick-dark.min.css | 1 + 7 files changed, 57 insertions(+) create mode 100644 src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java index 8bc379e4c..90fc03b0e 100644 --- a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java +++ b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarousel.java @@ -34,6 +34,7 @@ import gwt.material.design.addins.client.carousel.js.JsCarouselOptions; import gwt.material.design.addins.client.carousel.ui.NextArrow; import gwt.material.design.addins.client.carousel.ui.PreviousArrow; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.HasType; import gwt.material.design.client.base.JsLoader; @@ -169,6 +170,7 @@ public void load() { } $(container.getElement()).slick(options); + AddinsDarkThemeReloader.get().reload(MaterialCarouselDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselClientBundle.java b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselClientBundle.java index 179f3f92e..3f0a042d4 100644 --- a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselClientBundle.java @@ -40,4 +40,7 @@ public interface MaterialCarouselClientBundle extends ClientBundle { @Source("resources/css/custom.min.css") TextResource customCss(); + + @Source("resources/css/slick-dark.min.css") + TextResource carouselDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDarkTheme.java b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDarkTheme.java new file mode 100644 index 000000000..a9403eb11 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDarkTheme.java @@ -0,0 +1,32 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.carousel; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.combobox.MaterialComboBoxClientBundle; +import gwt.material.design.addins.client.combobox.MaterialComboBoxDebugClientBundle; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialCarouselDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialCarouselDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialCarouselDebugClientBundle.INSTANCE.carouselDarkCss() : MaterialCarouselClientBundle.INSTANCE.carouselDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDebugClientBundle.java index 2eec5a906..313af6a94 100644 --- a/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/carousel/MaterialCarouselDebugClientBundle.java @@ -40,4 +40,7 @@ public interface MaterialCarouselDebugClientBundle extends ClientBundle { @Source("resources/css/custom.css") TextResource customCssDebug(); + + @Source("resources/css/slick-dark.css") + TextResource carouselDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index bd26d038e..10e556df2 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -20,6 +20,7 @@ package gwt.material.design.addins.client.dark; import gwt.material.design.addins.client.bubble.MaterialBubbleDarkTheme; +import gwt.material.design.addins.client.carousel.MaterialCarouselDarkTheme; import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; import gwt.material.design.addins.client.rating.MaterialRatingDarkTheme; import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; @@ -32,6 +33,7 @@ public class AddinsDarkThemeLoader extends DarkThemeLoader { public AddinsDarkThemeLoader() { super(new MaterialBubbleDarkTheme(), new MaterialComboBoxDarkTheme(), + new MaterialCarouselDarkTheme(), new MaterialTimePickerDarkTheme(), new MaterialRatingDarkTheme(), new MaterialStepperDarkTheme(), diff --git a/src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.css b/src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.css new file mode 100644 index 000000000..bbdba8e88 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.css @@ -0,0 +1,14 @@ +.material-carousel .carousel-next-arrow, +.material-carousel .carousel-prev-arrow, +.slick-dots li.slick-active{ + background-color: #bb86fc; +} + +.material-carousel:not(.carousel-image) .carousel-next-arrow i, +.material-carousel:not(.carousel-image) .carousel-prev-arrow i { + color: black; +} + +.slick-dots li { + background-color: rgba(187, 134, 252, 0.23); +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.min.css b/src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.min.css new file mode 100644 index 000000000..33436ad07 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/carousel/resources/css/slick-dark.min.css @@ -0,0 +1 @@ +.material-carousel .carousel-next-arrow,.material-carousel .carousel-prev-arrow,.slick-dots li.slick-active{background-color:#bb86fc}.material-carousel:not(.carousel-image) .carousel-next-arrow i,.material-carousel:not(.carousel-image) .carousel-prev-arrow i{color:#000}.slick-dots li{background-color:rgba(187,134,252,.23)} \ No newline at end of file From 62566e7164238596ea8fb049f9c7d69553c2b891 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 3 Jan 2020 15:37:43 +0800 Subject: [PATCH 138/247] File Uploader dark theme implementation. --- .../client/dark/AddinsDarkThemeLoader.java | 2 ++ .../fileuploader/MaterialFileUploader.java | 2 ++ .../MaterialFileUploaderClientBundle.java | 3 ++ .../MaterialFileUploaderDarkTheme.java | 30 ++++++++++++++++ ...MaterialFileUploaderDebugClientBundle.java | 3 ++ .../emptystate/resources/css/empty-state.css | 2 +- .../resources/css/empty-state.min.css | 2 +- .../resources/css/dropzone-dark.css | 36 +++++++++++++++++++ .../resources/css/dropzone-dark.min.css | 1 + 9 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 10e556df2..449718de9 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -22,6 +22,7 @@ import gwt.material.design.addins.client.bubble.MaterialBubbleDarkTheme; import gwt.material.design.addins.client.carousel.MaterialCarouselDarkTheme; import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; +import gwt.material.design.addins.client.fileuploader.MaterialFileUploaderDarkTheme; import gwt.material.design.addins.client.rating.MaterialRatingDarkTheme; import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; import gwt.material.design.addins.client.stepper.MaterialStepperDarkTheme; @@ -34,6 +35,7 @@ public AddinsDarkThemeLoader() { super(new MaterialBubbleDarkTheme(), new MaterialComboBoxDarkTheme(), new MaterialCarouselDarkTheme(), + new MaterialFileUploaderDarkTheme(), new MaterialTimePickerDarkTheme(), new MaterialRatingDarkTheme(), new MaterialStepperDarkTheme(), diff --git a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploader.java b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploader.java index 818453ffb..73703aa88 100644 --- a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploader.java +++ b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploader.java @@ -27,6 +27,7 @@ import com.google.gwt.user.client.DOM; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.fileuploader.base.HasFileUpload; import gwt.material.design.addins.client.fileuploader.base.UploadFile; import gwt.material.design.addins.client.fileuploader.base.UploadResponse; @@ -141,6 +142,7 @@ protected void onLoad() { } setEnabled(enabled); + AddinsDarkThemeReloader.get().reload(MaterialFileUploaderDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderClientBundle.java b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderClientBundle.java index 77a0b8cc6..14b9a507c 100644 --- a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderClientBundle.java @@ -37,4 +37,7 @@ interface MaterialFileUploaderClientBundle extends ClientBundle { @Source("resources/css/dropzone.min.css") TextResource dropzoneCss(); + + @Source("resources/css/dropzone-dark.min.css") + TextResource dropzoneDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java new file mode 100644 index 000000000..716939bac --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java @@ -0,0 +1,30 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.fileuploader; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialFileUploaderDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialFileUploaderDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialFileUploaderDebugClientBundle.INSTANCE.dropzoneDarkCss() : MaterialFileUploaderClientBundle.INSTANCE.dropzoneDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDebugClientBundle.java index 5492d4647..988cea16a 100644 --- a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDebugClientBundle.java @@ -37,4 +37,7 @@ interface MaterialFileUploaderDebugClientBundle extends ClientBundle { @Source("resources/css/dropzone.css") TextResource dropzoneCssDebug(); + + @Source("resources/css/dropzone-dark.css") + TextResource dropzoneDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.css b/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.css index 95c430e44..41ddba749 100644 --- a/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.css +++ b/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.css @@ -13,6 +13,6 @@ } .empty-state .loader-wrapper { - background: transparent; + background: transparent !important; z-index: 1; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.min.css b/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.min.css index 6cb0dc4e5..e774fd34a 100644 --- a/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.min.css +++ b/src/main/resources/gwt/material/design/addins/client/emptystate/resources/css/empty-state.min.css @@ -1 +1 @@ -.empty-state i.large{border-radius:100%;padding:20px;background:#fff;color:#4caf50;font-size:4rem;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.empty-state .preloader-wrapper{width:100px;height:100px}.empty-state .loader-wrapper{background:0 0;z-index:1} \ No newline at end of file +.empty-state i.large{border-radius:100%;padding:20px;background:#fff;color:#4caf50;font-size:4rem;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.empty-state .preloader-wrapper{width:100px;height:100px}.empty-state .loader-wrapper{background:0 0!important;z-index:1} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css new file mode 100644 index 000000000..b6a659ffb --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css @@ -0,0 +1,36 @@ +.fileuploader { + background: #1e1e1e; +} + +.fileuploader .upload-label { + background-color: #292929 !important; +} + +.fileuploader .upload-label i { + background: #ffffff !important; + color: #1e1e1e !important; +} + +.fileuploader.active { + background: #1e1e1e !important; +} + +.fileuploader.active .upload-label { + color: #fff !important; +} + +.preview-container { + background-color: #1e1e1e; +} + +.preview-container .previews .zdrop-info .preview-icon { + color: #1e1e1e !important; +} + +.preview-container .header { + background-color: #1e1e1e !important; +} + +.preview-container .previews .zdrop-info .preview-icon { + background: #393939; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css new file mode 100644 index 000000000..f440955e8 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css @@ -0,0 +1 @@ +.fileuploader{background:#1e1e1e}.fileuploader .upload-label{background-color:#292929!important}.fileuploader .upload-label i{background:#fff!important;color:#1e1e1e!important}.fileuploader.active{background:#1e1e1e!important}.fileuploader.active .upload-label{color:#fff!important}.preview-container{background-color:#1e1e1e}.preview-container .previews .zdrop-info .preview-icon{color:#1e1e1e!important}.preview-container .header{background-color:#1e1e1e!important}.preview-container .previews .zdrop-info .preview-icon{background:#393939} \ No newline at end of file From abb3d5b575eb6724c62e7c613aaa14fed2c6c60f Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 4 Jan 2020 12:19:35 +0800 Subject: [PATCH 139/247] Touch Splitter dark theme support. --- .../client/dark/AddinsDarkThemeLoader.java | 2 ++ .../MaterialFileUploaderDarkTheme.java | 4 +-- .../client/splitpanel/MaterialSplitPanel.java | 2 ++ .../MaterialSplitPanelClientBundle.java | 3 ++ .../MaterialSplitPanelDarkTheme.java | 30 +++++++++++++++++++ .../MaterialSplitPanelDebugClientBundle.java | 3 ++ .../resources/css/touchsplitter-dark.css | 4 +++ .../resources/css/touchsplitter-dark.min.css | 1 + .../resources/css/touchsplitter.css | 5 ++-- .../resources/css/touchsplitter.min.css | 2 +- 10 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 449718de9..a70c1ec1c 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -25,6 +25,7 @@ import gwt.material.design.addins.client.fileuploader.MaterialFileUploaderDarkTheme; import gwt.material.design.addins.client.rating.MaterialRatingDarkTheme; import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; +import gwt.material.design.addins.client.splitpanel.MaterialSplitPanelDarkTheme; import gwt.material.design.addins.client.stepper.MaterialStepperDarkTheme; import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; @@ -39,6 +40,7 @@ public AddinsDarkThemeLoader() { new MaterialTimePickerDarkTheme(), new MaterialRatingDarkTheme(), new MaterialStepperDarkTheme(), + new MaterialSplitPanelDarkTheme(), new MaterialRichEditorDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java index 716939bac..a8c363390 100644 --- a/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/fileuploader/MaterialFileUploaderDarkTheme.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java index ced9b1057..005d65351 100644 --- a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java +++ b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanel.java @@ -22,6 +22,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.splitpanel.constants.Dock; import gwt.material.design.addins.client.splitpanel.constants.Side; import gwt.material.design.addins.client.splitpanel.js.JsSplitPanelOptions; @@ -103,6 +104,7 @@ public void load() { options.orientation = getAxis().getCssName(); touchSplitter = $(getElement()).touchSplit(options); applySplitterLineColor(splitterLineColor); + AddinsDarkThemeReloader.get().reload(MaterialSplitPanelDarkTheme.class); } public TouchSplitter getTouchSplitter() { diff --git a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelClientBundle.java b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelClientBundle.java index 2fa98a280..f45f51abd 100644 --- a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelClientBundle.java @@ -37,4 +37,7 @@ interface MaterialSplitPanelClientBundle extends ClientBundle { @Source("resources/css/touchsplitter.min.css") TextResource splitPanelCss(); + + @Source("resources/css/touchsplitter-dark.min.css") + TextResource splitPanelDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDarkTheme.java b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDarkTheme.java new file mode 100644 index 000000000..982d8dfb5 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDarkTheme.java @@ -0,0 +1,30 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.splitpanel; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialSplitPanelDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialSplitPanelDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialSplitPanelDebugClientBundle.INSTANCE.splitPanelDarkCss() : MaterialSplitPanelClientBundle.INSTANCE.splitPanelDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDebugClientBundle.java index a668c2b8e..7bd86ced6 100644 --- a/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/splitpanel/MaterialSplitPanelDebugClientBundle.java @@ -37,4 +37,7 @@ interface MaterialSplitPanelDebugClientBundle extends ClientBundle { @Source("resources/css/touchsplitter.css") TextResource splitPanelDebugCss(); + + @Source("resources/css/touchsplitter-dark.css") + TextResource splitPanelDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.css b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.css new file mode 100644 index 000000000..860671fea --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.css @@ -0,0 +1,4 @@ +.TouchSplitter, +.TouchSplitter > div { + background: #353535; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.min.css b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.min.css new file mode 100644 index 000000000..10ed3553c --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter-dark.min.css @@ -0,0 +1 @@ +.TouchSplitter,.TouchSplitter>div{background:#353535} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.css b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.css index b52c0bb34..beaaf59a7 100644 --- a/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.css +++ b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.css @@ -1,6 +1,7 @@ -.TouchSplitter { +.TouchSplitter, +.TouchSplitter > div { overflow: hidden; - background: black; + background: #e9e9e9; } .TouchSplitter.h-ts > div { diff --git a/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.min.css b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.min.css index 929210270..821700157 100644 --- a/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.min.css +++ b/src/main/resources/gwt/material/design/addins/client/splitpanel/resources/css/touchsplitter.min.css @@ -1 +1 @@ -.TouchSplitter{overflow:hidden;background:#000}.TouchSplitter.h-ts>div{height:100%;width:42%;width:calc(50% - .5em)}.TouchSplitter.v-ts>div{width:100%;height:42%;height:calc(50% - .5em)}.TouchSplitter>div{display:block;float:left}.TouchSplitter.h-ts>div.splitter-bar{width:1em;cursor:col-resize}.TouchSplitter.v-ts>div.splitter-bar{height:1em;cursor:row-resize}.TouchSplitter>div.splitter-bar.dock>div{width:1em;height:1em;background-repeat:no-repeat;background-position:center}.TouchSplitter,.TouchSplitter>div,.TouchSplitter>div.splitter-bar>div{position:relative;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.TouchSplitter>div.test-calc{width:10px;width:calc(10px + 10px)}.TouchSplitter>div.test-em{width:1em}.TouchSplitter>div.splitter-bar>div{width:.2rem;height:1em;position:relative;background:#fff}.TouchSplitter.h-ts>div.splitter-bar>div{margin-top:0;top:50%;margin-left:25%;height:20px;width:50%}.TouchSplitter.v-ts>div.splitter-bar>div{width:20px;line-height:20px;height:4px;position:absolute;top:0;left:0;bottom:0;right:0;margin:auto} \ No newline at end of file +.TouchSplitter,.TouchSplitter>div{overflow:hidden;background:#e9e9e9}.TouchSplitter.h-ts>div{height:100%;width:42%;width:calc(50% - .5em)}.TouchSplitter.v-ts>div{width:100%;height:42%;height:calc(50% - .5em)}.TouchSplitter>div{display:block;margin:0;padding:0;float:left}.TouchSplitter.h-ts>div.splitter-bar{width:1em;cursor:col-resize}.TouchSplitter.v-ts>div.splitter-bar{height:1em;cursor:row-resize}.TouchSplitter>div.splitter-bar.dock>div{width:1em;height:1em;background-repeat:no-repeat;background-position:center}.TouchSplitter,.TouchSplitter>div,.TouchSplitter>div.splitter-bar>div{position:relative;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.TouchSplitter>div.test-calc{width:10px;width:calc(10px + 10px)}.TouchSplitter>div.test-em{width:1em}.TouchSplitter>div.splitter-bar>div{width:.2rem;height:1em;position:relative;background:#fff}.TouchSplitter.h-ts>div.splitter-bar>div{margin-top:0;top:50%;margin-left:25%;height:20px;width:50%}.TouchSplitter.v-ts>div.splitter-bar>div{width:20px;line-height:20px;height:4px;position:absolute;top:0;left:0;bottom:0;right:0;margin:auto} \ No newline at end of file From 09d4ab7e5f485eba967d14b1629b6e0c475508fa Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sat, 4 Jan 2020 15:21:43 +0800 Subject: [PATCH 140/247] Window Dialog - dark theme support. --- .../client/dark/AddinsDarkThemeLoader.java | 4 ++- .../addins/client/window/MaterialWindow.java | 21 +++++++------ .../window/MaterialWindowClientBundle.java | 3 ++ .../window/MaterialWindowDarkTheme.java | 30 +++++++++++++++++++ .../MaterialWindowDebugClientBundle.java | 3 ++ .../window/resources/css/window-dark.css | 7 +++++ .../window/resources/css/window-dark.min.css | 0 7 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/window/MaterialWindowDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index a70c1ec1c..73ffe2e98 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -28,6 +28,7 @@ import gwt.material.design.addins.client.splitpanel.MaterialSplitPanelDarkTheme; import gwt.material.design.addins.client.stepper.MaterialStepperDarkTheme; import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; +import gwt.material.design.addins.client.window.MaterialWindowDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; public class AddinsDarkThemeLoader extends DarkThemeLoader { @@ -41,6 +42,7 @@ public AddinsDarkThemeLoader() { new MaterialRatingDarkTheme(), new MaterialStepperDarkTheme(), new MaterialSplitPanelDarkTheme(), - new MaterialRichEditorDarkTheme()); + new MaterialRichEditorDarkTheme(), + new MaterialWindowDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java b/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java index df60277b6..a2627bc56 100644 --- a/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java +++ b/src/main/java/gwt/material/design/addins/client/window/MaterialWindow.java @@ -30,6 +30,7 @@ import com.google.gwt.user.client.ui.Widget; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.dnd.MaterialDnd; import gwt.material.design.addins.client.dnd.constants.Restriction; import gwt.material.design.addins.client.dnd.js.JsDragOptions; @@ -173,6 +174,8 @@ protected void onLoad() { } } })); + + AddinsDarkThemeReloader.get().reload(MaterialWindowDarkTheme.class); } /** @@ -192,7 +195,7 @@ protected MaterialDnd buildDnd() { dnd.ignoreFrom(".content, .window-action"); return dnd; } - + protected void onClose() { } @@ -249,12 +252,12 @@ public static boolean isOverlay() { } public static void setOverlay(boolean overlay) { - if(overlay) { - if(windowOverlay == null) { + if (overlay) { + if (windowOverlay == null) { windowOverlay = new MaterialPanel(AddinsCssName.WINDOW_OVERLAY); } } else { - if(windowOverlay != null) { + if (windowOverlay != null) { windowOverlay.removeFromParent(); windowOverlay = null; } @@ -269,7 +272,7 @@ public void open() { RootPanel.get().add(this); } windowCount++; - if(windowOverlay != null && !windowOverlay.isAttached()) { + if (windowOverlay != null && !windowOverlay.isAttached()) { RootPanel.get().add(windowOverlay); } @@ -299,14 +302,14 @@ public void close() { windowCount--; if (closeAnimation == null) { getOpenMixin().setOn(false); - if(windowOverlay != null && windowOverlay.isAttached() && windowCount < 1) { + if (windowOverlay != null && windowOverlay.isAttached() && windowCount < 1) { windowOverlay.removeFromParent(); } CloseEvent.fire(this, false); } else { closeAnimation.animate(this, () -> { getOpenMixin().setOn(false); - if(windowOverlay != null && windowOverlay.isAttached() && windowCount < 1) { + if (windowOverlay != null && windowOverlay.isAttached() && windowCount < 1) { windowOverlay.removeFromParent(); } CloseEvent.fire(this, false); @@ -445,10 +448,10 @@ public void setPreventClose(boolean preventClose) { * or a {@link String} selector. */ public void setDndArea(Object dndArea) { - if(dndArea instanceof UIObject) { + if (dndArea instanceof UIObject) { dndArea = ((UIObject) dndArea).getElement(); } - if(dnd != null) { + if (dnd != null) { dnd.draggable(JsDragOptions.create(new Restriction(dndArea, true, 0, 0, 1.2, 1))); } } diff --git a/src/main/java/gwt/material/design/addins/client/window/MaterialWindowClientBundle.java b/src/main/java/gwt/material/design/addins/client/window/MaterialWindowClientBundle.java index 9b7d819c1..19d308cea 100644 --- a/src/main/java/gwt/material/design/addins/client/window/MaterialWindowClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/window/MaterialWindowClientBundle.java @@ -34,4 +34,7 @@ interface MaterialWindowClientBundle extends ClientBundle { @Source("resources/css/window.min.css") TextResource windowCss(); + + @Source("resources/css/window-dark.min.css") + TextResource windowDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDarkTheme.java b/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDarkTheme.java new file mode 100644 index 000000000..ab487e2de --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDarkTheme.java @@ -0,0 +1,30 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.window; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialWindowDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialWindowDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialWindowDebugClientBundle.INSTANCE.windowDarkCss() : MaterialWindowClientBundle.INSTANCE.windowDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDebugClientBundle.java index ef5deb108..bf05a014e 100644 --- a/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/window/MaterialWindowDebugClientBundle.java @@ -34,4 +34,7 @@ interface MaterialWindowDebugClientBundle extends ClientBundle { @Source("resources/css/window.css") TextResource windowCssDebug(); + + @Source("resources/css/window-dark.css") + TextResource windowDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.css b/src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.css new file mode 100644 index 000000000..92f97d884 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.css @@ -0,0 +1,7 @@ +.window .window-toolbar { + background-color: #1e1e1e; +} + +.window .content { + background-color: #383838; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.min.css b/src/main/resources/gwt/material/design/addins/client/window/resources/css/window-dark.min.css new file mode 100644 index 000000000..e69de29bb From ac55e79b0d46117e343fb599ac2adeeca6259c30 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 5 Jan 2020 06:18:56 +0800 Subject: [PATCH 141/247] Image Cropper slider - applied recent changes. --- .../design/addins/client/cropper/resources/css/croppie.css | 5 +++++ .../addins/client/cropper/resources/css/croppie.min.css | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.css b/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.css index 0af2e2c60..f9c115a66 100755 --- a/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.css +++ b/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.css @@ -248,3 +248,8 @@ background: #ccc; .cr-rotate-r i:before { content: '↻'; } + +.cr-slider-wrap input[type=range]::-webkit-slider-runnable-track { + background-color: #e9e9e9 !important; + margin-top: 0px; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.min.css b/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.min.css index aacb35e83..097e56a77 100755 --- a/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.min.css +++ b/src/main/resources/gwt/material/design/addins/client/cropper/resources/css/croppie.min.css @@ -1 +1 @@ -.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;width:300px;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{display:inline-block;font-style:normal;font-weight:900;font-size:22px}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'} \ No newline at end of file +.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;width:300px;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{display:inline-block;font-style:normal;font-weight:900;font-size:22px}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.cr-slider-wrap input[type=range]::-webkit-slider-runnable-track{background-color:#e9e9e9!important;margin-top:0} \ No newline at end of file From f57228507791f6dbdc2dbe77584cf0ca338b9d6b Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 5 Jan 2020 13:42:24 +0800 Subject: [PATCH 142/247] Subheader Dark Theme support --- .../addins/client/dark/AddinsDarkThemeLoader.java | 2 ++ .../subheader/MaterialSubHeaderClientBundle.java | 3 +++ .../client/subheader/MaterialSubHeaderContainer.java | 2 ++ .../subheader/MaterialSubHeaderDebugClientBundle.java | 3 +++ .../client/subheader/MaterialSubheaderDarkTheme.java | 11 +++++++++++ .../client/subheader/resources/css/subheader-dark.css | 4 ++++ .../subheader/resources/css/subheader-dark.min.css | 1 + 7 files changed, 26 insertions(+) create mode 100644 src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 73ffe2e98..46e7ff2fe 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -27,6 +27,7 @@ import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; import gwt.material.design.addins.client.splitpanel.MaterialSplitPanelDarkTheme; import gwt.material.design.addins.client.stepper.MaterialStepperDarkTheme; +import gwt.material.design.addins.client.subheader.MaterialSubheaderDarkTheme; import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; import gwt.material.design.addins.client.window.MaterialWindowDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; @@ -42,6 +43,7 @@ public AddinsDarkThemeLoader() { new MaterialRatingDarkTheme(), new MaterialStepperDarkTheme(), new MaterialSplitPanelDarkTheme(), + new MaterialSubheaderDarkTheme(), new MaterialRichEditorDarkTheme(), new MaterialWindowDarkTheme()); } diff --git a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderClientBundle.java b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderClientBundle.java index 249431781..a3e5ad2b4 100644 --- a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderClientBundle.java @@ -37,4 +37,7 @@ interface MaterialSubHeaderClientBundle extends ClientBundle { @Source("resources/css/subheader.min.css") TextResource subheaderCss(); + + @Source("resources/css/subheader-dark.min.css") + TextResource subheaderDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderContainer.java b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderContainer.java index eb2474037..bf7e2171e 100644 --- a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderContainer.java +++ b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderContainer.java @@ -23,6 +23,7 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.subheader.constants.SubHeaderType; import gwt.material.design.addins.client.subheader.js.JsSubHeader; import gwt.material.design.client.base.HasType; @@ -105,6 +106,7 @@ public void load() { $(getElement()).find(".top_holder").css("display", "none"); } } + AddinsDarkThemeReloader.get().reload(MaterialSubheaderDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderDebugClientBundle.java index 85c06b884..91d76e087 100644 --- a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubHeaderDebugClientBundle.java @@ -37,4 +37,7 @@ interface MaterialSubHeaderDebugClientBundle extends ClientBundle { @Source("resources/css/subheader.css") TextResource subheaderCssDebug(); + + @Source("resources/css/subheader-dark.css") + TextResource subheaderDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java new file mode 100644 index 000000000..6cc9a29df --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.addins.client.subheader; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialSubheaderDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialSubheaderDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialSubHeaderDebugClientBundle.INSTANCE.subheaderDarkCss() : MaterialSubHeaderClientBundle.INSTANCE.subheaderDarkCss()); + } +} diff --git a/src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.css b/src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.css new file mode 100644 index 000000000..cad6b5386 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.css @@ -0,0 +1,4 @@ +.subheader, +.subheader-static{ + background-color: #2f2f2f; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.min.css b/src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.min.css new file mode 100644 index 000000000..e1e34f00f --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/subheader/resources/css/subheader-dark.min.css @@ -0,0 +1 @@ +.subheader,.subheader-static{background-color:#2f2f2f} \ No newline at end of file From e3c90b3c93c568bcf753d1efcbbc707cac4563da Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 6 Jan 2020 03:56:37 +0800 Subject: [PATCH 143/247] Fixed Camera Overlay Panel --- .../client/camera/MaterialCameraCapture.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java b/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java index 2cd3aeffa..d029db66f 100644 --- a/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java +++ b/src/main/java/gwt/material/design/addins/client/camera/MaterialCameraCapture.java @@ -33,6 +33,7 @@ import gwt.material.design.addins.client.camera.events.CameraCaptureHandler; import gwt.material.design.client.base.JsLoader; import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.client.ui.MaterialPanel; import gwt.material.design.jscore.client.api.Navigator; import gwt.material.design.jscore.client.api.media.*; @@ -106,7 +107,7 @@ public class MaterialCameraCapture extends MaterialWidget implements JsLoader, H protected CameraFacingMode facingMode = CameraFacingMode.FRONT; private MediaStream mediaStream; private MaterialWidget video = new MaterialWidget(Document.get().createVideoElement()); - private MaterialWidget overlayPanel = new MaterialWidget(Document.get().createDivElement()); + private MaterialPanel overlayPanel; public MaterialCameraCapture() { super(Document.get().createDivElement(), "camera-wrapper"); @@ -119,13 +120,6 @@ protected void onLoad() { setLayoutPosition(Style.Position.RELATIVE); add(video); - overlayPanel.setLayoutPosition(Style.Position.FIXED); - overlayPanel.setTop(0); - overlayPanel.setLeft(0); - overlayPanel.setBottom(0); - overlayPanel.setRight(0); - add(overlayPanel); - load(); } @@ -301,15 +295,15 @@ public static boolean isSupported() { } public void addOverlay(MaterialWidget overlay) { - overlayPanel.add(overlay); + getOverlayPanel().add(overlay); } public void removeOverlay(MaterialWidget overlay) { - overlayPanel.remove(overlay); + getOverlayPanel().remove(overlay); } public void clearOverlays() { - overlayPanel.clear(); + getOverlayPanel().clear(); } public MaterialWidget getVideo() { @@ -320,6 +314,19 @@ public void setVideo(MaterialWidget video) { this.video = video; } + public MaterialPanel getOverlayPanel() { + if (overlayPanel == null && overlayPanel.isAttached()) { + overlayPanel = new MaterialPanel(); + overlayPanel.setLayoutPosition(Style.Position.FIXED); + overlayPanel.setTop(0); + overlayPanel.setLeft(0); + overlayPanel.setBottom(0); + overlayPanel.setRight(0); + add(overlayPanel); + } + return overlayPanel; + } + /** * Set the resolution of the camera */ From f6f9f14d147a988c2e0c6826300cb067a5039f13 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 6 Jan 2020 04:50:38 +0800 Subject: [PATCH 144/247] Tree Item dark theme support. --- .../client/dark/AddinsDarkThemeLoader.java | 8 +++-- .../addins/client/tree/MaterialTree.java | 9 ++++-- .../client/tree/MaterialTreeClientBundle.java | 3 ++ .../client/tree/MaterialTreeDarkTheme.java | 31 +++++++++++++++++++ .../tree/MaterialTreeDebugClientBundle.java | 3 ++ .../client/tree/resources/css/tree-dark.css | 4 +++ .../tree/resources/css/tree-dark.min.css | 4 +++ 7 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 46e7ff2fe..a971f8116 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -7,9 +7,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 gwt.material.design.addins.client.stepper.MaterialStepperDarkTheme; import gwt.material.design.addins.client.subheader.MaterialSubheaderDarkTheme; import gwt.material.design.addins.client.timepicker.MaterialTimePickerDarkTheme; +import gwt.material.design.addins.client.tree.MaterialTreeDarkTheme; import gwt.material.design.addins.client.window.MaterialWindowDarkTheme; import gwt.material.design.client.theme.dark.DarkThemeLoader; @@ -41,10 +42,11 @@ public AddinsDarkThemeLoader() { new MaterialFileUploaderDarkTheme(), new MaterialTimePickerDarkTheme(), new MaterialRatingDarkTheme(), + new MaterialRichEditorDarkTheme(), new MaterialStepperDarkTheme(), new MaterialSplitPanelDarkTheme(), new MaterialSubheaderDarkTheme(), - new MaterialRichEditorDarkTheme(), + new MaterialTreeDarkTheme(), new MaterialWindowDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java index 2dbf4a043..b1175697a 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java @@ -7,9 +7,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. @@ -25,6 +25,7 @@ import com.google.gwt.user.client.ui.Widget; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.MaterialWidget; @@ -63,7 +64,7 @@ */ // @formatter:on public class MaterialTree extends MaterialWidget implements HasCloseHandlers, - HasOpenHandlers, HasSelectionHandlers { + HasOpenHandlers, HasSelectionHandlers { static { if (MaterialAddins.isDebug()) { @@ -103,6 +104,8 @@ protected void onLoad() { } setSelectedItem(treeItem); })); + + AddinsDarkThemeReloader.get().reload(MaterialTreeDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeClientBundle.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeClientBundle.java index d703a93ec..e40de01f7 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeClientBundle.java @@ -34,4 +34,7 @@ interface MaterialTreeClientBundle extends ClientBundle { @Source("resources/css/tree.min.css") TextResource treeCss(); + + @Source("resources/css/tree-dark.min.css") + TextResource treeDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java new file mode 100644 index 000000000..274fc34ee --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java @@ -0,0 +1,31 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.addins.client.tree; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialTreeDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialTreeDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialTreeDebugClientBundle.INSTANCE.treeDarkCss() : + MaterialTreeClientBundle.INSTANCE.treeDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDebugClientBundle.java index dd7a63b34..531a0e8a6 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDebugClientBundle.java @@ -34,4 +34,7 @@ interface MaterialTreeDebugClientBundle extends ClientBundle { @Source("resources/css/tree.css") TextResource treeCssDebug(); + + @Source("resources/css/tree-dark.css") + TextResource treeDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.css b/src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.css new file mode 100644 index 000000000..13163df26 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.css @@ -0,0 +1,4 @@ +/** Tree **/ +.tree-item i { + color: #BB86FC; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.min.css b/src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.min.css new file mode 100644 index 000000000..13163df26 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/tree/resources/css/tree-dark.min.css @@ -0,0 +1,4 @@ +/** Tree **/ +.tree-item i { + color: #BB86FC; +} \ No newline at end of file From c4dc65a4e1fb3f9bf28099d252206c98d8375af5 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 6 Jan 2020 09:39:53 +0800 Subject: [PATCH 145/247] Autocomplete support for dark theme --- .../client/autocomplete/MaterialAutoComplete.java | 8 +++++++- .../autocomplete/MaterialAutoCompleteDarkTheme.java | 11 +++++++++++ .../MaterialAutocompleteClientBundle.java | 3 +++ .../MaterialAutocompleteDebugClientBundle.java | 3 +++ .../addins/client/dark/AddinsDarkThemeLoader.java | 4 +++- .../autocomplete/resources/css/autocomplete-dark.css | 12 ++++++++++++ .../resources/css/autocomplete-dark.min.css | 1 + 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java index 609d76b8c..68373a80a 100644 --- a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java +++ b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoComplete.java @@ -29,6 +29,7 @@ import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.autocomplete.constants.AutocompleteType; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.*; import gwt.material.design.client.base.mixin.*; @@ -231,7 +232,6 @@ protected void onLoad() { } protected void loadHandlers() { - if (itemBoxBlurHandler == null) { itemBoxBlurHandler = itemBox.addBlurHandler(blurEvent -> { if (getValue().size() > 0) { @@ -291,6 +291,12 @@ protected void loadHandlers() { if (itemBoxClickHandler == null) { itemBoxClickHandler = itemBox.addClickHandler(event -> suggestBox.showSuggestionList()); } + + if (itemBox != null && itemBox.isAttached()) { + itemBox.getElement().setAttribute("autocomplete", "off"); + } + + AddinsDarkThemeReloader.get().reload(MaterialAutoCompleteDarkTheme.class); } @Override diff --git a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java new file mode 100644 index 000000000..3e4f2b6c1 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.addins.client.autocomplete; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialAutoCompleteDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialAutoCompleteDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialAutocompleteDebugClientBundle.INSTANCE.autocompleteDarkCss() : MaterialAutocompleteClientBundle.INSTANCE.autocompleteDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteClientBundle.java b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteClientBundle.java index a002dbad5..ba2b0f7bc 100644 --- a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteClientBundle.java @@ -34,4 +34,7 @@ interface MaterialAutocompleteClientBundle extends ClientBundle { @Source("resources/css/autocomplete.min.css") TextResource autocompleteCss(); + + @Source("resources/css/autocomplete-dark.min.css") + TextResource autocompleteDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteDebugClientBundle.java index 2d89cafe4..e8a8c1e4d 100644 --- a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutocompleteDebugClientBundle.java @@ -34,4 +34,7 @@ interface MaterialAutocompleteDebugClientBundle extends ClientBundle { @Source("resources/css/autocomplete.css") TextResource autocompleteCssDebug(); + + @Source("resources/css/autocomplete-dark.css") + TextResource autocompleteDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index a971f8116..0ab5744c3 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -19,6 +19,7 @@ */ package gwt.material.design.addins.client.dark; +import gwt.material.design.addins.client.autocomplete.MaterialAutoCompleteDarkTheme; import gwt.material.design.addins.client.bubble.MaterialBubbleDarkTheme; import gwt.material.design.addins.client.carousel.MaterialCarouselDarkTheme; import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; @@ -36,7 +37,8 @@ public class AddinsDarkThemeLoader extends DarkThemeLoader { public AddinsDarkThemeLoader() { - super(new MaterialBubbleDarkTheme(), + super(new MaterialAutoCompleteDarkTheme(), + new MaterialBubbleDarkTheme(), new MaterialComboBoxDarkTheme(), new MaterialCarouselDarkTheme(), new MaterialFileUploaderDarkTheme(), diff --git a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css new file mode 100644 index 000000000..24bac22b0 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css @@ -0,0 +1,12 @@ +.gwt-SuggestBoxPopup { + background: #2f2f2f; +} + +.gwt-SuggestBoxPopup .item:hover { + background-color: #353535; +} + +ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]) { + border: none !important; + box-shadow: none; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css new file mode 100644 index 000000000..18bb40343 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css @@ -0,0 +1 @@ +.gwt-SuggestBoxPopup{background:#2f2f2f}.gwt-SuggestBoxPopup .item:hover{background-color:#353535}ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]){border:none!important;box-shadow:none} \ No newline at end of file From 2a6195dfd269848167eff43b9ee7ef98134d2632 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 6 Jan 2020 10:54:36 +0800 Subject: [PATCH 146/247] Autocomplete - fixed box-shadow on darkmode --- .../client/autocomplete/resources/css/autocomplete-dark.css | 2 +- .../client/autocomplete/resources/css/autocomplete-dark.min.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css index 24bac22b0..9753076f7 100644 --- a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css +++ b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css @@ -8,5 +8,5 @@ ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]) { border: none !important; - box-shadow: none; + box-shadow: none !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css index 18bb40343..fa7f6976a 100644 --- a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css +++ b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css @@ -1 +1 @@ -.gwt-SuggestBoxPopup{background:#2f2f2f}.gwt-SuggestBoxPopup .item:hover{background-color:#353535}ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]){border:none!important;box-shadow:none} \ No newline at end of file +.gwt-SuggestBoxPopup{background:#2f2f2f}.gwt-SuggestBoxPopup .item:hover{background-color:#353535}ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]){border:none!important;box-shadow:none!important} \ No newline at end of file From cb5cbb9611271a3bf0fb3bda3db66031bfa126a8 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 6 Jan 2020 10:59:53 +0800 Subject: [PATCH 147/247] Standardize autocomplete dark theme same with combo / list box --- .../client/autocomplete/resources/css/autocomplete-dark.css | 4 ++-- .../autocomplete/resources/css/autocomplete-dark.min.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css index 9753076f7..857378c0b 100644 --- a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css +++ b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.css @@ -2,8 +2,8 @@ background: #2f2f2f; } -.gwt-SuggestBoxPopup .item:hover { - background-color: #353535; +.gwt-SuggestBoxPopup .suggestPopupContent table tr td:hover { + background-color: #353535 !important; } ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]) { diff --git a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css index fa7f6976a..225e49eb1 100644 --- a/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css +++ b/src/main/resources/gwt/material/design/addins/client/autocomplete/resources/css/autocomplete-dark.min.css @@ -1 +1 @@ -.gwt-SuggestBoxPopup{background:#2f2f2f}.gwt-SuggestBoxPopup .item:hover{background-color:#353535}ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]){border:none!important;box-shadow:none!important} \ No newline at end of file +.gwt-SuggestBoxPopup{background:#2f2f2f}.gwt-SuggestBoxPopup .suggestPopupContent table tr td:hover{background-color:#353535!important}ul.multiValueSuggestBox-list input[type=text]:focus:not([readonly]){border:none!important;box-shadow:none!important} \ No newline at end of file From 5dbf7c833588719cbf7098952d1335f01a130f45 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 7 Jan 2020 06:09:00 +0800 Subject: [PATCH 148/247] Overlay dark theme support --- .../addins/client/dark/AddinsDarkThemeLoader.java | 2 ++ .../design/addins/client/overlay/MaterialOverlay.java | 8 ++++++++ .../client/overlay/MaterialOverlayClientBundle.java | 3 +++ .../client/overlay/MaterialOverlayDarkTheme.java | 11 +++++++++++ .../overlay/MaterialOverlayDebugClientBundle.java | 3 +++ .../client/overlay/resources/css/overlay-dark.css | 3 +++ .../client/overlay/resources/css/overlay-dark.min.css | 1 + 7 files changed, 31 insertions(+) create mode 100644 src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.css create mode 100644 src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.min.css diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index 0ab5744c3..e74c5b59c 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -24,6 +24,7 @@ import gwt.material.design.addins.client.carousel.MaterialCarouselDarkTheme; import gwt.material.design.addins.client.combobox.MaterialComboBoxDarkTheme; import gwt.material.design.addins.client.fileuploader.MaterialFileUploaderDarkTheme; +import gwt.material.design.addins.client.overlay.MaterialOverlayDarkTheme; import gwt.material.design.addins.client.rating.MaterialRatingDarkTheme; import gwt.material.design.addins.client.richeditor.MaterialRichEditorDarkTheme; import gwt.material.design.addins.client.splitpanel.MaterialSplitPanelDarkTheme; @@ -42,6 +43,7 @@ public AddinsDarkThemeLoader() { new MaterialComboBoxDarkTheme(), new MaterialCarouselDarkTheme(), new MaterialFileUploaderDarkTheme(), + new MaterialOverlayDarkTheme(), new MaterialTimePickerDarkTheme(), new MaterialRatingDarkTheme(), new MaterialRichEditorDarkTheme(), diff --git a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlay.java b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlay.java index 9926aa195..9bf903a16 100644 --- a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlay.java +++ b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlay.java @@ -27,6 +27,7 @@ import com.google.gwt.event.shared.HandlerRegistration; import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.base.constants.AddinsCssName; +import gwt.material.design.addins.client.dark.AddinsDarkThemeReloader; import gwt.material.design.addins.client.pathanimator.MaterialPathAnimator; import gwt.material.design.client.MaterialDesignBase; import gwt.material.design.client.base.HasDurationTransition; @@ -93,6 +94,13 @@ public MaterialOverlay(Color backgroundColor, Style.Visibility visibility, Doubl setOpacity(opacity); } + @Override + protected void onLoad() { + super.onLoad(); + + AddinsDarkThemeReloader.get().reload(MaterialOverlayDarkTheme.class); + } + public void open(MaterialWidget source) { open(source.getElement()); } diff --git a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayClientBundle.java b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayClientBundle.java index 8c01bc7ab..35178a9b2 100644 --- a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayClientBundle.java @@ -34,4 +34,7 @@ interface MaterialOverlayClientBundle extends ClientBundle { @Source("resources/css/overlay.min.css") TextResource overlayCss(); + + @Source("resources/css/overlay-dark.min.css") + TextResource overlayDarkCss(); } diff --git a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java new file mode 100644 index 000000000..34eef4d14 --- /dev/null +++ b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.addins.client.overlay; + +import gwt.material.design.addins.client.MaterialAddins; +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; + +public class MaterialOverlayDarkTheme extends AddinsWidgetDarkTheme { + + public MaterialOverlayDarkTheme() { + super(MaterialAddins.isDebug() ? MaterialOverlayDebugClientBundle.INSTANCE.overlayDarkCss() : MaterialOverlayClientBundle.INSTANCE.overlayDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDebugClientBundle.java index 4f532fef7..dc05ca035 100644 --- a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDebugClientBundle.java @@ -34,4 +34,7 @@ interface MaterialOverlayDebugClientBundle extends ClientBundle { @Source("resources/css/overlay.css") TextResource overlayCssDebug(); + + @Source("resources/css/overlay-dark.css") + TextResource overlayDarkCss(); } diff --git a/src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.css b/src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.css new file mode 100644 index 000000000..7e17e5325 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.css @@ -0,0 +1,3 @@ +.overlay-panel{ + background: #383838; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.min.css b/src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.min.css new file mode 100644 index 000000000..4d193bda3 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/overlay/resources/css/overlay-dark.min.css @@ -0,0 +1 @@ +.overlay-panel{background:#383838} \ No newline at end of file From 80cb532017de148f556dd7fe6a780017751f0ad2 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Wed, 8 Jan 2020 06:12:00 +0800 Subject: [PATCH 149/247] Fixed timepicker css with recent dark theme changes --- .../addins/client/timepicker/resources/css/timepicker.min.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css index a4ef197ee..ec672d55e 100644 --- a/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css +++ b/src/main/resources/gwt/material/design/addins/client/timepicker/resources/css/timepicker.min.css @@ -1 +1 @@ -.lolliclock-header{background-color:#1e1f22!important}.lolliclock-popover{background-color:#2e3033}.lolliclock-plate{background-color:#282828}.lolliclock-active-button-background{background:#bb86fc!important}.lolliclock-btn-text{color:#d2d2d2}.lolliclock-active-button-text{color:#000}.lolliclock-button{color:#bb86fc!important}.lolliclock-canvas-bg{fill:#d6b5ff!important}.lolliclock-canvas-fg{fill:#bb86fc!important}.lolliclock-canvas line{stroke:#fff!important}.lolliclock-tick.active,.lolliclock-tick:hover{background-color:#bb86fc!important}.input-field.timepicker input.valid{border-bottom:1px solid #bb86fc;box-shadow:0 1px 0 0 #bb86fc} \ No newline at end of file +.lolliclock-popover{width:196px;height:324px;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.26),0 2px 10px 0 rgba(0,0,0,.16);font-family:Roboto,'Helvetica Neue, Helvetica, Arial',sans-serif;background-color:#fff;font-size:20px;user-select:none;margin:auto;width:250px;height:380px;margin-top:10%;z-index:999;position:relative}.landscape .lolliclock-popover{width:450px;height:250px}.landscape .lolliclock-header{display:inline-block!important;vertical-align:middle!important;width:140px!important;height:100%!important;padding-top:20%!important;padding-left:10px!important;animation:none!important;-webkit-animation:none!important;-moa-animation:none!important}.landscape .popover-content{display:inline-block!important;vertical-align:top!important;width:310px!important}.landscape .lolliclock-buttons{margin-top:-40px!important}.landscape .lolliclock-am-pm{padding-left:50px!important;font-size:20px!important}.landscape .lolliclock-ampm-block{display:none!important}.clock-overlay{position:fixed!important;width:100%!important;top:0!important;left:0!important;bottom:0!important;right:0!important;height:100%!important;background:rgba(0,0,0,.3);z-index:10000}.lolliclock-popover.animate{max-height:0;animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-popover .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-popover.animate-out{animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-popover 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-header{background:#03a9f4;height:85px;width:250px;display:flex;color:#fff;font-size:2.3em;font-weight:400;align-items:center;justify-content:center;overflow:hidden}.lolliclock-header.animate{height:0;animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms 150ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-header.animate-out{animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:slide-header 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time{display:flex;align-self:center}.lolliclock-primary-text{color:#fff}.lolliclock-hours{width:51px;text-align:right;opacity:.6;cursor:pointer;overflow:hidden;height:54px}.lolliclock-colon{opacity:.6;cursor:default}.lolliclock-minutes{width:51px;opacity:.6;cursor:pointer;overflow:hidden;height:54px}.lolliclock-am-pm{cursor:pointer;font-size:10px;top:47px;left:157px;opacity:.6;padding:3px}.lolliclock-primary-text{opacity:1}.lolliclock-time-old{opacity:1;height:54px}.lolliclock-time-new{opacity:0}.lolliclock-time .old-up{animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-up{animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards cubic-bezier(.4,0,.2,1)}.lolliclock-time .old-down{animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-time .new-down{animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up .3s forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-old.animate{animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-minutes .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 210ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-old.animate{animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-top-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-hours .lolliclock-time-new.animate{animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:transition-bottom-up 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.popover-content{padding:18px 14px;width:250px;height:203px}.lolliclock-canvas,.lolliclock-dial,.lolliclock-plate{width:168px;height:168px}.lolliclock-dial{transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s}.lolliclock-dial-out{transform:scale(1.25,1.25);-webkit-transform:scale(1.25,1.25);-moz-transform:scale(1.25,1.25);opacity:0}.lolliclock-plate{background:#f0f0f0;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;position:relative;margin:auto}.lolliclock-plate.animate{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0);animation:open-clock 150ms 150ms forwards;-webkit-animation:open-clock 150ms 150ms forwards;-moz-animation:open-clock 150ms 150ms forwards}.lolliclock-plate.animate-out{animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-webkit-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1);-moz-animation:open-clock 150ms forwards reverse cubic-bezier(.4,0,.2,1)}.lolliclock-canvas,.lolliclock-dial{position:absolute}.lolliclock-dial-minutes{visibility:hidden}.lolliclock-bearing{fill:#000;stroke-width:1}.lolliclock-canvas line{stroke:#b3e5fc;stroke-width:1;stroke-linecap:round}.lolliclock-canvas-fg{stroke:none;fill:#0288d1}.lolliclock-canvas-bg{fill:rgba(3,169,244,.25)}.lolliclock-tick{border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;color:#666;line-height:24px;text-align:center;width:24px;height:24px;font-size:.55em;font-weight:600;position:absolute;cursor:pointer}.lolliclock-tick.active,.lolliclock-tick:hover{background:#b3e5fc}.lolliclock-ampm-block{display:flex;justify-content:space-around;margin-top:20px}.lolliclock-ampm-btn{position:relative;height:35px;width:35px;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;font-size:10px;font-weight:600;cursor:pointer}.lolliclock-ampm-btn.animate{opacity:0;animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 114ms 186ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-ampm-btn.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate{opacity:0;animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 75ms 225ms forwards cubic-bezier(.4,0,.2,1)}.lolliclock-button.animate-out{animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-webkit-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1);-moz-animation:open-btn 150ms reverse forwards cubic-bezier(.4,0,.2,1)}.lolliclock-btn-background{position:absolute;height:35px;width:35px;opacity:0;transform:scale(0);-moz-transform:scale(0);-webkit-transform:scale(0)}.lolliclock-btn-text{position:absolute;width:100%;text-align:center;line-height:35px;vertical-align:middle;color:#212121}.lolliclock-active-button-background{background-color:#03a9f4;border-radius:100%;transition:transform 175ms;-webkit-transition:transform 175ms;-moz-transition:transform 175ms;transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1);opacity:1}.lolliclock-active-button-text{color:#fff}.lolliclock-ampm-btn:focus{outline:0}.lolliclock-clickable{cursor:pointer}.lolliclock-moving{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.lolliclock-export{display:hidden}.lolliclock-buttons{font-size:11px;display:flex;justify-content:flex-end;margin-top:50px;margin-right:8px}.lolliclock-button{font-weight:500;color:#03a9f4;cursor:pointer;padding:8px;min-width:32px;margin:0 4px;background:0 0;text-align:center;text-transform:uppercase;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}@-moz-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-webkit-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-o-keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@keyframes open-popover{0%{max-height:0}100%{max-height:380px}}@-moz-keyframes slide-header{0%{height:0}100%{height:85px}}@-webkit-keyframes slide-header{0%{height:0}100%{height:85px}}@-o-keyframes slide-header{0%{height:0}100%{height:85px}}@keyframes slide-header{0%{height:0}100%{height:85px}}@-moz-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-webkit-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-o-keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@keyframes transition-top-up{0%{margin-top:0;opacity:1}100%{margin-top:-54px;opacity:0}}@-moz-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-o-keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@keyframes transition-bottom-up{0%{opacity:0}100%{opacity:1}}@-moz-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-webkit-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-o-keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@keyframes open-clock{0%{transform:scale(0);-webkit-transform:scale(0);-moz-transform:scale(0)}100%{transform:scale(1);-webkit-transform:scale(1);-moz-transform:scale(1)}}@-moz-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);opacity:1}}@-o-keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}@keyframes open-btn{0%{transform:translate3d(0,-40px,0);-webkit-transform:translate3d(0,-40px,0);-moz-transform:translate3d(0,-40px,0);opacity:0}100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);opacity:1}}.timepicker input{position:relative}.input-field.filled input.disabled{background:0 0}.input-field.outlined.timepicker input.valid,.input-field.outlined.timepicker input:focus{border:2px solid #42a5f5;box-shadow:none}.input-field.outlined.timepicker input.field-error,.input-field.outlined.timepicker input.field-error:focus{border:2px solid #f44336!important;box-shadow:none!important;margin-bottom:8px}.input-field.outlined.timepicker input.field-success,.input-field.outlined.timepicker input.field-success:focus{border:2px solid #4caf50!important;box-shadow:none!important;margin-bottom:8px}.input-field.timepicker input.valid{border-bottom:1px solid #42a5f5;box-shadow:0 1px 0 0 #42a5f5}.input-field.timepicker input.disabled+label.required:before{display:none} \ No newline at end of file From 6b1fc26caeaa3fec3b1132ce63b76cda3fbccd63 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 06:16:28 +0800 Subject: [PATCH 150/247] Circular progress and dropzone dark theme fixes. --- .../client/circularprogress/MaterialCircularProgress.java | 4 +--- .../client/fileuploader/resources/css/dropzone-dark.css | 8 ++++++++ .../fileuploader/resources/css/dropzone-dark.min.css | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/circularprogress/MaterialCircularProgress.java b/src/main/java/gwt/material/design/addins/client/circularprogress/MaterialCircularProgress.java index 584bef4ea..7306c1b2a 100644 --- a/src/main/java/gwt/material/design/addins/client/circularprogress/MaterialCircularProgress.java +++ b/src/main/java/gwt/material/design/addins/client/circularprogress/MaterialCircularProgress.java @@ -92,11 +92,8 @@ public MaterialCircularProgress() { protected void onLoad() { super.onLoad(); - - label.setSize(getSize(), isResponsive()); add(label); - $(getElement()).on(CircularProgressEvents.PROGRESS, (e, progress, step) -> { ProgressEvent.fire(this, (double) progress, (double) step); return true; @@ -116,6 +113,7 @@ protected void onLoad() { @Override public void load() { + label.setSize(getSize(), isResponsive()); Scheduler.get().scheduleDeferred(() -> $(getElement()).circleProgress(options)); } diff --git a/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css index b6a659ffb..567af569c 100644 --- a/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css +++ b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.css @@ -33,4 +33,12 @@ .preview-container .previews .zdrop-info .preview-icon { background: #393939; +} + +.preview-container .previews .collection-item { + border-bottom: 1px solid #393939; +} + +.preview-container .previews .zdrop-info .preview-icon { + color: #ffffff !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css index f440955e8..69b073c24 100644 --- a/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css +++ b/src/main/resources/gwt/material/design/addins/client/fileuploader/resources/css/dropzone-dark.min.css @@ -1 +1 @@ -.fileuploader{background:#1e1e1e}.fileuploader .upload-label{background-color:#292929!important}.fileuploader .upload-label i{background:#fff!important;color:#1e1e1e!important}.fileuploader.active{background:#1e1e1e!important}.fileuploader.active .upload-label{color:#fff!important}.preview-container{background-color:#1e1e1e}.preview-container .previews .zdrop-info .preview-icon{color:#1e1e1e!important}.preview-container .header{background-color:#1e1e1e!important}.preview-container .previews .zdrop-info .preview-icon{background:#393939} \ No newline at end of file +.fileuploader{background:#1e1e1e}.fileuploader .upload-label{background-color:#292929!important}.fileuploader .upload-label i{background:#fff!important;color:#1e1e1e!important}.fileuploader.active{background:#1e1e1e!important}.fileuploader.active .upload-label{color:#fff!important}.preview-container{background-color:#1e1e1e}.preview-container .previews .zdrop-info .preview-icon{color:#1e1e1e!important}.preview-container .header{background-color:#1e1e1e!important}.preview-container .previews .zdrop-info .preview-icon{background:#393939}.preview-container .previews .collection-item{border-bottom:1px solid #393939}.preview-container .previews .zdrop-info .preview-icon{color:#fff!important} \ No newline at end of file From 226053fb6c58280bca1bd7bf4273d293eda89d4a Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 09:17:15 +0800 Subject: [PATCH 151/247] menu bar fixes --- .../client/menubar/resources/css/menubar.css | 25 +++++++++---------- .../menubar/resources/css/menubar.min.css | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css index 5a3e22260..5a7098fd8 100644 --- a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css +++ b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.css @@ -4,21 +4,25 @@ width: 280px !important; padding: 16px 0px; } -.menu-bar ul.dropdown-content .dropdown-content{ + +.menu-bar ul.dropdown-content .dropdown-content { position: relative !important; margin-top: 0px; left: 280px !important; top: -48px !important; } + .menu-bar .dropdown-content li { display: inline-block; min-height: 0px; line-height: 0px; max-height: 32px; } + .menu-bar li { height: 40px; } + .menu-bar .dropdown-content li > a, .menu-bar .dropdown-content li > span { font-size: 1em !important; min-height: 0px; @@ -27,23 +31,18 @@ padding: 8px 24px; display: inline-block; } + /** Supports checkbox on dropdown **/ -.menu-bar ul.dropdown-content [type="checkbox"] + label{ - font-size: 12px; -} -.menu-bar ul.dropdown-content [type="checkbox"] + label:before { - border: 2px solid rgba(90, 90, 90, 0); -} -.menu-bar ul.dropdown-content [type="checkbox"]:checked + label:before { - border: 2px solid transparent; - border-right-color: rgba(0, 0, 0, 0.6); - border-bottom-color: rgba(0, 0, 0, 0.6); +ul.dropdown-content li > div.checkbox { + padding: 6px 0px 0px 1rem; } + .menu-bar ul.dropdown-content li > span.gwt-CheckBox { line-height: 0; padding: 4px 4px 4px 12px; } -.menu-bar ul.dropdown-content [type="checkbox"] + label{ + +.menu-bar ul.dropdown-content [type="checkbox"] + label { height: initial; color: #000; width: 100%; @@ -55,7 +54,7 @@ } @media only screen and (max-width: 992px) { - .menu-bar ul.dropdown-content, .menu-bar ul.dropdown-content ul.dropdown-content{ + .menu-bar ul.dropdown-content, .menu-bar ul.dropdown-content ul.dropdown-content { left: 0 !important; width: 100% !important; } diff --git a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css index 6e60411c7..efcf53dcd 100644 --- a/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css +++ b/src/main/resources/gwt/material/design/addins/client/menubar/resources/css/menubar.min.css @@ -1 +1 @@ -.menu-bar ul.dropdown-content{overflow:visible!important;width:280px!important;padding:16px 0}.menu-bar ul.dropdown-content .dropdown-content{position:relative!important;margin-top:0;left:280px!important;top:-48px!important}.menu-bar .dropdown-content li{display:inline-block;min-height:0;line-height:0;max-height:32px}.menu-bar li{height:40px}.menu-bar .dropdown-content li>a,.menu-bar .dropdown-content li>span{font-size:1em!important;min-height:0;line-height:16px;color:#000;padding:8px 24px;display:inline-block}.menu-bar ul.dropdown-content [type=checkbox]+label{font-size:12px;height:initial;color:#000;width:100%}.menu-bar ul.dropdown-content [type=checkbox]+label:before{border:2px solid rgba(90,90,90,0)}.menu-bar ul.dropdown-content [type=checkbox]:checked+label:before{border:2px solid transparent;border-right-color:rgba(0,0,0,.6);border-bottom-color:rgba(0,0,0,.6)}.menu-bar ul.dropdown-content li>span.gwt-CheckBox{line-height:0;padding:4px 4px 4px 12px}.menu-bar ul li img{width:20px!important;height:20px!important}@media only screen and (max-width:992px){.menu-bar ul.dropdown-content,.menu-bar ul.dropdown-content ul.dropdown-content{left:0!important;width:100%!important}} \ No newline at end of file +.menu-bar ul.dropdown-content{overflow:visible!important;width:280px!important;padding:16px 0}.menu-bar ul.dropdown-content .dropdown-content{position:relative!important;margin-top:0;left:280px!important;top:-48px!important}.menu-bar .dropdown-content li{display:inline-block;min-height:0;line-height:0;max-height:32px}.menu-bar li{height:40px}.menu-bar .dropdown-content li>a,.menu-bar .dropdown-content li>span{font-size:1em!important;min-height:0;line-height:16px;color:#000;padding:8px 24px;display:inline-block}ul.dropdown-content li>div.checkbox{padding:6px 0 0 1rem}.menu-bar ul.dropdown-content li>span.gwt-CheckBox{line-height:0;padding:4px 4px 4px 12px}.menu-bar ul.dropdown-content [type=checkbox]+label{height:initial;color:#000;width:100%}.menu-bar ul li img{width:20px!important;height:20px!important}@media only screen and (max-width:992px){.menu-bar ul.dropdown-content,.menu-bar ul.dropdown-content ul.dropdown-content{left:0!important;width:100%!important}} \ No newline at end of file From af42867c8b8fb70e601504122b63a7220712d4e5 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 09:32:46 +0800 Subject: [PATCH 152/247] Stepper replaced feedback text with loading message. --- .../client/stepper/MaterialStepper.java | 25 ++++++------------- .../client/stepper/resources/css/stepper.css | 5 +++- .../stepper/resources/css/stepper.min.css | 2 +- .../addins/client/ui/MaterialStepperTest.java | 3 --- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index d86dca6de..75ec862f6 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -7,9 +7,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,7 +24,6 @@ import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; @@ -53,10 +52,8 @@ import gwt.material.design.client.constants.StatusDisplayType; import gwt.material.design.client.js.Window; import gwt.material.design.client.ui.MaterialLoader; -import gwt.material.design.client.ui.animate.MaterialAnimation; import gwt.material.design.client.ui.animate.Transition; import gwt.material.design.client.ui.html.Div; -import gwt.material.design.client.ui.html.Span; //@formatter:off @@ -90,7 +87,7 @@ */ // @formatter:on public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatusText, SelectionHandler, - HasSelectionChangedHandlers, HasStepsHandler, HasStepperTransition { + HasSelectionChangedHandlers, HasStepsHandler, HasStepperTransition { static { if (MaterialAddins.isDebug()) { @@ -105,8 +102,8 @@ public class MaterialStepper extends MaterialWidget implements HasAxis, HasStatu private boolean stepSkippingAllowed = true; private boolean fixedStepWidth = false; private boolean detectOrientation = true; + private String feedback = ""; private Div divFeedback = new Div(); - private Span feedbackSpan = new Span(); private HandlerRegistration orientationHandler; private MaterialLoader loader = new MaterialLoader(); private ToggleStyleMixin toggleFixedStepWidth; @@ -117,7 +114,6 @@ public MaterialStepper() { super(Document.get().createDivElement(), AddinsCssName.STEPPER); divFeedback.setStyleName(AddinsCssName.FEEDBACK); - divFeedback.add(feedbackSpan); } @Override @@ -475,16 +471,15 @@ public void setStatusDisplayPosition(Position position) { * Get feedback message. */ public String getFeedback() { - return SafeHtmlUtils.fromString(feedbackSpan.getElement().getInnerHTML()).asString(); + return feedback; } /** * Show feedback message and circular loader on body container */ - public void showFeedback(String feedbackText) { - feedbackSpan.setText(feedbackText); - new MaterialAnimation().transition(Transition.FADEINUP).duration(400).animate(feedbackSpan); - loader.setMessage(feedbackText); + public void showFeedback(String feedback) { + this.feedback = feedback; + loader.setMessage(feedback); loader.setContainer(divFeedback); loader.show(); add(divFeedback); @@ -524,10 +519,6 @@ public void setFixedStepWidth(boolean fixedStepWidth) { getToggleFixedStepWidth().setOn(fixedStepWidth); } - public Span getFeedbackSpan() { - return feedbackSpan; - } - /** * Called when a step title is clicked. */ diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css index 3ac1dd79d..cbde6bfd3 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.css @@ -191,7 +191,6 @@ left: 0; font-size: 1.1em; top: 0; - background: #fff; width: 100%; height: 100%; padding: 36px @@ -203,6 +202,10 @@ } /** Vertical Stepper **/ +.stepper.vertical { + position: relative; +} + .stepper.vertical .step { width: 100% !important; } diff --git a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css index 0964850db..de71f12cb 100644 --- a/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css +++ b/src/main/resources/gwt/material/design/addins/client/stepper/resources/css/stepper.min.css @@ -1 +1 @@ -.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#f6f6f6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:1px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#fff;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-12px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#c9c9c9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute;left:0;font-size:1.1em;top:0;background:#fff;width:100%;height:100%;padding:36px}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file +.stepper .step{position:relative;min-height:32px;padding:12px;cursor:pointer}.stepper.horizontal .step{min-width:240px}.stepper.horizontal.fixed-step-width .step{min-width:unset}.stepper .step:hover,.stepper.horizontal .step:hover .step-header{background:#f6f6f6}.stepper .step>div:first-child{position:static;height:0}.stepper .step>div:last-child{margin-left:32px;padding-left:16px;min-height:24px}.stepper .step>div:first-child .circle{background:#4285f4;width:32px;height:32px;line-height:32px;border-radius:16px;position:relative;color:#fff;text-align:center}.stepper .line{position:absolute;border-left:2px solid #dcdcdc;left:28px;bottom:0;top:56px;z-index:1}.stepper .step:last-child .line{display:none!important}.stepper .title{line-height:32px;font-weight:500;margin-left:0}.stepper .body{opacity:1;padding:20px}.stepper .description{line-height:1.2;font-size:1em;padding-bottom:24px;color:#989898}.stepper.horizontal{line-height:0;position:relative;min-height:600px}.stepper.horizontal .step{display:inline-block;height:72px;padding-top:20px;position:initial}.stepper.horizontal .step .line,.stepper.horizontal .step .title,.stepper.horizontal .step>div:first-child .circle{display:inline-block}.stepper.horizontal .step .step-header{display:inherit;height:40px;max-width:80%;background:#fff;z-index:1;position:relative;padding-right:20px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stepper.horizontal .step .line{border-left:0;height:2px;position:inherit;border-top:2px solid #dcdcdc;width:100%;float:right;margin-top:-24px}.stepper.horizontal .step .title{margin-left:8px}.stepper.horizontal .step .description{margin-left:40px;font-size:.8em;margin-top:-8px}.stepper.horizontal .step .body{line-height:initial}.stepper.horizontal .step>div:last-child{position:absolute;width:100%;top:93px;padding-left:0;margin:auto;left:0}.stepper .step.inactive .title{color:#c9c9c9;font-weight:400}.stepper .step.inactive .body{opacity:0;transition:.6s all;-webkit-transition:.6s all;max-height:0;z-index:-1;position:relative;display:none}.stepper .step.active .body{opacity:1;transition-delay:.3s;-webkit-transition-delay:.3s;max-height:1400px;padding-bottom:28px;padding-top:8px;z-index:1!important;display:block!important}.stepper .step.inactive>div:first-child .circle{background-color:#9e9e9e!important}.stepper .step>div:first-child i{font-size:36px;vertical-align:middle}.stepper .step.success .description,.stepper .step.success .title,.stepper .step.success>div:first-child i{color:#2196f3}.stepper .step.error .description,.stepper .step.error .title,.stepper .step.error>div:first-child i{color:#f44336}.stepper .step.error>div:first-child .description,.stepper .step.success>div:first-child .description{margin-left:44px}.stepper .step.error .title,.stepper .step.success .title{font-weight:600}.feedback{position:absolute!important;left:0;font-size:1.1em;top:0;width:100%;height:100%;padding:36px}.feedback .loader-wrapper{background-color:#dfdfdf!important}.stepper.vertical{position:relative}.stepper.vertical .step{width:100%!important}.stepper.vertical .step.active .body{padding-bottom:0;padding-right:20px} \ No newline at end of file diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java index d35549552..b36ea48d4 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java @@ -268,10 +268,7 @@ protected void checkFeedback(MaterialStepper stepper) { assertEquals(FEEDBACK, stepper.getFeedback()); MaterialWidget feedback = (MaterialWidget) stepper.getWidget(FEEDBACK_INDEX); assertTrue(feedback.getWidget(0) instanceof Span); - assertEquals(feedback.getWidget(0), stepper.getFeedbackSpan()); - assertEquals(FEEDBACK, stepper.getFeedbackSpan().getText()); stepper.hideFeedback(); assertFalse(feedback.isAttached()); - assertFalse(stepper.getFeedbackSpan().isAttached()); } } From 03ba8150b582c1533561a0412316b325be8486f9 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 09:56:20 +0800 Subject: [PATCH 153/247] Incubator Dark Theme - Progress Line Bar --- .../client/dark/IncubatorDarkThemeLoader.java | 30 +++++++++++++++++++ .../dark/IncubatorDarkThemeReloader.java | 27 +++++++++++++++++ .../client/progress/ProgressLineBar.java | 9 ++++-- .../progress/ProgressLineBarClientBundle.java | 3 ++ .../progress/ProgressLineBarDarkTheme.java | 11 +++++++ .../ProgressLineBarDebugClientBundle.java | 3 ++ .../resources/css/progress-line-bar-dark.css | 8 +++++ .../css/progress-line-bar-dark.min.css | 1 + 8 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java create mode 100644 src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java create mode 100644 src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java new file mode 100644 index 000000000..8a8e9ae7e --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -0,0 +1,30 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2019 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.dark; + +import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; + +public class IncubatorDarkThemeLoader extends DarkThemeLoader { + + public IncubatorDarkThemeLoader() { + super(new ProgressLineBarDarkTheme()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java new file mode 100644 index 000000000..d4f774658 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java @@ -0,0 +1,27 @@ +package gwt.material.design.incubator.client.dark; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.client.theme.dark.DarkThemeManager; + +public class IncubatorDarkThemeReloader { + + static IncubatorDarkThemeReloader instance; + + public void reload(Class widgetLoader) { + DarkThemeLoader addinsLoader = DarkThemeManager.get().getLoader(IncubatorDarkThemeLoader.class); + if (addinsLoader != null) { + DarkThemeLoader child = addinsLoader.getChild(widgetLoader); + if (child != null && child instanceof AddinsWidgetDarkTheme) { + ((AddinsWidgetDarkTheme) child).suppressReload(); + } + } + } + + public static IncubatorDarkThemeReloader get() { + if (instance == null) { + instance = new IncubatorDarkThemeReloader(); + } + return instance; + } +} \ No newline at end of file diff --git a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java index 02055b7d7..bb8cf9a6c 100644 --- a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java +++ b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java @@ -7,9 +7,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. @@ -25,6 +25,7 @@ import gwt.material.design.client.base.MaterialWidget; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import java.util.HashMap; import java.util.List; @@ -36,7 +37,7 @@ * current progress is. * *

- * Note: This component is under the incubation process and subject to change. + * Note: This component is under the incubation process and subject to change. *

* * @author kevzlou7979 @@ -76,6 +77,8 @@ protected void onLoad() { item.setActive(true); } } + + IncubatorDarkThemeReloader.get().reload(ProgressLineBarDarkTheme.class); } public void addOption(T option) { diff --git a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarClientBundle.java b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarClientBundle.java index 8f3e13ebb..4d4e6c613 100644 --- a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarClientBundle.java @@ -28,4 +28,7 @@ public interface ProgressLineBarClientBundle extends ClientBundle { @Source("resources/css/progress-line-bar.min.css") TextResource progressLineBarCss(); + + @Source("resources/css/progress-line-bar-dark.min.css") + TextResource progressLineBarDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java new file mode 100644 index 000000000..98c65dddf --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.incubator.client.progress; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; + +public class ProgressLineBarDarkTheme extends AddinsWidgetDarkTheme { + + public ProgressLineBarDarkTheme() { + super(AddinsIncubator.isDebug() ? ProgressLineBarDebugClientBundle.INSTANCE.progressLineBarDarkCss() : ProgressLineBarClientBundle.INSTANCE.progressLineBarDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDebugClientBundle.java index 5052cbc60..1b4fec921 100644 --- a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDebugClientBundle.java @@ -28,4 +28,7 @@ public interface ProgressLineBarDebugClientBundle extends ClientBundle { @Source("resources/css/progress-line-bar.css") TextResource progressLineBarDebugCss(); + + @Source("resources/css/progress-line-bar-dark.css") + TextResource progressLineBarDarkCss(); } diff --git a/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css new file mode 100644 index 000000000..ac376e42a --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css @@ -0,0 +1,8 @@ +.progress-line-bar .progress-item.active { + background: #bb86fc; +} + +.progress-item { + border-right: 1px solid #292929; + background: #3e3e3e; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css new file mode 100644 index 000000000..8898b5cb9 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css @@ -0,0 +1 @@ +.progress-line-bar .progress-item.active{background:#bb86fc}.progress-item{border-right:1px solid #292929;background:#3e3e3e} \ No newline at end of file From a6946a832709f2e1f443469d6860870946c6fc40 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 10:39:11 +0800 Subject: [PATCH 154/247] Group toggle button dark theme support. --- .../client/dark/IncubatorDarkThemeLoader.java | 4 +++- .../dark/IncubatorDarkThemeReloader.java | 6 +++--- .../client/toggle/GroupToggleButton.java | 8 +++++--- .../toggle/GroupToggleButtonClientBundle.java | 3 +++ .../GroupToggleButtonDebugClientBundle.java | 3 +++ .../client/toggle/GroupToggleDarkTheme.java | 13 +++++++++++++ .../resources/css/progress-line-bar-dark.css | 6 +++--- .../css/progress-line-bar-dark.min.css | 2 +- .../css/group-toggle-button-dark.css | 19 +++++++++++++++++++ .../css/group-toggle-button-dark.min.css | 1 + 10 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index 8a8e9ae7e..eda2a110f 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -21,10 +21,12 @@ import gwt.material.design.client.theme.dark.DarkThemeLoader; import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; +import gwt.material.design.incubator.client.toggle.GroupToggleDarkTheme; public class IncubatorDarkThemeLoader extends DarkThemeLoader { public IncubatorDarkThemeLoader() { - super(new ProgressLineBarDarkTheme()); + super(new GroupToggleDarkTheme(), + new ProgressLineBarDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java index d4f774658..3b4b0c4c5 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java @@ -9,9 +9,9 @@ public class IncubatorDarkThemeReloader { static IncubatorDarkThemeReloader instance; public void reload(Class widgetLoader) { - DarkThemeLoader addinsLoader = DarkThemeManager.get().getLoader(IncubatorDarkThemeLoader.class); - if (addinsLoader != null) { - DarkThemeLoader child = addinsLoader.getChild(widgetLoader); + DarkThemeLoader incubatorLoader = DarkThemeManager.get().getLoader(IncubatorDarkThemeLoader.class); + if (incubatorLoader != null) { + DarkThemeLoader child = incubatorLoader.getChild(widgetLoader); if (child != null && child instanceof AddinsWidgetDarkTheme) { ((AddinsWidgetDarkTheme) child).suppressReload(); } diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java index f5d260c49..64f8b5e1b 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButton.java @@ -36,6 +36,8 @@ import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeLoader; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import java.util.ArrayList; import java.util.Arrays; @@ -93,12 +95,12 @@ public GroupToggleButton() { protected void onLoad() { super.onLoad(); - registerHandler(addSelectionHandler(selectionEvent -> { - ValueChangeEvent.fire(GroupToggleButton.this, getValue()); - })); add(label); add(wrapper); add(errorLabel); + + registerHandler(addSelectionHandler(selectionEvent -> ValueChangeEvent.fire(GroupToggleButton.this, getValue()))); + IncubatorDarkThemeReloader.get().reload(GroupToggleDarkTheme.class); } public ToggleButton addItem(String text) { diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonClientBundle.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonClientBundle.java index ea7a02215..443f0f137 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonClientBundle.java @@ -33,4 +33,7 @@ public interface GroupToggleButtonClientBundle extends ClientBundle { @Source("resources/css/group-toggle-button.min.css") TextResource groupToggleButtonCss(); + + @Source("resources/css/group-toggle-button-dark.min.css") + TextResource groupToggleButtonDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonDebugClientBundle.java index a78eb194d..94b17e475 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleButtonDebugClientBundle.java @@ -33,4 +33,7 @@ public interface GroupToggleButtonDebugClientBundle extends ClientBundle { @Source("resources/css/group-toggle-button.css") TextResource groupToggleDebugCss(); + + @Source("resources/css/group-toggle-button-dark.css") + TextResource groupToggleDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java new file mode 100644 index 000000000..6d0462a96 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java @@ -0,0 +1,13 @@ +package gwt.material.design.incubator.client.toggle; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.progress.ProgressLineBarClientBundle; +import gwt.material.design.incubator.client.progress.ProgressLineBarDebugClientBundle; + +public class GroupToggleDarkTheme extends AddinsWidgetDarkTheme { + + public GroupToggleDarkTheme() { + super(AddinsIncubator.isDebug() ? GroupToggleButtonDebugClientBundle.INSTANCE.groupToggleDarkCss() : GroupToggleButtonClientBundle.INSTANCE.groupToggleButtonDarkCss()); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css index ac376e42a..d3d02de6b 100644 --- a/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css +++ b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.css @@ -1,8 +1,8 @@ .progress-line-bar .progress-item.active { - background: #bb86fc; + background: #bb86fc !important; } .progress-item { - border-right: 1px solid #292929; - background: #3e3e3e; + border-right: 1px solid #292929 !important; + background: #3e3e3e !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css index 8898b5cb9..3770740a6 100644 --- a/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/progress/resources/css/progress-line-bar-dark.min.css @@ -1 +1 @@ -.progress-line-bar .progress-item.active{background:#bb86fc}.progress-item{border-right:1px solid #292929;background:#3e3e3e} \ No newline at end of file +.progress-line-bar .progress-item.active{background:#bb86fc!important}.progress-item{border-right:1px solid #292929!important;background:#3e3e3e!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.css b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.css new file mode 100644 index 000000000..4f7095960 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.css @@ -0,0 +1,19 @@ +.group-toggle-button .wrapper { + background: #424242; +} + +.group-toggle-button .wrapper button.active, +.group-toggle-button .wrapper button:not(.active):hover{ + background: #bb86fc; + color: #1e1e1e; +} + +.group-toggle-button .wrapper button:not(.active):hover { + background-color: #525252; +} + +.group-toggle-button .wrapper button { + color: #8e8e8e; + background-color: #424242; + border-right: 1px solid #292929; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.min.css new file mode 100644 index 000000000..c52b62099 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/toggle/resources/css/group-toggle-button-dark.min.css @@ -0,0 +1 @@ +.group-toggle-button .wrapper{background:#424242}.group-toggle-button .wrapper button.active,.group-toggle-button .wrapper button:not(.active):hover{background:#bb86fc;color:#1e1e1e}.group-toggle-button .wrapper button:not(.active):hover{background-color:#525252}.group-toggle-button .wrapper button{color:#8e8e8e;background-color:#424242;border-right:1px solid #292929} \ No newline at end of file From 3e0c6956f3db7344a02f46709b6d70ac7465de1e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 12:31:47 +0800 Subject: [PATCH 155/247] Content Placeholder dark theme --- .../client/dark/IncubatorDarkThemeLoader.java | 2 ++ .../placeholder/PlaceholderClientBundle.java | 3 +++ .../placeholder/PlaceholderDarkTheme.java | 13 ++++++++++++ .../PlaceholderDebugClientBundle.java | 3 +++ .../client/placeholder/PlaceholderItem.java | 8 +++++++ .../css/content-placeholder-dark.css | 21 +++++++++++++++++++ .../css/content-placeholder-dark.min.css | 1 + 7 files changed, 51 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index eda2a110f..9511475d2 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -20,6 +20,7 @@ package gwt.material.design.incubator.client.dark; import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.incubator.client.placeholder.PlaceholderDarkTheme; import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; import gwt.material.design.incubator.client.toggle.GroupToggleDarkTheme; @@ -27,6 +28,7 @@ public class IncubatorDarkThemeLoader extends DarkThemeLoader { public IncubatorDarkThemeLoader() { super(new GroupToggleDarkTheme(), + new PlaceholderDarkTheme(), new ProgressLineBarDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java index ac8126c0b..600c997d2 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderClientBundle.java @@ -28,4 +28,7 @@ public interface PlaceholderClientBundle extends ClientBundle { @Source("resources/css/content-placeholder.min.css") TextResource contentPlaceholderCss(); + + @Source("resources/css/content-placeholder-dark.min.css") + TextResource contentPlaceholderDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java new file mode 100644 index 000000000..63d392c81 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java @@ -0,0 +1,13 @@ +package gwt.material.design.incubator.client.placeholder; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.progress.ProgressLineBarClientBundle; +import gwt.material.design.incubator.client.progress.ProgressLineBarDebugClientBundle; + +public class PlaceholderDarkTheme extends AddinsWidgetDarkTheme { + + public PlaceholderDarkTheme() { + super(AddinsIncubator.isDebug() ? PlaceholderDebugClientBundle.INSTANCE.contentPlaceholderDarkCss() : PlaceholderClientBundle.INSTANCE.contentPlaceholderDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java index e3c63c337..b2bde9c30 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDebugClientBundle.java @@ -28,4 +28,7 @@ public interface PlaceholderDebugClientBundle extends ClientBundle { @Source("resources/css/content-placeholder.css") TextResource contentPlaceholder(); + + @Source("resources/css/content-placeholder-dark.css") + TextResource contentPlaceholderDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java index 40e678519..6d87df6c1 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderItem.java @@ -25,6 +25,7 @@ import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import gwt.material.design.incubator.client.loadingstate.LoadingStatePanel; public class PlaceholderItem extends MaterialWidget { @@ -41,4 +42,11 @@ public class PlaceholderItem extends MaterialWidget { public PlaceholderItem() { super(Document.get().createDivElement(), IncubatorCssName.CONTENT_PLACEHOLDER); } + + @Override + protected void onLoad() { + super.onLoad(); + + IncubatorDarkThemeReloader.get().reload(PlaceholderDarkTheme.class); + } } diff --git a/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.css b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.css new file mode 100644 index 000000000..433e13926 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.css @@ -0,0 +1,21 @@ +.content-placeholder { + display: inline-block; + width: 100%; + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: forwards; + animation-fill-mode: forwards; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-name: placeHolderShimmer; + animation-name: placeHolderShimmer; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + background: -webkit-gradient(linear, left top, right top, color-stop(8%, #454545), color-stop(18%, #555555), color-stop(33%, #444444)); + background: -webkit-linear-gradient(left, #454545 8%, #555555 18%, #444444 33%); + background: linear-gradient(to right, #454545 8%, #555555 18%, #444444 33%); + -webkit-background-size: 800px 104px; + background-size: 800px 104px; + height: inherit; + position: relative; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.min.css new file mode 100644 index 000000000..ec883c5db --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/placeholder/resources/css/content-placeholder-dark.min.css @@ -0,0 +1 @@ +.content-placeholder{display:inline-block;width:100%;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:placeHolderShimmer;animation-name:placeHolderShimmer;-webkit-animation-timing-function:linear;animation-timing-function:linear;background:-webkit-gradient(linear,left top,right top,color-stop(8%,#454545),color-stop(18%,#555),color-stop(33%,#444));background:-webkit-linear-gradient(left,#454545 8%,#555 18%,#444 33%);background:linear-gradient(to right,#454545 8%,#555 18%,#444 33%);-webkit-background-size:800px 104px;background-size:800px 104px;height:inherit;position:relative} \ No newline at end of file From acec96b1bf03022ac4ea38f7af2c2d54377b5a0a Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 15:02:50 +0800 Subject: [PATCH 156/247] TagLabel support dark mode. --- .../client/dark/IncubatorDarkThemeLoader.java | 4 +- .../incubator/client/tag/TagClientBundle.java | 3 ++ .../client/tag/TagDebugClientBundle.java | 3 ++ .../design/incubator/client/tag/TagLabel.java | 8 ++++ .../client/tag/TagLabelDarkTheme.java | 13 +++++++ .../client/tag/resources/css/tag-dark.css | 12 ++++++ .../client/tag/resources/css/tag-dark.min.css | 0 .../client/tag/resources/css/tag.css | 37 +++++++++++++++++-- .../client/tag/resources/css/tag.min.css | 2 +- 9 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index 9511475d2..9ff396801 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -22,6 +22,7 @@ import gwt.material.design.client.theme.dark.DarkThemeLoader; import gwt.material.design.incubator.client.placeholder.PlaceholderDarkTheme; import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; +import gwt.material.design.incubator.client.tag.TagLabelDarkTheme; import gwt.material.design.incubator.client.toggle.GroupToggleDarkTheme; public class IncubatorDarkThemeLoader extends DarkThemeLoader { @@ -29,6 +30,7 @@ public class IncubatorDarkThemeLoader extends DarkThemeLoader { public IncubatorDarkThemeLoader() { super(new GroupToggleDarkTheme(), new PlaceholderDarkTheme(), - new ProgressLineBarDarkTheme()); + new ProgressLineBarDarkTheme(), + new TagLabelDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java b/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java index 0933e09b1..96a078804 100644 --- a/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagClientBundle.java @@ -28,4 +28,7 @@ public interface TagClientBundle extends ClientBundle { @Source("resources/css/tag.min.css") TextResource tagCss(); + + @Source("resources/css/tag-dark.min.css") + TextResource tagDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java index 382b95d89..db75c858c 100644 --- a/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagDebugClientBundle.java @@ -28,4 +28,7 @@ public interface TagDebugClientBundle extends ClientBundle { @Source("resources/css/tag.css") TextResource tagDebugCss(); + + @Source("resources/css/tag-dark.css") + TextResource tagDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java b/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java index 1f4060496..f394a751d 100644 --- a/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagLabel.java @@ -25,6 +25,7 @@ import gwt.material.design.client.constants.Size; import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; public class TagLabel extends MaterialLabel implements HasSize { @@ -46,6 +47,13 @@ public TagLabel() { setPosition(TagPosition.LEFT); } + @Override + protected void onLoad() { + super.onLoad(); + + IncubatorDarkThemeReloader.get().reload(TagLabelDarkTheme.class); + } + @Override public void setSize(Size size) { getSizeMixin().setStyle(size.getCssName()); diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java new file mode 100644 index 000000000..c9d301bf1 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java @@ -0,0 +1,13 @@ +package gwt.material.design.incubator.client.tag; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.progress.ProgressLineBarClientBundle; +import gwt.material.design.incubator.client.progress.ProgressLineBarDebugClientBundle; + +public class TagLabelDarkTheme extends AddinsWidgetDarkTheme { + + public TagLabelDarkTheme() { + super(AddinsIncubator.isDebug() ? TagDebugClientBundle.INSTANCE.tagDarkCss() : TagClientBundle.INSTANCE.tagDarkCss()); + } +} diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.css new file mode 100644 index 000000000..75adc1eed --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.css @@ -0,0 +1,12 @@ +.tag-label { + background: #2f2f2f; + color: #ffffff; +} + +.tag-label.arrow-left:before { + border-color: transparent #2f2f2f transparent +} + +.tag-label.arrow-right:after { + border-color: transparent transparent transparent #2f2f2f !important; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag-dark.min.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css index c12ccbd06..88462d753 100644 --- a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.css @@ -94,13 +94,20 @@ .tag-label.arrow-left.medium:before { border-width: 16px 16px 16px 0; - left: -15px; + left: -16px; +} + +.tag-label.arrow-left.medium:after { + top: 12px; + width: 6px; + height: 6px; + border-radius: 3px; } /** Right - Medium **/ .tag-label.arrow-right.medium:after { border-width: 16px 0px 16px 16px !important; - right: -15px; + right: -16px; } .tag-label.arrow-right.medium:before { @@ -111,8 +118,32 @@ } /** Left - Large **/ - .tag-label.large { height: 40px; line-height: 40px; +} + +.tag-label.arrow-left.large:before { + border-width: 20px 20px 20px 0; + left: -20px; +} + +.tag-label.arrow-left.large:after { + top: 16px; + width: 6px; + height: 6px; + border-radius: 3px; +} + +/** Right Large **/ +.tag-label.arrow-right.large:after { + border-width: 20px 0px 20px 20px !important; + right: -20px; +} + +.tag-label.arrow-right.large:before { + top: 16px; + width: 6px; + height: 6px; + border-radius: 3px; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css index 0bb0f4622..3d020797c 100644 --- a/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/tag/resources/css/tag.min.css @@ -1 +1 @@ -.tag-label:first-child{margin-left:12px}.tag-label{padding:0 10px 0 12px;background:#ebebeb;color:#6c6c6c;text-decoration:none;float:left;height:24px;line-height:24px;position:relative;font-size:.9em;margin-bottom:12px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.tag-label.arrow-left{margin-left:20px}.tag-label:after,.tag-label:before{content:"";position:absolute}.tag-label.arrow-left:before{float:left;top:0;left:-12px;width:0;height:0;border-color:transparent #ebebeb transparent transparent;border-width:12px 12px 12px 0;border-style:solid}.tag-label.arrow-left:after{top:10px;left:0;float:left;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb}.tag-label.arrow-right{margin-right:20px;border-radius:0}.tag-label.arrow-right:before{top:10px;right:0;float:right;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb}.tag-label.arrow-right:after{border-width:12px 0 12px 12px!important;border-color:transparent transparent transparent #ebebeb!important;right:-12px;border-style:solid}.tag-label.medium{height:32px;line-height:32px}.tag-label.arrow-left.medium:before{border-width:16px 16px 16px 0;left:-15px}.tag-label.arrow-right.medium:after{border-width:16px 0 16px 16px!important;right:-15px}.tag-label.arrow-right.medium:before{top:12px;width:6px;height:6px;border-radius:3px}.tag-label.large{height:40px;line-height:40px} \ No newline at end of file +.tag-label:first-child{margin-left:12px}.tag-label{padding:0 10px 0 12px;background:#ebebeb;color:#6c6c6c;text-decoration:none;float:left;height:24px;line-height:24px;position:relative;font-size:.9em;margin-bottom:12px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.tag-label.arrow-left{margin-left:20px}.tag-label:after,.tag-label:before{content:"";position:absolute}.tag-label.arrow-left:before{float:left;top:0;left:-12px;width:0;height:0;border-color:transparent #ebebeb transparent transparent;border-width:12px 12px 12px 0;border-style:solid}.tag-label.arrow-left:after{top:10px;left:0;float:left;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb}.tag-label.arrow-right{margin-right:20px;border-radius:0}.tag-label.arrow-right:before{top:10px;right:0;float:right;width:4px;height:4px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#fff;-moz-box-shadow:-1px -1px 2px #ebebeb;-webkit-box-shadow:-1px -1px 2px #ebebeb;box-shadow:-1px -1px 2px #ebebeb}.tag-label.arrow-right:after{border-width:12px 0 12px 12px!important;border-color:transparent transparent transparent #ebebeb!important;right:-12px;border-style:solid}.tag-label.medium{height:32px;line-height:32px}.tag-label.arrow-left.medium:before{border-width:16px 16px 16px 0;left:-16px}.tag-label.arrow-left.medium:after{top:12px;width:6px;height:6px;border-radius:3px}.tag-label.arrow-right.medium:after{border-width:16px 0 16px 16px!important;right:-16px}.tag-label.arrow-right.medium:before{top:12px;width:6px;height:6px;border-radius:3px}.tag-label.large{height:40px;line-height:40px}.tag-label.arrow-left.large:before{border-width:20px 20px 20px 0;left:-20px}.tag-label.arrow-left.large:after{top:16px;width:6px;height:6px;border-radius:3px}.tag-label.arrow-right.large:after{border-width:20px 0 20px 20px!important;right:-20px}.tag-label.arrow-right.large:before{top:16px;width:6px;height:6px;border-radius:3px} \ No newline at end of file From ee72d9927c6453fed993f4ea247c1aa0b02e2473 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 15:30:43 +0800 Subject: [PATCH 157/247] Address Lookup dark theme support --- .../client/dark/IncubatorDarkThemeLoader.java | 4 +- .../google/addresslookup/AddressLookup.java | 9 +++++ .../AddressLookupClientBundle.java | 39 +++++++++++++++++++ .../addresslookup/AddressLookupDarkTheme.java | 11 ++++++ .../AddressLookupDebugClientBundle.java | 39 +++++++++++++++++++ .../resources/css/address-lookup-dark.css | 18 +++++++++ .../resources/css/address-lookup-dark.min.css | 1 + 7 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupClientBundle.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java create mode 100644 src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDebugClientBundle.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index 9ff396801..782122791 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -20,6 +20,7 @@ package gwt.material.design.incubator.client.dark; import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.incubator.client.google.addresslookup.AddressLookupDarkTheme; import gwt.material.design.incubator.client.placeholder.PlaceholderDarkTheme; import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; import gwt.material.design.incubator.client.tag.TagLabelDarkTheme; @@ -28,7 +29,8 @@ public class IncubatorDarkThemeLoader extends DarkThemeLoader { public IncubatorDarkThemeLoader() { - super(new GroupToggleDarkTheme(), + super(new AddressLookupDarkTheme(), + new GroupToggleDarkTheme(), new PlaceholderDarkTheme(), new ProgressLineBarDarkTheme(), new TagLabelDarkTheme()); diff --git a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookup.java b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookup.java index f5dcd0e60..5b1368641 100644 --- a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookup.java +++ b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookup.java @@ -21,6 +21,7 @@ import com.google.gwt.event.shared.HandlerRegistration; import gwt.material.design.client.ui.MaterialTextBox; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import gwt.material.design.incubator.client.google.addresslookup.constants.AddressComponentType; import gwt.material.design.incubator.client.google.addresslookup.constants.AddressType; import gwt.material.design.incubator.client.google.addresslookup.events.AddressLookupEvents; @@ -80,6 +81,7 @@ public class AddressLookup extends MaterialTextBox public AddressLookup() { setPlaceholder(""); + setAutocomplete(false); } /** @@ -91,6 +93,13 @@ public AddressLookup(AddressLookupOptions options) { setOptions(options); } + @Override + protected void onLoad() { + super.onLoad(); + + IncubatorDarkThemeReloader.get().reload(AddressLookupDarkTheme.class); + } + public void load() { addressLookup = new JsAddressLookup(valueBoxBase.getElement(), options); addressLookup.addListener(AddressLookupEvents.PLACE_CHANGED, () -> PlaceChangedEvent.fire(AddressLookup.this)); diff --git a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupClientBundle.java b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupClientBundle.java new file mode 100644 index 000000000..f030755cb --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupClientBundle.java @@ -0,0 +1,39 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.addresslookup; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; + +//@formatter:off + +/** + * Client Bundle for {@link InfiniteScrollPanel} + * + * @author kevzlou7979 + */ +public interface AddressLookupClientBundle extends ClientBundle { + AddressLookupClientBundle INSTANCE = GWT.create(AddressLookupClientBundle.class); + + @Source("resources/css/address-lookup-dark.min.css") + TextResource addressLookupDarkCss(); +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java new file mode 100644 index 000000000..9c89009a9 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.incubator.client.google.addresslookup; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; + +public class AddressLookupDarkTheme extends AddinsWidgetDarkTheme { + + public AddressLookupDarkTheme() { + super(AddinsIncubator.isDebug() ? AddressLookupDebugClientBundle.INSTANCE.addressLookupDarkCss() : AddressLookupClientBundle.INSTANCE.addressLookupDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDebugClientBundle.java new file mode 100644 index 000000000..617990cd1 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDebugClientBundle.java @@ -0,0 +1,39 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2017 GwtMaterialDesign + * %% + * 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% + */ +package gwt.material.design.incubator.client.google.addresslookup; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; +import gwt.material.design.incubator.client.infinitescroll.InfiniteScrollPanel; + +//@formatter:off + +/** + * Debug Client Bundle for {@link InfiniteScrollPanel} + * + * @author kevzlou7979 + */ +public interface AddressLookupDebugClientBundle extends ClientBundle { + AddressLookupDebugClientBundle INSTANCE = GWT.create(AddressLookupDebugClientBundle.class); + + @Source("resources/css/address-lookup-dark.css") + TextResource addressLookupDarkCss(); +} diff --git a/src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.css b/src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.css new file mode 100644 index 000000000..81ed1c9c0 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.css @@ -0,0 +1,18 @@ +.pac-container { + background-color: #2f2f2f; + color: white !important; + border-top: 1px solid #222222; +} + +.pac-item { + border-top: 1px solid #393939; + color: #8f8f8f; +} + +.pac-item:hover { + background-color: #353535; +} + +.pac-item-query { + color: #fff; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.min.css new file mode 100644 index 000000000..481fe76d1 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/google/addresslookup/resources/css/address-lookup-dark.min.css @@ -0,0 +1 @@ +.pac-container{background-color:#2f2f2f;color:#fff!important;border-top:1px solid #222}.pac-item{border-top:1px solid #393939;color:#8f8f8f}.pac-item:hover{background-color:#353535}.pac-item-query{color:#fff} \ No newline at end of file From 9907fd7e127ce0e48604fb97d27344346c35e853 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 16:25:09 +0800 Subject: [PATCH 158/247] Date Range picker dark mode support --- .../client/dark/IncubatorDarkThemeLoader.java | 2 + .../daterange/DateRangeClientBundle.java | 3 + .../daterange/DateRangeClientDebugBundle.java | 3 + .../client/daterange/DateRangeDarkTheme.java | 13 ++++ .../client/daterange/DateRangePicker.java | 3 + .../resources/css/daterangepicker-dark.css | 61 +++++++++++++++++++ .../css/daterangepicker-dark.min.css | 1 + .../css/daterangepicker-materialize.css | 3 +- .../css/daterangepicker-materialize.min.css | 2 +- 9 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index 782122791..ba437838c 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -20,6 +20,7 @@ package gwt.material.design.incubator.client.dark; import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.incubator.client.daterange.DateRangeDarkTheme; import gwt.material.design.incubator.client.google.addresslookup.AddressLookupDarkTheme; import gwt.material.design.incubator.client.placeholder.PlaceholderDarkTheme; import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; @@ -30,6 +31,7 @@ public class IncubatorDarkThemeLoader extends DarkThemeLoader { public IncubatorDarkThemeLoader() { super(new AddressLookupDarkTheme(), + new DateRangeDarkTheme(), new GroupToggleDarkTheme(), new PlaceholderDarkTheme(), new ProgressLineBarDarkTheme(), diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java index d7633ee0a..e37e4492b 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientBundle.java @@ -41,4 +41,7 @@ public interface DateRangeClientBundle extends ClientBundle { @Source("resources/css/daterangepicker-materialize.min.css") TextResource dateRangePickerOverrideCss(); + + @Source("resources/css/daterangepicker-dark.min.css") + TextResource dateRangeDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java index 40e7806cd..7750cd772 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeClientDebugBundle.java @@ -40,4 +40,7 @@ public interface DateRangeClientDebugBundle extends ClientBundle { @Source("resources/css/daterangepicker-materialize.css") TextResource dateRangePickerOverrideDebugCss(); + + @Source("resources/css/daterangepicker-dark.css") + TextResource dateRangeDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java new file mode 100644 index 000000000..cf61994c7 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java @@ -0,0 +1,13 @@ +package gwt.material.design.incubator.client.daterange; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.tag.TagClientBundle; +import gwt.material.design.incubator.client.tag.TagDebugClientBundle; + +public class DateRangeDarkTheme extends AddinsWidgetDarkTheme { + + public DateRangeDarkTheme() { + super(AddinsIncubator.isDebug() ? DateRangeClientDebugBundle.INSTANCE.dateRangeDarkCss() : DateRangeClientBundle.INSTANCE.dateRangeDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index 85b0abd7a..c629afac6 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -47,6 +47,7 @@ import gwt.material.design.client.ui.html.Label; import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.matcher.DateMonthMatcher; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import gwt.material.design.incubator.client.daterange.constants.DateRangeElementSelector; import gwt.material.design.incubator.client.daterange.events.*; import gwt.material.design.incubator.client.daterange.events.SelectionEvent; @@ -182,6 +183,8 @@ protected void load() { getHandlerRegistry().registerHandler(Window.addResizeHandler(event -> detectPosition())); setId(DOM.createUniqueId()); + + IncubatorDarkThemeReloader.get().reload(DateRangeDarkTheme.class); } protected void detectPosition() { diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css new file mode 100644 index 000000000..b1d67674e --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css @@ -0,0 +1,61 @@ +.daterangepicker, +.daterangepicker .calendar-table, +.daterangepicker td.off, +.daterangepicker td.off.in-range, +.daterangepicker td.off.start-date, +.daterangepicker td.off.end-date { + background-color: #2e3033; + border-color: #2e3033; +} + +.daterangepicker:after { + border-bottom: 6px solid #2e3033; +} + +.daterangepicker:before { + border-bottom: 7px solid #2e3033; +} + +.daterangepicker th.month { + color: rgba(255, 255, 255, .6); +} + +.daterangepicker .calendar-table .next span, +.daterangepicker .calendar-table .prev span { + border: solid white; + border-width: 0 2px 2px 0; +} + +.daterangepicker .drp-buttons { + border-top: 1px solid #3d3d3d; +} + +.daterangepicker td.active, +.daterangepicker td.active:hover, +.daterangepicker td.in-range.active:not(.off) { + background-color: #bb86fc; + color: #292929; +} + +.daterangepicker td.available:hover, +.daterangepicker th.available:hover { + background-color: #2e3033; +} + +.daterangepicker td.available:hover:after { + border: 2px solid #bb86fc; +} + +.daterangepicker td.in-range, +.daterangepicker td.available.in-range:hover:not(.active) { + background-color: rgba(187, 134, 252, .08); + color: #bb86fc; +} + +button.cancelBtn { + color: #bb86fc; +} + +.daterangepicker:not(.single) .drp-buttons { + background-color: #2e3033; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css new file mode 100644 index 000000000..b5bc9b7e0 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css @@ -0,0 +1 @@ +.daterangepicker,.daterangepicker .calendar-table,.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{background-color:#2e3033;border-color:#2e3033}.daterangepicker:after{border-bottom:6px solid #2e3033}.daterangepicker:before{border-bottom:7px solid #2e3033}.daterangepicker th.month{color:rgba(255,255,255,.6)}.daterangepicker .calendar-table .next span,.daterangepicker .calendar-table .prev span{border:solid #fff;border-width:0 2px 2px 0}.daterangepicker .drp-buttons{border-top:1px solid #3d3d3d}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#bb86fc;color:#292929}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background-color:#2e3033}.daterangepicker td.available:hover:after{border:2px solid #bb86fc}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:rgba(187,134,252,.08);color:#bb86fc}button.cancelBtn{color:#bb86fc}.daterangepicker:not(.single) .drp-buttons{background-color:#2e3033} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index 9cf8e38ce..903a3e95d 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -26,12 +26,10 @@ .daterangepicker .calendar-table th.next { position: absolute; right: 0; - top: 12px; } .daterangepicker .calendar-table th.prev { position: absolute; - top: 12px; left: 0px; } @@ -65,6 +63,7 @@ .daterangepicker td.in-range, .daterangepicker td.available.in-range:hover:not(.active) { background-color: #e3f2fd; + color: #42a5f5; } .daterangepicker td.available:hover { diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index 18abc4a0f..0ef6a1aa4 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1 +1 @@ -.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0;top:12px}.daterangepicker .calendar-table th.prev{position:absolute;top:12px;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker .calendar-table td{border:unset}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd}.daterangepicker td.available:hover{position:relative}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:12px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}}@media screen and (max-width:900px){.daterangepicker:not(.single) .drp-buttons,.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block}.daterangepicker .ranges ul:hover:before,.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}.daterangepicker:not(.single) .ranges{position:absolute;left:0;margin-left:0}} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0}.daterangepicker .calendar-table th.prev{position:absolute;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker .calendar-table td{border:unset}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd;color:#42a5f5}.daterangepicker td.available:hover{position:relative}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}}@media screen and (max-width:900px){.daterangepicker:not(.single) .drp-buttons,.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block}.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges ul:hover:before{display:none}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}.daterangepicker:not(.single) .ranges{position:absolute;left:0;margin-left:0}} \ No newline at end of file From cf49c5544c5524c9277fb3ce182edbfcd12f805a Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 16:43:31 +0800 Subject: [PATCH 159/247] CheckMark dark mode support. --- .../client/animation/checkmark/CheckMark.java | 3 +++ .../animation/checkmark/CheckMarkClientBundle.java | 3 +++ .../checkmark/CheckMarkClientDebugBundle.java | 3 +++ .../animation/checkmark/CheckMarkDarkTheme.java | 13 +++++++++++++ .../client/dark/IncubatorDarkThemeLoader.java | 2 ++ .../checkmark/resources/css/checkmark-dark.css | 8 ++++++++ .../checkmark/resources/css/checkmark-dark.min.css | 1 + 7 files changed, 33 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java index 8448efa5a..7356fddfb 100644 --- a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMark.java @@ -30,6 +30,7 @@ import gwt.material.design.client.ui.html.Div; import gwt.material.design.client.ui.html.Span; import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; public class CheckMark extends MaterialWidget implements HasDelayTransition { @@ -73,6 +74,8 @@ protected void onLoad() { iconWrapper.add(longLine); iconWrapper.add(placeholder); iconWrapper.add(fixLine); + + IncubatorDarkThemeReloader.get().reload(CheckMarkDarkTheme.class); } public void animate() { diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java index 37150aaa6..fe444ff83 100644 --- a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientBundle.java @@ -35,4 +35,7 @@ public interface CheckMarkClientBundle extends ClientBundle { @Source("resources/css/checkmark.min.css") TextResource checkMarkCss(); + + @Source("resources/css/checkmark-dark.min.css") + TextResource checkMarkDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java index bf33e83c4..5121a13cf 100644 --- a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkClientDebugBundle.java @@ -35,4 +35,7 @@ public interface CheckMarkClientDebugBundle extends ClientBundle { @Source("resources/css/checkmark.css") TextResource checkMarkDebugCss(); + + @Source("resources/css/checkmark-dark.css") + TextResource checkMarkDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java new file mode 100644 index 000000000..9b39a9bd7 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java @@ -0,0 +1,13 @@ +package gwt.material.design.incubator.client.animation.checkmark; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.daterange.DateRangeClientBundle; +import gwt.material.design.incubator.client.daterange.DateRangeClientDebugBundle; + +public class CheckMarkDarkTheme extends AddinsWidgetDarkTheme { + + public CheckMarkDarkTheme() { + super(AddinsIncubator.isDebug() ? CheckMarkClientDebugBundle.INSTANCE.checkMarkDarkCss() : CheckMarkClientBundle.INSTANCE.checkMarkDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index ba437838c..b939934be 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -20,6 +20,7 @@ package gwt.material.design.incubator.client.dark; import gwt.material.design.client.theme.dark.DarkThemeLoader; +import gwt.material.design.incubator.client.animation.checkmark.CheckMarkDarkTheme; import gwt.material.design.incubator.client.daterange.DateRangeDarkTheme; import gwt.material.design.incubator.client.google.addresslookup.AddressLookupDarkTheme; import gwt.material.design.incubator.client.placeholder.PlaceholderDarkTheme; @@ -31,6 +32,7 @@ public class IncubatorDarkThemeLoader extends DarkThemeLoader { public IncubatorDarkThemeLoader() { super(new AddressLookupDarkTheme(), + new CheckMarkDarkTheme(), new DateRangeDarkTheme(), new GroupToggleDarkTheme(), new PlaceholderDarkTheme(), diff --git a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.css b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.css new file mode 100644 index 000000000..3dc6118fa --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.css @@ -0,0 +1,8 @@ +.sa-icon.sa-success::before, +.sa-icon.sa-success::after { + background-color: #292929; +} + +.sa-icon.sa-success .sa-fix { + background-color: #292929; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.min.css new file mode 100644 index 000000000..03349caf5 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/animation/checkmark/resources/css/checkmark-dark.min.css @@ -0,0 +1 @@ +.sa-icon.sa-success::after,.sa-icon.sa-success::before{background-color:#292929}.sa-icon.sa-success .sa-fix{background-color:#292929} \ No newline at end of file From e4d432176cb77effe6b8dfea6f9f344af1bcfe2d Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 17:08:34 +0800 Subject: [PATCH 160/247] Inline Search dark mode --- .../client/dark/IncubatorDarkThemeLoader.java | 2 ++ .../incubator/client/search/InlineSearch.java | 3 +++ .../client/search/InlineSearchClientBundle.java | 3 +++ .../client/search/InlineSearchDarkTheme.java | 13 +++++++++++++ .../search/InlineSearchDebugClientBundle.java | 3 +++ .../search/resources/css/inline-search-dark.css | 3 +++ .../search/resources/css/inline-search-dark.min.css | 1 + 7 files changed, 28 insertions(+) create mode 100644 src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index b939934be..ada2a6d51 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -25,6 +25,7 @@ import gwt.material.design.incubator.client.google.addresslookup.AddressLookupDarkTheme; import gwt.material.design.incubator.client.placeholder.PlaceholderDarkTheme; import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; +import gwt.material.design.incubator.client.search.InlineSearchDarkTheme; import gwt.material.design.incubator.client.tag.TagLabelDarkTheme; import gwt.material.design.incubator.client.toggle.GroupToggleDarkTheme; @@ -35,6 +36,7 @@ public IncubatorDarkThemeLoader() { new CheckMarkDarkTheme(), new DateRangeDarkTheme(), new GroupToggleDarkTheme(), + new InlineSearchDarkTheme(), new PlaceholderDarkTheme(), new ProgressLineBarDarkTheme(), new TagLabelDarkTheme()); diff --git a/src/main/java/gwt/material/design/incubator/client/search/InlineSearch.java b/src/main/java/gwt/material/design/incubator/client/search/InlineSearch.java index 0c3b7e4a6..6be1636f8 100644 --- a/src/main/java/gwt/material/design/incubator/client/search/InlineSearch.java +++ b/src/main/java/gwt/material/design/incubator/client/search/InlineSearch.java @@ -28,6 +28,7 @@ import gwt.material.design.client.base.viewport.ViewPort; import gwt.material.design.client.ui.MaterialSearch; import gwt.material.design.incubator.client.base.IncubatorWidget; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import gwt.material.design.incubator.client.search.constants.Theme; /** @@ -82,6 +83,8 @@ protected void onLoad() { blurHandler = null; return true; }); + + IncubatorDarkThemeReloader.get().reload(InlineSearchDarkTheme.class); } public void setTheme(Theme theme) { diff --git a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchClientBundle.java b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchClientBundle.java index b8d280e8c..e22bec220 100644 --- a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchClientBundle.java @@ -28,4 +28,7 @@ public interface InlineSearchClientBundle extends ClientBundle { @Source("resources/css/inline-search.min.css") TextResource inlineSearchCss(); + + @Source("resources/css/inline-search-dark.min.css") + TextResource inlineSearchDarkCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java new file mode 100644 index 000000000..82d13dd4f --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java @@ -0,0 +1,13 @@ +package gwt.material.design.incubator.client.search; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; +import gwt.material.design.incubator.client.animation.checkmark.CheckMarkClientBundle; +import gwt.material.design.incubator.client.animation.checkmark.CheckMarkClientDebugBundle; + +public class InlineSearchDarkTheme extends AddinsWidgetDarkTheme { + + public InlineSearchDarkTheme() { + super(AddinsIncubator.isDebug() ? InlineSearchDebugClientBundle.INSTANCE.inlineSearchDarkCss() : InlineSearchClientBundle.INSTANCE.inlineSearchDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDebugClientBundle.java index d3a78e6ed..b5e17c5b4 100644 --- a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDebugClientBundle.java @@ -28,4 +28,7 @@ public interface InlineSearchDebugClientBundle extends ClientBundle { @Source("resources/css/inline-search.css") TextResource inlineSearchDebugCss(); + + @Source("resources/css/inline-search-dark.css") + TextResource inlineSearchDarkCss(); } diff --git a/src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.css b/src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.css new file mode 100644 index 000000000..974f730dc --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.css @@ -0,0 +1,3 @@ +nav .nav-wrapper ul li:hover .inline-search i { + background-color: transparent !important; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.min.css new file mode 100644 index 000000000..bab0c9a18 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/search/resources/css/inline-search-dark.min.css @@ -0,0 +1 @@ +nav .nav-wrapper ul li:hover .inline-search i{background-color:transparent!important} \ No newline at end of file From 43e87abf40ed790d7d32719acc6afdf07e755542 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 9 Jan 2020 17:15:39 +0800 Subject: [PATCH 161/247] Timer Progress dark mode --- .../client/dark/IncubatorDarkThemeLoader.java | 4 +++- .../design/incubator/client/timer/TimerProgress.java | 3 +++ .../client/timer/TimerProgressClientBundle.java | 3 +++ .../client/timer/TimerProgressDarkTheme.java | 11 +++++++++++ .../client/timer/TimerProgressDebugClientBundle.java | 3 +++ .../client/timer/resources/css/timer-dark.css | 7 +++++++ .../client/timer/resources/css/timer-dark.min.css | 1 + 7 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java create mode 100644 src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.css create mode 100644 src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.min.css diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index ada2a6d51..7d4e1105d 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -27,6 +27,7 @@ import gwt.material.design.incubator.client.progress.ProgressLineBarDarkTheme; import gwt.material.design.incubator.client.search.InlineSearchDarkTheme; import gwt.material.design.incubator.client.tag.TagLabelDarkTheme; +import gwt.material.design.incubator.client.timer.TimerProgressDarkTheme; import gwt.material.design.incubator.client.toggle.GroupToggleDarkTheme; public class IncubatorDarkThemeLoader extends DarkThemeLoader { @@ -39,6 +40,7 @@ public IncubatorDarkThemeLoader() { new InlineSearchDarkTheme(), new PlaceholderDarkTheme(), new ProgressLineBarDarkTheme(), - new TagLabelDarkTheme()); + new TagLabelDarkTheme(), + new TimerProgressDarkTheme()); } } diff --git a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgress.java b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgress.java index 930744dd4..7f77b80ad 100644 --- a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgress.java +++ b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgress.java @@ -29,6 +29,7 @@ import gwt.material.design.incubator.client.AddinsIncubator; import gwt.material.design.incubator.client.base.IncubatorWidget; import gwt.material.design.incubator.client.base.constants.IncubatorCssName; +import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import static gwt.material.design.addins.client.bubble.js.JsBubble.$; @@ -84,6 +85,8 @@ protected void onLoad() { add(fill); $(fill.getElement()).css("animation-duration", duration + "ms"); $(fill.getElement()).css("-webkit-animation-duration", duration + "ms"); + + IncubatorDarkThemeReloader.get().reload(TimerProgressDarkTheme.class); } public MaterialPanel getFill() { diff --git a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressClientBundle.java b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressClientBundle.java index 9b98d15fd..d62b41915 100644 --- a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressClientBundle.java @@ -34,6 +34,9 @@ public interface TimerProgressClientBundle extends ClientBundle { @Source("resources/css/timer.min.css") TextResource timerCss(); + @Source("resources/css/timer-dark.min.css") + TextResource timerDarkCss(); + @Source("resources/css/circular.min.css") TextResource circularTimerCss(); } diff --git a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java new file mode 100644 index 000000000..0f3690a45 --- /dev/null +++ b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java @@ -0,0 +1,11 @@ +package gwt.material.design.incubator.client.timer; + +import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; +import gwt.material.design.incubator.client.AddinsIncubator; + +public class TimerProgressDarkTheme extends AddinsWidgetDarkTheme { + + public TimerProgressDarkTheme() { + super(AddinsIncubator.isDebug() ? TimerProgressDebugClientBundle.INSTANCE.timerDarkCss() : TimerProgressClientBundle.INSTANCE.timerDarkCss()); + } +} diff --git a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDebugClientBundle.java b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDebugClientBundle.java index a907a7c91..cb5b05cc8 100644 --- a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDebugClientBundle.java +++ b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDebugClientBundle.java @@ -34,6 +34,9 @@ public interface TimerProgressDebugClientBundle extends ClientBundle { @Source("resources/css/timer.css") TextResource timerDebugCss(); + @Source("resources/css/timer-dark.css") + TextResource timerDarkCss(); + @Source("resources/css/circular.css") TextResource circularTimerDebugCss(); } diff --git a/src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.css b/src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.css new file mode 100644 index 000000000..470f31f69 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.css @@ -0,0 +1,7 @@ +.timer-progress { + background-color: #4c3f5b; +} + +.timer-progress.bouncing .fill { + background: #bb86fc; +} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.min.css new file mode 100644 index 000000000..b541f0181 --- /dev/null +++ b/src/main/resources/gwt/material/design/incubator/client/timer/resources/css/timer-dark.min.css @@ -0,0 +1 @@ +.timer-progress{background-color:#4c3f5b}.timer-progress.bouncing .fill{background:#bb86fc} \ No newline at end of file From 6b41b261dc8d2584105b83cf4bf27a5ddd469453 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 10 Jan 2020 05:49:28 +0800 Subject: [PATCH 162/247] Added license headers. --- README.md | 4 ++-- .../MaterialAutoCompleteDarkTheme.java | 19 +++++++++++++++++++ .../client/dark/AddinsDarkThemeLoader.java | 4 ++-- .../overlay/MaterialOverlayDarkTheme.java | 19 +++++++++++++++++++ .../client/stepper/MaterialStepper.java | 4 ++-- .../subheader/MaterialSubheaderDarkTheme.java | 19 +++++++++++++++++++ .../addins/client/tree/MaterialTree.java | 6 +++--- .../client/tree/MaterialTreeDarkTheme.java | 4 ++-- .../checkmark/CheckMarkDarkTheme.java | 19 +++++++++++++++++++ .../client/dark/IncubatorDarkThemeLoader.java | 4 ++-- .../dark/IncubatorDarkThemeReloader.java | 19 +++++++++++++++++++ .../client/daterange/DateRangeDarkTheme.java | 19 +++++++++++++++++++ .../addresslookup/AddressLookupDarkTheme.java | 19 +++++++++++++++++++ .../placeholder/PlaceholderDarkTheme.java | 19 +++++++++++++++++++ .../client/progress/ProgressLineBar.java | 4 ++-- .../progress/ProgressLineBarDarkTheme.java | 19 +++++++++++++++++++ .../client/search/InlineSearchDarkTheme.java | 19 +++++++++++++++++++ .../client/tag/TagLabelDarkTheme.java | 19 +++++++++++++++++++ .../client/timer/TimerProgressDarkTheme.java | 19 +++++++++++++++++++ .../client/toggle/GroupToggleDarkTheme.java | 19 +++++++++++++++++++ 20 files changed, 262 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 484206c02..88eb5b806 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.2 +## Current Version 2.3 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.2 + 2.3 ``` diff --git a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java index 3e4f2b6c1..b1848aaff 100644 --- a/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/autocomplete/MaterialAutoCompleteDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.autocomplete; import gwt.material.design.addins.client.MaterialAddins; diff --git a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java index e74c5b59c..49702ebfc 100644 --- a/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/addins/client/dark/AddinsDarkThemeLoader.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java index 34eef4d14..008edba9e 100644 --- a/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/overlay/MaterialOverlayDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.overlay; import gwt.material.design.addins.client.MaterialAddins; diff --git a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java index 75ec862f6..828e34339 100644 --- a/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java +++ b/src/main/java/gwt/material/design/addins/client/stepper/MaterialStepper.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java index 6cc9a29df..ff24376b2 100644 --- a/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/subheader/MaterialSubheaderDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.addins.client.subheader; import gwt.material.design.addins.client.MaterialAddins; diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java index b1175697a..1c1959a2c 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTree.java @@ -7,9 +7,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. @@ -232,4 +232,4 @@ public void onSelection(SelectionEvent event) { } }, SelectionEvent.getType()); } -} \ No newline at end of file +} diff --git a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java index 274fc34ee..42db06f92 100644 --- a/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java +++ b/src/main/java/gwt/material/design/addins/client/tree/MaterialTreeDarkTheme.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java index 9b39a9bd7..faf4154b6 100644 --- a/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/animation/checkmark/CheckMarkDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.animation.checkmark; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java index 7d4e1105d..9c74d19b8 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeLoader.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java index 3b4b0c4c5..df52ad08c 100644 --- a/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java +++ b/src/main/java/gwt/material/design/incubator/client/dark/IncubatorDarkThemeReloader.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.dark; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java index cf61994c7..2515c86d7 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangeDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.daterange; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java index 9c89009a9..f014f3bed 100644 --- a/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/google/addresslookup/AddressLookupDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.google.addresslookup; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java index 63d392c81..e6724ff89 100644 --- a/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/placeholder/PlaceholderDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.placeholder; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java index bb8cf9a6c..61af9bcce 100644 --- a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java +++ b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBar.java @@ -7,9 +7,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. diff --git a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java index 98c65dddf..7318c771e 100644 --- a/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/progress/ProgressLineBarDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.progress; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java index 82d13dd4f..49f3cc08c 100644 --- a/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/search/InlineSearchDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.search; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java index c9d301bf1..9a88c8e6d 100644 --- a/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/tag/TagLabelDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.tag; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java index 0f3690a45..3873b8758 100644 --- a/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/timer/TimerProgressDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.timer; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; diff --git a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java index 6d0462a96..c25be18ce 100644 --- a/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java +++ b/src/main/java/gwt/material/design/incubator/client/toggle/GroupToggleDarkTheme.java @@ -1,3 +1,22 @@ +/* + * #%L + * GwtMaterial + * %% + * Copyright (C) 2015 - 2020 GwtMaterialDesign + * %% + * 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% + */ package gwt.material.design.incubator.client.toggle; import gwt.material.design.addins.client.dark.AddinsWidgetDarkTheme; From cffce4578e7083597e45bf6c65c3561cedae449e Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 10 Jan 2020 06:39:18 +0800 Subject: [PATCH 163/247] Preparation for 2.3 release --- pom.xml | 8 ++++---- .../design/addins/client/ui/MaterialStepperTest.java | 6 +----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 900884876..e433cd485 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.3-SNAPSHOT + 2.3 gwt-material-addins gwt-lib Gwt Material Addins - 2.3-SNAPSHOT + 2.3 Extra Components of GWT Material Framework - 2.3-SNAPSHOT + 2.3 scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.3-SNAPSHOT + v2.3 diff --git a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java index b36ea48d4..bf23acf05 100644 --- a/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java +++ b/src/test/java/gwt/material/design/addins/client/ui/MaterialStepperTest.java @@ -265,10 +265,6 @@ protected void checkFeedback(MaterialStepper stepper) { // when / then stepper.showFeedback(FEEDBACK); - assertEquals(FEEDBACK, stepper.getFeedback()); - MaterialWidget feedback = (MaterialWidget) stepper.getWidget(FEEDBACK_INDEX); - assertTrue(feedback.getWidget(0) instanceof Span); - stepper.hideFeedback(); - assertFalse(feedback.isAttached()); + assertEquals(stepper.getFeedback(), FEEDBACK); } } From 8bb1d6bf641b05cea1d283ce8ee081d9ea34577d Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Fri, 10 Jan 2020 12:42:59 +0800 Subject: [PATCH 164/247] Updated version 2.3.0 --- README.md | 4 ++-- pom.xml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 88eb5b806..b2d3c0b90 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.3 +## Current Version 2.3.0 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.3 + 2.3.0 ``` diff --git a/pom.xml b/pom.xml index e433cd485..be5b1a13c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.3 + 2.3.0 gwt-material-addins gwt-lib Gwt Material Addins - 2.3 + 2.3.0 Extra Components of GWT Material Framework - 2.3 + 2.3.0 scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.3 + v2.3.0 From 518e069bbf8eb0d91693459ac4af8bfbc7743f35 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Sun, 12 Jan 2020 17:42:08 +0800 Subject: [PATCH 165/247] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ac98f2e0..0efb88b02 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # gwt-material-addins -[![Build Status](https://travis-ci.org/GwtMaterialDesign/gwt-material-addins.svg?branch=master)](https://travis-ci.org/GwtMaterialDesign/gwt-material-addins) [![Join the chat at https://gitter.im/GwtMaterialDesign/gwt-material-addins](https://badges.gitter.im/GwtMaterialDesign/gwt-material-addins.svg)](https://gitter.im/GwtMaterialDesign/gwt-material-addins?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Build Status](https://travis-ci.org/GwtMaterialDesign/gwt-material-addins.svg?branch=master)](https://travis-ci.org/GwtMaterialDesign/gwt-material-addins) [![Join us](https://img.shields.io/badge/slack-channel-purple)](https://gmd-project.slack.com) Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
From 829eae8828ea681c4324bfdad67356a0652f0db1 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 13 Jan 2020 09:15:32 +0800 Subject: [PATCH 166/247] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0efb88b02..e1e166728 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,12 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gw ``` -## Snapshot Version 2.3-SNAPSHOT +## Snapshot Version 2.3.1-SNAPSHOT ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.3-SNAPSHOT + 2.3.1-SNAPSHOT ``` From 97cfd5be79d815dd54d04c386f129b8268cbb1e7 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 13 Jan 2020 11:59:21 +0800 Subject: [PATCH 167/247] Iteration for 2.3.1 snapshot --- README.md | 8 ++++---- pom.xml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b2d3c0b90..9e5a6f56b 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,21 @@ Gwt Material Design Extra Components for https://github.com/GwtMaterialDesign/gwt-material
-## Current Version 2.3.0 +## Current Version 2.3.1 ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.3.0 + 2.3.1 ``` -## Snapshot Version 2.3-SNAPSHOT +## Snapshot Version 2.3.2-SNAPSHOT ```xml com.github.gwtmaterialdesign gwt-material-addins - 2.3-SNAPSHOT + 2.3.2-SNAPSHOT ``` diff --git a/pom.xml b/pom.xml index be5b1a13c..3c2af5c71 100644 --- a/pom.xml +++ b/pom.xml @@ -5,25 +5,25 @@ gwt-material-parent com.github.gwtmaterialdesign - 2.3.0 + 2.3.1-SNAPSHOT gwt-material-addins gwt-lib Gwt Material Addins - 2.3.0 + 2.3.1-SNAPSHOT Extra Components of GWT Material Framework - 2.3.0 + 2.3.1-SNAPSHOT scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git scm:git:git@github.com:GwtMaterialDesign/gwt-material-addins.git http://github.com/GwtMaterialDesign/gwt-material-addins - v2.3.0 + v2.3.1-SNAPSHOT From 317dbc925f0998e742331f1bd5576470243cfe39 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Mon, 13 Jan 2020 12:00:07 +0800 Subject: [PATCH 168/247] Travis update --- .travis.yml | 4 ++-- .utility/deploy.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d48db7b23..73c473fa4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,12 +8,12 @@ cache: - $HOME/.m2 before_install: # install the gwt-material-jquery library before we build the demo -- git clone -b release_2.3 https://github.com/GwtMaterialDesign/gwt-material-jquery.git +- git clone -b release_2.3.1 https://github.com/GwtMaterialDesign/gwt-material-jquery.git - cd gwt-material-jquery - mvn install -DskipTests=true -DdryRun=true - cd .. # install the gwt-material library before we build the demo -- git clone -b release_2.3 https://github.com/GwtMaterialDesign/gwt-material.git +- git clone -b release_2.3.1 https://github.com/GwtMaterialDesign/gwt-material.git - cd gwt-material - mvn install -DskipTests=true -DdryRun=true - cd .. diff --git a/.utility/deploy.sh b/.utility/deploy.sh index 7787dfe7d..37a4d96f5 100644 --- a/.utility/deploy.sh +++ b/.utility/deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash set -ev -if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.3" ]; then +if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "release_2.3.1" ]; then echo "ossrh\${env.OSSRH_USER}\${env.OSSRH_PASS}" > ~/settings.xml mvn deploy -DskipTests --settings ~/settings.xml fi \ No newline at end of file From a021e5058b0259043298589d97dca2e0bbff0182 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Thu, 16 Jan 2020 13:09:34 +0800 Subject: [PATCH 169/247] DateRangePicker - bug fixes --- .../client/daterange/DateRangePicker.java | 10 ++--- .../resources/css/daterangepicker-dark.css | 45 ++++++++++++++++++- .../css/daterangepicker-dark.min.css | 2 +- .../css/daterangepicker-materialize.css | 7 ++- .../css/daterangepicker-materialize.min.css | 2 +- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java index c629afac6..1c7f7e690 100644 --- a/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java +++ b/src/main/java/gwt/material/design/incubator/client/daterange/DateRangePicker.java @@ -7,9 +7,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,8 +28,6 @@ import gwt.material.design.addins.client.combobox.MaterialComboBoxDebugClientBundle; import gwt.material.design.addins.client.combobox.js.JsComboBox; import gwt.material.design.addins.client.combobox.js.JsComboBoxOptions; -import gwt.material.design.addins.client.combobox.js.options.Data; -import gwt.material.design.addins.client.combobox.js.options.Params; import gwt.material.design.addins.client.moment.resources.MomentClientBundle; import gwt.material.design.addins.client.moment.resources.MomentClientDebugBundle; import gwt.material.design.client.MaterialDesignBase; @@ -49,8 +47,8 @@ import gwt.material.design.incubator.client.base.matcher.DateMonthMatcher; import gwt.material.design.incubator.client.dark.IncubatorDarkThemeReloader; import gwt.material.design.incubator.client.daterange.constants.DateRangeElementSelector; -import gwt.material.design.incubator.client.daterange.events.*; import gwt.material.design.incubator.client.daterange.events.SelectionEvent; +import gwt.material.design.incubator.client.daterange.events.*; import gwt.material.design.incubator.client.daterange.js.*; import gwt.material.design.jquery.client.api.Functions; import gwt.material.design.jquery.client.api.JQuery; @@ -62,7 +60,7 @@ public class DateRangePicker extends AbstractValueWidget implements HasDateRangeHandlers, HasFieldTypes, - HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder, HasNativeBrowserStyle { + HasDateRangeOptions, HasIcon, HasReadOnly, HasPlaceholder, HasNativeBrowserStyle { static { if (AddinsIncubator.isDebug()) { diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css index b1d67674e..0fa58d6b0 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.css @@ -17,7 +17,7 @@ } .daterangepicker th.month { - color: rgba(255, 255, 255, .6); + color: #ffffff; } .daterangepicker .calendar-table .next span, @@ -37,7 +37,7 @@ color: #292929; } -.daterangepicker td.available:hover, +.daterangepicker td:not(.active).available:hover, .daterangepicker th.available:hover { background-color: #2e3033; } @@ -58,4 +58,45 @@ button.cancelBtn { .daterangepicker:not(.single) .drp-buttons { background-color: #2e3033; +} + +.daterangepicker .calendar-time { + background: #292929; + border: 1px solid #292929; +} + +.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered { + color: white; +} + +.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field, +.select2-container--default .select2-results__option[aria-selected=true], +.date-range-picker .select2-results__option { + background: #2f2f2f; +} + +.date-range-picker .select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #292929; +} + +.daterangepicker .select2-container--disabled .select2-selection__rendered { + color: #9c9c9c !important; +} + +/** Ranges **/ +.daterangepicker .ranges li.active { + background-color: #bb86fc !important; + color: #000000; +} + +.daterangepicker .ranges li:not(.active):hover { + background-color: #292929; +} + +.daterangepicker .ranges li:hover { + background-color: #292929; +} + +.daterangepicker.show-ranges .drp-calendar.left { + border-left: 1px solid #292929 !important; } \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css index b5bc9b7e0..e3185a493 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-dark.min.css @@ -1 +1 @@ -.daterangepicker,.daterangepicker .calendar-table,.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{background-color:#2e3033;border-color:#2e3033}.daterangepicker:after{border-bottom:6px solid #2e3033}.daterangepicker:before{border-bottom:7px solid #2e3033}.daterangepicker th.month{color:rgba(255,255,255,.6)}.daterangepicker .calendar-table .next span,.daterangepicker .calendar-table .prev span{border:solid #fff;border-width:0 2px 2px 0}.daterangepicker .drp-buttons{border-top:1px solid #3d3d3d}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#bb86fc;color:#292929}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background-color:#2e3033}.daterangepicker td.available:hover:after{border:2px solid #bb86fc}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:rgba(187,134,252,.08);color:#bb86fc}button.cancelBtn{color:#bb86fc}.daterangepicker:not(.single) .drp-buttons{background-color:#2e3033} \ No newline at end of file +.daterangepicker,.daterangepicker .calendar-table,.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{background-color:#2e3033;border-color:#2e3033}.daterangepicker:after{border-bottom:6px solid #2e3033}.daterangepicker:before{border-bottom:7px solid #2e3033}.daterangepicker th.month{color:#fff}.daterangepicker .calendar-table .next span,.daterangepicker .calendar-table .prev span{border:solid #fff;border-width:0 2px 2px 0}.daterangepicker .drp-buttons{border-top:1px solid #3d3d3d}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#bb86fc;color:#292929}.daterangepicker td:not(.active).available:hover,.daterangepicker th.available:hover{background-color:#2e3033}.daterangepicker td.available:hover:after{border:2px solid #bb86fc}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:rgba(187,134,252,.08);color:#bb86fc}button.cancelBtn{color:#bb86fc}.daterangepicker:not(.single) .drp-buttons{background-color:#2e3033}.daterangepicker .calendar-time{background:#292929;border:1px solid #292929}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{color:#fff}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field,.date-range-picker .select2-results__option,.select2-container--default .select2-results__option[aria-selected=true]{background:#2f2f2f}.date-range-picker .select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#292929}.daterangepicker .select2-container--disabled .select2-selection__rendered{color:#9c9c9c!important}.daterangepicker .ranges li.active{background-color:#bb86fc!important;color:#000}.daterangepicker .ranges li:not(.active):hover{background-color:#292929}.daterangepicker .ranges li:hover{background-color:#292929}.daterangepicker.show-ranges .drp-calendar.left{border-left:1px solid #292929!important} \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css index 903a3e95d..0b0b330b3 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.css @@ -33,10 +33,6 @@ left: 0px; } -.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child { - display: none; -} - /** Calendar Day Item / Columns **/ .daterangepicker .calendar-table td.available { width: 36px !important; @@ -93,6 +89,9 @@ } /** Month and Year Selection **/ +.daterangepicker .select2 { + width: 92px !important; +} .date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field { width: 100% !important; background: white; diff --git a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css index 0ef6a1aa4..1b427d60a 100644 --- a/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css +++ b/src/main/resources/gwt/material/design/incubator/client/daterange/resources/css/daterangepicker-materialize.min.css @@ -1 +1 @@ -.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0}.daterangepicker .calendar-table th.prev{position:absolute;left:0}.daterangepicker .drp-calendar.right .calendar-table table thead:first-child tr:first-child th:first-child{display:none}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker .calendar-table td{border:unset}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd;color:#42a5f5}.daterangepicker td.available:hover{position:relative}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}}@media screen and (max-width:900px){.daterangepicker:not(.single) .drp-buttons,.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block}.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges ul:hover:before{display:none}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}.daterangepicker:not(.single) .ranges{position:absolute;left:0;margin-left:0}} \ No newline at end of file +.daterangepicker{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{padding:unset}.daterangepicker th.month{color:#444;font-size:1.2em}.daterangepicker .calendar-table table{position:relative}.daterangepicker .calendar-table th.next,.daterangepicker .calendar-table th.prev{position:absolute}.daterangepicker .calendar-table th.next{position:absolute;right:0}.daterangepicker .calendar-table th.prev{position:absolute;left:0}.daterangepicker .calendar-table td.available{width:36px!important;height:36px!important}.daterangepicker .calendar-table td{border:unset}.daterangepicker td.active,.daterangepicker td.active:hover,.daterangepicker td.in-range.active:not(.off){background-color:#42a5f5;border-color:transparent;color:#fff;border-radius:100%}.daterangepicker td.start-date.end-date{border-radius:100%}.daterangepicker td.available.in-range:hover:not(.active),.daterangepicker td.in-range{background-color:#e3f2fd;color:#42a5f5}.daterangepicker td.available:hover{position:relative}.daterangepicker td.available:hover:after{content:" ";background:0 0;width:100%;position:absolute;height:100%;left:0;top:0;border-radius:100%;border:2px solid #42a5f5}.daterangepicker .drp-calendar{max-width:unset}.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:20px}.daterangepicker .select2{width:92px!important}.date-range-picker .select2-container--default .select2-search--dropdown .select2-search__field{width:100%!important;background:#fff;border-radius:0;border-top:none;border-left:none;border-right:none;margin-bottom:0;padding-left:12px!important;font-size:1em}.date-range-picker .select2-results__option{padding-top:8px;padding-bottom:8px;min-height:20px}.date-range-picker .select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:240px!important}.date-range-picker .select2-container{z-index:10000}.daterangepicker .select2-container--default .select2-selection--single{border-bottom:none}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:46px;padding-left:0;font-size:14px}.daterangepicker .select2-container--default .select2-selection--single .select2-selection__rendered:after{content:"";position:absolute;right:8px;bottom:23px;width:0;height:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent #9c9c9c!important}.date-range-picker .select2-container--open .select2-dropdown{margin-top:-12px!important}.daterangepicker .calendar-time select{display:inline-block}.daterangepicker .drp-buttons .btn{padding-left:12px;padding-right:12px;line-height:20px}.daterangepicker .drp-selected{float:left;padding:12px;font-size:1em}button.cancelBtn{background:0 0;color:#42a5f5;box-shadow:none;border:1px solid}button.cancelBtn:hover{color:#fff;border:none}.daterangepicker.show-calendar .ranges{margin-top:0}.daterangepicker .ranges li.active{background-color:#42a5f5}.daterangepicker .ranges li{padding-top:11px;padding-bottom:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.daterangepicker .calendar-time .select2{width:60px!important}.daterangepicker .calendar-time{background:#fbfbfb;border:1px solid #e9e9e9}.daterangepicker select.browser-default{height:unset;background-color:unset;display:inline-block;color:rgba(0,0,0,.8)}.daterangepicker .calendar-table select.browser-default{width:40%}@media screen and (max-width:600px){.daterangepicker:not(.single){position:fixed;top:0!important;left:0!important;width:100%;margin-top:0;overflow:auto;bottom:0;padding-top:12px;padding-bottom:56px}.daterangepicker:before:not(.single){display:none}.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{margin:auto;float:none!important;padding:0 5%;border-bottom:1px solid #e9e9e9}.daterangepicker:not(.single) .drp-calendar.right{border-bottom:none;margin-top:4px}.daterangepicker:not(.single) .drp-buttons{position:fixed;bottom:0;width:100%;background:#fafafa;padding-right:5%}.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(1),.daterangepicker:not(.single) .drp-calendar table thead tr:nth-child(2){height:32px}.daterangepicker:not(.single) th.month{position:absolute;width:100%;text-align:center}.daterangepicker:not(.single) .drp-calendar.left{padding-bottom:20px}.daterangepicker:not(.single) .drp-calendar.right{margin-top:12px}.daterangepicker:not(.single) .calendar-table th.next,.daterangepicker:not(.single) .calendar-table th.prev{top:0;position:fixed;margin:12px}.daterangepicker:not(.single) td.active,.daterangepicker:not(.single) td.active:hover,.daterangepicker:not(.single) td.in-range.active:not(.off){border-radius:4px!important}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__arrow,.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:24px}.daterangepicker:not(.single) .select2-container--default .select2-selection--single .select2-selection__rendered:after{bottom:unset;top:8px}.daterangepicker .calendar-time .select2{margin-top:4px}.daterangepicker .calendar-time{height:32px;color:transparent}}@media screen and (max-width:900px){.daterangepicker:not(.single) .drp-buttons,.daterangepicker:not(.single) .drp-calendar.left,.daterangepicker:not(.single) .drp-calendar.right{display:block}.daterangepicker:not(.single) .drp-selected{display:none}.daterangepicker .ranges{position:fixed;z-index:999;bottom:0;margin:8px 8px 8px 5%;max-width:160px}.daterangepicker .ranges ul:before{content:"";position:absolute;right:0;bottom:12px;width:0;height:0;border-style:solid;border-width:0 0 12px 12px;border-color:transparent transparent #9c9c9c}.daterangepicker .ranges ul:hover:before{display:none}.daterangepicker .ranges:hover{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);background:#fff;max-width:calc(100% - 52px)}.daterangepicker .ranges li:hover{background-color:#fff}.daterangepicker .ranges li.active{background-color:transparent;color:rgba(0,0,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.daterangepicker .ranges:hover ul li{display:block!important}.daterangepicker .ranges:hover ul li.active{background:#42a5f5!important;color:#fff}.daterangepicker .ranges ul li{padding-left:20px;padding-right:20px;display:none}.daterangepicker .ranges ul li.active{display:block;text-transform:uppercase;font-weight:700}}@media screen and (min-width:600px) and (max-width:900px){.daterangepicker .drp-calendar.left,.daterangepicker .drp-calendar.right{padding:12px}.daterangepicker:not(.single) .ranges{position:absolute;left:0;margin-left:0}} \ No newline at end of file From 05c8a3e3d2402b7e03aabd9b67e570f01a0a7718 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 3 Mar 2020 15:12:41 +0800 Subject: [PATCH 170/247] Select2Js upgrade from 4.0.3 to 4.0.13 --- .../client/combobox/MaterialComboBox.java | 56 +- .../combobox/events/ComboBoxEvents.java | 2 + .../combobox/events/HasComboBoxHandlers.java | 9 +- .../client/combobox/js/JsComboBoxOptions.java | 6 + .../client/combobox/resources/js/select2.js | 943 ++++++++++++------ .../combobox/resources/js/select2.min.js | 5 +- 6 files changed, 733 insertions(+), 288 deletions(-) diff --git a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java index 86f3446fe..17ff0c51e 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/MaterialComboBox.java @@ -7,9 +7,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. @@ -52,6 +52,8 @@ import gwt.material.design.client.base.mixin.StatusTextMixin; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.FieldType; +import gwt.material.design.client.events.ClearEvent; +import gwt.material.design.client.events.ClearingEvent; import gwt.material.design.client.events.ClosingEvent; import gwt.material.design.client.events.OpeningEvent; import gwt.material.design.client.ui.MaterialLabel; @@ -199,6 +201,16 @@ public void load() { return true; }); + jsComboBox.on(ComboBoxEvents.CLEAR, (e, param1) -> { + ClearEvent.fire(this); + return true; + }); + + jsComboBox.on(ComboBoxEvents.CLEARING, (e, param1) -> { + ClearingEvent.fire(this); + return true; + }); + displayArrowForAllowClearOption(false); if (getTextColor() != null) { @@ -224,6 +236,8 @@ public void unload() { jsComboBox.off(ComboBoxEvents.UNSELECT); jsComboBox.off(ComboBoxEvents.OPEN); jsComboBox.off(ComboBoxEvents.CLOSE); + jsComboBox.off(ComboBoxEvents.CLEAR); + jsComboBox.off(ComboBoxEvents.CLEARING); body().off("focus"); jsComboBox.select2("destroy"); } @@ -812,6 +826,34 @@ public LanguageOptions getLanguage() { return options.language; } + /** + * Supports customization of the container width. + * + * @see Example + */ + public void setContainerWidth(String width) { + options.width = width; + } + + public String getContainerWidth() { + return options.width; + } + + /** + * If true, resolves issue for multiselects using closeOnSelect: false that caused the list of results to scroll to + * the first selection after each select/unselect (see https://github.com/select2/select2/pull/5150). This behaviour + * was intentional to deal with infinite scroll UI issues (if you need this behavior, set false) but it created an + * issue with multiselect dropdown boxes of fixed length. This pull request adds a configurable option to toggle + * between these two desirable behaviours. + */ + public void setScrollAfterSelect(boolean scrollAfterSelect) { + options.scrollAfterSelect = scrollAfterSelect; + } + + public boolean isScrollAfterSelect() { + return options.scrollAfterSelect; + } + public void scrollTop(int offset) { Scheduler.get().scheduleDeferred(() -> getDropdownResultElement().scrollTop(offset)); } @@ -907,6 +949,16 @@ public HandlerRegistration addClosingHandler(ClosingEvent.ClosingHandler handler return addHandler(handler, ClosingEvent.getType()); } + @Override + public HandlerRegistration addClearHandler(ClearEvent.ClearHandler handler) { + return addHandler(handler, ClearEvent.TYPE); + } + + @Override + public HandlerRegistration addClearingHandler(ClearingEvent.ClearingHandler handler) { + return addHandler(handler, ClearingEvent.TYPE); + } + @Override public HandlerRegistration addCloseHandler(CloseHandler closeHandler) { return addHandler(closeHandler, CloseEvent.getType()); diff --git a/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java b/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java index 4620e66d6..71e787219 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/events/ComboBoxEvents.java @@ -33,4 +33,6 @@ public interface ComboBoxEvents { String OPENING = "select2:opening"; String CLOSE = "select2:close"; String CLOSING = "select2:closing"; + String CLEAR = "select2:clear"; + String CLEARING = "select2:clearing"; } diff --git a/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java b/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java index 40324f91b..ed569257d 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/events/HasComboBoxHandlers.java @@ -7,9 +7,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,12 +23,15 @@ import com.google.gwt.event.logical.shared.HasOpenHandlers; import com.google.gwt.event.shared.HandlerRegistration; import gwt.material.design.addins.client.combobox.base.HasUnselectItemHandler; +import gwt.material.design.client.events.ClearEvent; +import gwt.material.design.client.events.ClearingEvent; import gwt.material.design.client.events.ClosingEvent; import gwt.material.design.client.events.OpeningEvent; public interface HasComboBoxHandlers extends HasOpenHandlers, HasCloseHandlers, HasUnselectItemHandler { HandlerRegistration addOpeningHandler(OpeningEvent.OpeningHandler handler); - HandlerRegistration addClosingHandler(ClosingEvent.ClosingHandler handler); + HandlerRegistration addClearHandler(ClearEvent.ClearHandler handler); + HandlerRegistration addClearingHandler(ClearingEvent.ClearingHandler handler); } diff --git a/src/main/java/gwt/material/design/addins/client/combobox/js/JsComboBoxOptions.java b/src/main/java/gwt/material/design/addins/client/combobox/js/JsComboBoxOptions.java index 9557ddd86..d8ccb6495 100644 --- a/src/main/java/gwt/material/design/addins/client/combobox/js/JsComboBoxOptions.java +++ b/src/main/java/gwt/material/design/addins/client/combobox/js/JsComboBoxOptions.java @@ -66,9 +66,15 @@ public static final JsComboBoxOptions create() { @JsProperty public boolean closeOnSelect; + @JsProperty + public boolean scrollAfterSelect; + @JsProperty public boolean tags; + @JsProperty + public String width; + @JsProperty public Functions.FuncRet2 matcher; diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.js b/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.js index 13b84fadf..fcfb5ab49 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.js +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.js @@ -1,27 +1,41 @@ /*! - * Select2 4.0.3 + * Select2 4.0.13 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ -(function (factory) { +;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); - } else if (typeof exports === 'object') { + } else if (typeof module === 'object' && module.exports) { // Node/CommonJS - factory(require('jquery')); + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; } else { // Browser globals factory(jQuery); } -}(function (jQuery) { +} (function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. - var S2 = -(function () { + var S2 =(function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { @@ -30,13 +44,11 @@ var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** - * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/almond for details + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. -/*jslint sloppy: true */ /*global setTimeout: false */ var requirejs, require, define; @@ -64,60 +76,58 @@ var requirejs, require, define; */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, - foundI, foundStarMap, starI, i, j, part, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. - if (name && name.charAt(0) === ".") { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - name = name.split('/'); - lastIndex = name.length - 1; - - // Node .js allowance: - if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { - name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); - } + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } - //Lop off the last part of baseParts, so that . matches the - //"directory" and not name of the baseName's module. For instance, - //baseName of "one/two/three", maps to "one/two/three.js", but we - //want the directory, "one/two" for this normalization. - name = baseParts.slice(0, baseParts.length - 1).concat(name); - - //start trimDots - for (i = 0; i < name.length; i += 1) { - part = name[i]; - if (part === ".") { - name.splice(i, 1); - i -= 1; - } else if (part === "..") { - if (i === 1 && (name[2] === '..' || name[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - name.splice(i - 1, 2); - i -= 2; - } + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; } } - //end trimDots - - name = name.join("/"); - } else if (name.indexOf('./') === 0) { - // No baseName, so this is ID is resolved relative - // to baseUrl, pull off the leading dot. - name = name.substring(2); } + //end trimDots + + name = name.join('/'); } //Apply map config if available. @@ -230,32 +240,39 @@ var requirejs, require, define; return [prefix, name]; } + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ - makeMap = function (name, relName) { + makeMap = function (name, relParts) { var plugin, parts = splitPrefix(name), - prefix = parts[0]; + prefix = parts[0], + relResourceName = relParts[1]; name = parts[1]; if (prefix) { - prefix = normalize(prefix, relName); + prefix = normalize(prefix, relResourceName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { - name = plugin.normalize(name, makeNormalize(relName)); + name = plugin.normalize(name, makeNormalize(relResourceName)); } else { - name = normalize(name, relName); + name = normalize(name, relResourceName); } } else { - name = normalize(name, relName); + name = normalize(name, relResourceName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; @@ -302,13 +319,14 @@ var requirejs, require, define; }; main = function (name, deps, callback, relName) { - var cjsModule, depName, ret, map, i, + var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; + relParts = makeRelParts(relName); //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { @@ -317,7 +335,7 @@ var requirejs, require, define; //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { - map = makeMap(deps[i], relName); + map = makeMap(deps[i], relParts); depName = map.f; //Fast path CommonJS standard dependencies. @@ -373,7 +391,7 @@ var requirejs, require, define; //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. - return callDep(makeMap(deps, callback).f); + return callDep(makeMap(deps, makeRelParts(callback)).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; @@ -556,10 +574,10 @@ S2.define('select2/utils',[ DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { - var superMethod = superMethods[m]; + var superMethod = superMethods[m]; - DecoratedClass.prototype[superMethod] = - SuperClass.prototype[superMethod]; + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { @@ -754,6 +772,70 @@ S2.define('select2/utils',[ $element.append($nodes); }; + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + + element.removeAttribute('data-select2-id'); + }; + return Utils; }); @@ -773,7 +855,7 @@ S2.define('select2/results',[ Results.prototype.render = function () { var $results = $( - '
    ' + '
      ' ); if (this.options.get('multiple')) { @@ -796,7 +878,7 @@ S2.define('select2/results',[ this.hideLoading(); var $message = $( - '
    • ' ); @@ -889,7 +971,7 @@ S2.define('select2/results',[ $options.each(function () { var $option = $(this); - var item = $.data(this, 'data'); + var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; @@ -930,11 +1012,16 @@ S2.define('select2/results',[ option.className = 'select2-results__option'; var attrs = { - 'role': 'treeitem', + 'role': 'option', 'aria-selected': 'false' }; - if (data.disabled) { + var matches = window.Element.prototype.matches || + window.Element.prototype.msMatchesSelector || + window.Element.prototype.webkitMatchesSelector; + + if ((data.element != null && matches.call(data.element, ':disabled')) || + (data.element == null && data.disabled)) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } @@ -994,7 +1081,7 @@ S2.define('select2/results',[ this.template(data, option); } - $.data(option, 'data', data); + Utils.StoreData(option, 'data', data); return option; }; @@ -1035,7 +1122,10 @@ S2.define('select2/results',[ } self.setClasses(); - self.highlightFirstItem(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } }); container.on('unselect', function () { @@ -1044,7 +1134,10 @@ S2.define('select2/results',[ } self.setClasses(); - self.highlightFirstItem(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } }); container.on('open', function () { @@ -1080,7 +1173,7 @@ S2.define('select2/results',[ return; } - var data = $highlighted.data('data'); + var data = Utils.GetData($highlighted[0], 'data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); @@ -1098,8 +1191,9 @@ S2.define('select2/results',[ var currentIndex = $options.index($highlighted); - // If we are already at te top, don't move further - if (currentIndex === 0) { + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { return; } @@ -1192,7 +1286,7 @@ S2.define('select2/results',[ function (evt) { var $this = $(this); - var data = $this.data('data'); + var data = Utils.GetData(this, 'data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { @@ -1215,7 +1309,7 @@ S2.define('select2/results',[ this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { - var data = $(this).data('data'); + var data = Utils.GetData(this, 'data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); @@ -1330,14 +1424,15 @@ S2.define('select2/selection/base',[ this._tabindex = 0; - if (this.$element.data('old-tabindex') != null) { - this._tabindex = this.$element.data('old-tabindex'); + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); + $selection.attr('aria-disabled', 'false'); this.$selection = $selection; @@ -1347,7 +1442,6 @@ S2.define('select2/selection/base',[ BaseSelection.prototype.bind = function (container, $container) { var self = this; - var id = container.id + '-container'; var resultsId = container.id + '-results'; this.container = container; @@ -1390,17 +1484,19 @@ S2.define('select2/selection/base',[ self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); - self.$selection.focus(); + self.$selection.trigger('focus'); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); + self.$selection.attr('aria-disabled', 'false'); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); + self.$selection.attr('aria-disabled', 'true'); }); }; @@ -1423,7 +1519,6 @@ S2.define('select2/selection/base',[ }; BaseSelection.prototype._attachCloseHandler = function (container) { - var self = this; $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); @@ -1433,13 +1528,11 @@ S2.define('select2/selection/base',[ var $all = $('.select2.select2-container--open'); $all.each(function () { - var $this = $(this); - if (this == $select[0]) { return; } - var $element = $this.data('element'); + var $element = Utils.GetData(this, 'element'); $element.select2('close'); }); @@ -1463,6 +1556,27 @@ S2.define('select2/selection/base',[ throw new Error('The `update` method must be defined in child classes.'); }; + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + BaseSelection.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + BaseSelection.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + return BaseSelection; }); @@ -1500,7 +1614,10 @@ S2.define('select2/selection/single',[ var id = container.id + '-container'; - this.$selection.find('.select2-selection__rendered').attr('id', id); + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { @@ -1524,17 +1641,15 @@ S2.define('select2/selection/single',[ container.on('focus', function (evt) { if (!container.isOpen()) { - self.$selection.focus(); + self.$selection.trigger('focus'); } }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); }; SingleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty }; SingleSelection.prototype.display = function (data, container) { @@ -1560,7 +1675,14 @@ S2.define('select2/selection/single',[ var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); - $rendered.prop('title', selection.title || selection.text); + + var title = selection.title || selection.text; + + if (title) { + $rendered.attr('title', title); + } else { + $rendered.removeAttr('title'); + } }; return SingleSelection; @@ -1605,14 +1727,14 @@ S2.define('select2/selection/multiple',[ '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled - if (self.options.get('disabled')) { + if (self.isDisabled()) { return; } var $remove = $(this); var $selection = $remove.parent(); - var data = $selection.data('data'); + var data = Utils.GetData($selection[0], 'data'); self.trigger('unselect', { originalEvent: evt, @@ -1623,7 +1745,9 @@ S2.define('select2/selection/multiple',[ }; MultipleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); }; MultipleSelection.prototype.display = function (data, container) { @@ -1661,9 +1785,14 @@ S2.define('select2/selection/multiple',[ var formatted = this.display(selection, $selection); $selection.append(formatted); - $selection.prop('title', selection.title || selection.text); - $selection.data('data', selection); + var title = selection.title || selection.text; + + if (title) { + $selection.attr('title', title); + } + + Utils.StoreData($selection[0], 'data', selection); $selections.push($selection); } @@ -1728,8 +1857,9 @@ S2.define('select2/selection/placeholder',[ S2.define('select2/selection/allowClear',[ 'jquery', - '../keys' -], function ($, KEYS) { + '../keys', + '../utils' +], function ($, KEYS, Utils) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { @@ -1758,7 +1888,7 @@ S2.define('select2/selection/allowClear',[ AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled - if (this.options.get('disabled')) { + if (this.isDisabled()) { return; } @@ -1771,10 +1901,22 @@ S2.define('select2/selection/allowClear',[ evt.stopPropagation(); - var data = $clear.data('data'); + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } for (var d = 0; d < data.length; d++) { - var unselectData = { + unselectData = { data: data[d] }; @@ -1784,11 +1926,12 @@ S2.define('select2/selection/allowClear',[ // If the event was prevented, don't clear it out. if (unselectData.prevented) { + this.$element.val(previousVal); return; } } - this.$element.val(this.placeholder.id).trigger('change'); + this.$element.trigger('input').trigger('change'); this.trigger('toggle', {}); }; @@ -1811,12 +1954,14 @@ S2.define('select2/selection/allowClear',[ return; } + var removeAll = this.options.get('translations').get('removeAllItems'); + var $remove = $( - '' + + '' + '×' + '' ); - $remove.data('data', data); + Utils.StoreData($remove[0], 'data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; @@ -1837,8 +1982,8 @@ S2.define('select2/selection/search',[ var $search = $( '' ); @@ -1855,14 +2000,18 @@ S2.define('select2/selection/search',[ Search.prototype.bind = function (decorated, container, $container) { var self = this; + var resultsId = container.id + '-results'; + decorated.call(this, container, $container); container.on('open', function () { + self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); + self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); @@ -1882,7 +2031,11 @@ S2.define('select2/selection/search',[ }); container.on('results:focus', function (params) { - self.$search.attr('aria-activedescendant', params.id); + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { @@ -1907,7 +2060,7 @@ S2.define('select2/selection/search',[ .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { - var item = $previousChoice.data('data'); + var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); @@ -1916,6 +2069,12 @@ S2.define('select2/selection/search',[ } }); + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. @@ -2001,7 +2160,7 @@ S2.define('select2/selection/search',[ this.resizeSearch(); if (searchHadFocus) { - this.$search.focus(); + this.$search.trigger('focus'); } }; @@ -2034,7 +2193,7 @@ S2.define('select2/selection/search',[ var width = ''; if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').innerWidth(); + width = this.$selection.find('.select2-selection__rendered').width(); } else { var minimumWidth = this.$search.val().length + 1; @@ -2058,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[ 'open', 'opening', 'close', 'closing', 'select', 'selecting', - 'unselect', 'unselecting' + 'unselect', 'unselecting', + 'clear', 'clearing' ]; - var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; decorated.call(this, container, $container); @@ -2394,6 +2556,7 @@ S2.define('select2/diacritics',[ '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', + '\u0152': 'OE', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', @@ -2803,6 +2966,7 @@ S2.define('select2/diacritics',[ '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', + '\u0153': 'oe', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', @@ -2971,8 +3135,9 @@ S2.define('select2/diacritics',[ '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', - '\u03C9': '\u03C9', - '\u03C2': '\u03C3' + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' }; return diacritics; @@ -3057,7 +3222,7 @@ S2.define('select2/data/select',[ if ($(data.element).is('option')) { data.element.selected = true; - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); return; } @@ -3078,13 +3243,13 @@ S2.define('select2/data/select',[ } self.$element.val(val); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); } else { var val = data.id; this.$element.val(val); - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); } }; @@ -3100,7 +3265,7 @@ S2.define('select2/data/select',[ if ($(data.element).is('option')) { data.element.selected = false; - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); return; } @@ -3118,7 +3283,7 @@ S2.define('select2/data/select',[ self.$element.val(val); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); }; @@ -3140,7 +3305,7 @@ S2.define('select2/data/select',[ // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 - $.removeData(this, 'data'); + Utils.RemoveData(this); }); }; @@ -3191,7 +3356,7 @@ S2.define('select2/data/select',[ } } - if (data.id) { + if (data.id !== undefined) { option.value = data.id; } @@ -3213,7 +3378,7 @@ S2.define('select2/data/select',[ normalizedData.element = option; // Override the option's data with the combined data - $.data(option, 'data', normalizedData); + Utils.StoreData(option, 'data', normalizedData); return $option; }; @@ -3221,7 +3386,7 @@ S2.define('select2/data/select',[ SelectAdapter.prototype.item = function ($option) { var data = {}; - data = $.data($option[0], 'data'); + data = Utils.GetData($option[0], 'data'); if (data != null) { return data; @@ -3259,13 +3424,13 @@ S2.define('select2/data/select',[ data = this._normalizeItem(data); data.element = $option[0]; - $.data($option[0], 'data', data); + Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { - if (!$.isPlainObject(item)) { + if (item !== Object(item)) { item = { id: item, text: item @@ -3311,15 +3476,19 @@ S2.define('select2/data/array',[ 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { - var data = options.get('data') || []; + this._dataToConvert = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); - - this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); @@ -3469,7 +3638,8 @@ S2.define('select2/data/ajax',[ }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property - if ($request.status && $request.status === '0') { + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { return; } @@ -3550,7 +3720,10 @@ S2.define('select2/data/tags',[ }, true) ); - var checkText = option.text === params.term; + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { @@ -3605,8 +3778,6 @@ S2.define('select2/data/tags',[ }; Tags.prototype._removeOldTags = function (_) { - var tag = this._lastTag; - var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { @@ -3681,7 +3852,7 @@ S2.define('select2/data/tokenizer',[ // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); - this.$search.focus(); + this.$search.trigger('focus'); } params.term = tokenData.term; @@ -3810,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[ decorated.call(this, $e, options); } + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && @@ -3826,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[ }); return; } - decorated.call(self, params, callback); + + if (successCallback) { + successCallback(); + } }); }; @@ -3865,7 +4059,7 @@ S2.define('select2/dropdown',[ }; Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implmented in subclasses + // Should be implemented in subclasses }; Dropdown.prototype.destroy = function () { @@ -3888,8 +4082,8 @@ S2.define('select2/dropdown/search',[ var $search = $( '' + '' + + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + '' ); @@ -3904,6 +4098,8 @@ S2.define('select2/dropdown/search',[ Search.prototype.bind = function (decorated, container, $container) { var self = this; + var resultsId = container.id + '-results'; + decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { @@ -3926,23 +4122,27 @@ S2.define('select2/dropdown/search',[ container.on('open', function () { self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); - self.$search.focus(); + self.$search.trigger('focus'); window.setTimeout(function () { - self.$search.focus(); + self.$search.trigger('focus'); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); self.$search.val(''); + self.$search.trigger('blur'); }); container.on('focus', function () { - if (container.isOpen()) { - self.$search.focus(); + if (!container.isOpen()) { + self.$search.trigger('focus'); } }); @@ -3957,6 +4157,14 @@ S2.define('select2/dropdown/search',[ } } }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); }; Search.prototype.handleSearch = function (evt) { @@ -4041,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[ if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); } }; @@ -4059,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[ self.loading = true; }); - this.$results.on('scroll', function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - self.$loadingMore[0] - ); + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; - if (self.loading || !isLoadMoreVisible) { - return; - } + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var loadingMoreOffset = self.$loadingMore.offset().top + - self.$loadingMore.outerHeight(false); + if (this.loading || !isLoadMoreVisible) { + return; + } - if (currentOffset + 50 >= loadingMoreOffset) { - self.loadMore(); - } - }); + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } }; InfiniteScroll.prototype.loadMore = function () { @@ -4098,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[ var $option = $( '
    • ' + 'role="option" aria-disabled="true">' ); var message = this.options.get('translations').get('loadingMore'); @@ -4116,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[ '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { - this.$dropdownParent = options.get('dropdownParent') || $(document.body); + this.$dropdownParent = $(options.get('dropdownParent') || document.body); decorated.call(this, $element, options); } @@ -4124,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[ AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; - var setupResultsEvents = false; - decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); - if (!setupResultsEvents) { - setupResultsEvents = true; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - } + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); }); container.on('close', function () { @@ -4193,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[ this.$dropdownContainer.detach(); }; + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; @@ -4203,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[ var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { - $(this).data('select2-scroll-position', { + Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { - var position = $(this).data('select2-scroll-position'); + var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); @@ -4269,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[ top: container.bottom }; - // Determine what the parent element is to use for calciulating the offset + // Determine what the parent element is to use for calculating the offset var $offsetParent = this.$dropdownParent; - // For statically positoned elements, we need to get the element + // For statically positioned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } - var parentOffset = $offsetParent.offset(); + var parentOffset = { + top: 0, + left: 0 + }; + + if ( + $.contains(document.body, $offsetParent[0]) || + $offsetParent[0].isConnected + ) { + parentOffset = $offsetParent.offset(); + } css.top -= parentOffset.top; css.left -= parentOffset.left; @@ -4375,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[ }); S2.define('select2/dropdown/selectOnClose',[ - -], function () { + '../utils' +], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { @@ -4407,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[ return; } - var data = $highlightedResults.data('data'); + var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( @@ -4448,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[ var originalEvent = evt.originalEvent; // Don't close if the control key is being held - if (originalEvent && originalEvent.ctrlKey) { + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { return; } @@ -4502,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () { }, searching: function () { return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; } }; }); @@ -4740,66 +4989,29 @@ S2.define('select2/defaults',[ ); } - if (typeof options.language === 'string') { - // Check if the language is specified with a region - if (options.language.indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = options.language.split('-'); - var baseLanguage = languageParts[0]; - - options.language = [options.language, baseLanguage]; - } else { - options.language = [options.language]; - } - } - - if ($.isArray(options.language)) { - var languages = new Translation(); - options.language.push('en'); + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); - var languageNames = options.language; + // Always fall back to English since it will always be complete + options.language.push('en'); - for (var l = 0; l < languageNames.length; l++) { - var name = languageNames[l]; - var language = {}; + var uniqueLanguages = []; - try { - // Try to load it with the original name - language = Translation.loadPath(name); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - name = this.defaults.amdLanguageBase + name; - language = Translation.loadPath(name); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files. - if (options.debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + name + '" could not be ' + - 'automatically loaded. A fallback will be used instead.' - ); - } + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; - continue; - } - } - - languages.extend(language); + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); } + } - options.translations = languages; - } else { - var baseTranslation = Translation.loadPath( - this.defaults.amdLanguageBase + 'en' - ); - var customTranslation = new Translation(options.language); - - customTranslation.extend(baseTranslation); + options.language = uniqueLanguages; - options.translations = customTranslation; - } + options.translations = this._processTranslations( + options.language, + options.debug + ); return options; }; @@ -4866,13 +5078,14 @@ S2.define('select2/defaults',[ debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, - language: EnglishTranslation, + language: {}, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, + scrollAfterSelect: false, sorter: function (data) { return data; }, @@ -4887,6 +5100,103 @@ S2.define('select2/defaults',[ }; }; + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!$.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); @@ -4895,7 +5205,7 @@ S2.define('select2/defaults',[ var convertedData = Utils._convertData(data); - $.extend(this.defaults, convertedData); + $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); @@ -4916,6 +5226,10 @@ S2.define('select2/options',[ this.fromElement($element); } + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { @@ -4939,14 +5253,6 @@ S2.define('select2/options',[ this.options.disabled = $e.prop('disabled'); } - if (this.options.language == null) { - if ($e.prop('lang')) { - this.options.language = $e.prop('lang').toLowerCase(); - } else if ($e.closest('[lang]').prop('lang')) { - this.options.language = $e.closest('[lang]').prop('lang'); - } - } - if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); @@ -4960,7 +5266,7 @@ S2.define('select2/options',[ $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); - if ($e.data('select2Tags')) { + if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + @@ -4969,11 +5275,11 @@ S2.define('select2/options',[ ); } - $e.data('data', $e.data('select2Tags')); - $e.data('tags', true); + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); } - if ($e.data('ajaxUrl')) { + if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + @@ -4982,21 +5288,45 @@ S2.define('select2/options',[ ); } - $e.attr('ajax--url', $e.data('ajaxUrl')); - $e.data('ajax--url', $e.data('ajaxUrl')); + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, $e.data()); - } else { - dataset = $e.data(); + dataset = $.extend(true, {}, $e[0].dataset, dataset); } - var data = $.extend(true, {}, dataset); + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); data = Utils._convertData(data); @@ -5033,8 +5363,8 @@ S2.define('select2/core',[ './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { - if ($element.data('select2') != null) { - $element.data('select2').destroy(); + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; @@ -5050,7 +5380,7 @@ S2.define('select2/core',[ // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; - $element.data('old-tabindex', tabindex); + Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters @@ -5111,6 +5441,9 @@ S2.define('select2/core',[ // Synchronize any monitored attributes this._syncAttributes(); + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; @@ -5187,6 +5520,12 @@ S2.define('select2/core',[ return null; } + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + return method; }; @@ -5227,8 +5566,8 @@ S2.define('select2/core',[ if (observer != null) { this._observer = new observer(function (mutations) { - $.each(mutations, self._syncA); - $.each(mutations, self._syncS); + self._syncA(); + self._syncS(null, mutations); }); this._observer.observe(this.$element[0], { attributes: true, @@ -5350,7 +5689,7 @@ S2.define('select2/core',[ if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { - self.close(); + self.close(evt); evt.preventDefault(); } else if (key === KEYS.ENTER) { @@ -5384,7 +5723,7 @@ S2.define('select2/core',[ Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); - if (this.options.get('disabled')) { + if (this.isDisabled()) { if (this.isOpen()) { this.close(); } @@ -5395,7 +5734,7 @@ S2.define('select2/core',[ } }; - Select2.prototype._syncSubtree = function (evt, mutations) { + Select2.prototype._isChangeMutation = function (evt, mutations) { var changed = false; var self = this; @@ -5423,7 +5762,22 @@ S2.define('select2/core',[ } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; + } else if ($.isArray(mutations)) { + $.each(mutations, function(evt, mutation) { + if (self._isChangeMutation(evt, mutation)) { + // We've found a change mutation. + // Let's escape from the loop and continue + changed = true; + return false; + } + }); } + return changed; + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = this._isChangeMutation(evt, mutations); + var self = this; // Only re-pull the data if we think there is a change if (changed) { @@ -5445,7 +5799,8 @@ S2.define('select2/core',[ 'open': 'opening', 'close': 'closing', 'select': 'selecting', - 'unselect': 'unselecting' + 'unselect': 'unselecting', + 'clear': 'clearing' }; if (args === undefined) { @@ -5473,7 +5828,7 @@ S2.define('select2/core',[ }; Select2.prototype.toggleDropdown = function () { - if (this.options.get('disabled')) { + if (this.isDisabled()) { return; } @@ -5489,15 +5844,40 @@ S2.define('select2/core',[ return; } + if (this.isDisabled()) { + return; + } + this.trigger('query', {}); }; - Select2.prototype.close = function () { + Select2.prototype.close = function (evt) { if (!this.isOpen()) { return; } - this.trigger('close', {}); + this.trigger('close', { originalEvent : evt }); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + Select2.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + Select2.prototype.isDisabled = function () { + return this.options.get('disabled'); }; Select2.prototype.isOpen = function () { @@ -5574,7 +5954,7 @@ S2.define('select2/core',[ }); } - this.$element.val(newVal).trigger('change'); + this.$element.val(newVal).trigger('input').trigger('change'); }; Select2.prototype.destroy = function () { @@ -5600,10 +5980,12 @@ S2.define('select2/core',[ this._syncS = null; this.$element.off('.select2'); - this.$element.attr('tabindex', this.$element.data('old-tabindex')); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); @@ -5631,7 +6013,7 @@ S2.define('select2/core',[ this.$container.addClass('select2-container--' + this.options.get('theme')); - $container.data('element', this.$element); + Utils.StoreData($container[0], 'element', this.$element); return $container; }; @@ -5651,8 +6033,9 @@ S2.define('jquery.select2',[ 'jquery-mousewheel', './select2/core', - './select2/defaults' -], function ($, _, Select2, Defaults) { + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; @@ -5673,7 +6056,7 @@ S2.define('jquery.select2',[ var args = Array.prototype.slice.call(arguments, 1); this.each(function () { - var instance = $(this).data('select2'); + var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( diff --git a/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.min.js b/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.min.js index 43f0a651e..e42142643 100644 --- a/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.min.js +++ b/src/main/resources/gwt/material/design/addins/client/combobox/resources/js/select2.min.js @@ -1,3 +1,2 @@ -/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;hc;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
        ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('
      • '),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
          '),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('
        • ×
        • ');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change"); -if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
        • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null; -},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); \ No newline at end of file +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('
            ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
              '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
            • ×
            • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×
              ');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
            • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1 Date: Tue, 3 Mar 2020 15:35:25 +0800 Subject: [PATCH 171/247] CountUpJs upgraded from 1.9.0 to 2.0.4 --- .../countup/MaterialCountUpClientBundle.java | 2 +- .../MaterialCountUpDebugClientBundle.java | 2 +- .../client/countup/resources/js/countUp.js | 248 ++++++++++++++++++ .../countup/resources/js/countUp.min.js | 1 + .../client/countup/resources/js/countup.js | 196 -------------- .../countup/resources/js/countup.min.js | 1 - 6 files changed, 251 insertions(+), 199 deletions(-) create mode 100644 src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.js create mode 100644 src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.min.js delete mode 100644 src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.js delete mode 100644 src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.min.js diff --git a/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpClientBundle.java b/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpClientBundle.java index b20c5f91b..ea99bd26e 100644 --- a/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpClientBundle.java @@ -32,6 +32,6 @@ interface MaterialCountUpClientBundle extends ClientBundle { MaterialCountUpClientBundle INSTANCE = GWT.create(MaterialCountUpClientBundle.class); - @Source("resources/js/countup.min.js") + @Source("resources/js/countUp.min.js") TextResource countUpJs(); } diff --git a/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpDebugClientBundle.java b/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpDebugClientBundle.java index 99d2b71cb..037405c36 100644 --- a/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpDebugClientBundle.java +++ b/src/main/java/gwt/material/design/addins/client/countup/MaterialCountUpDebugClientBundle.java @@ -32,6 +32,6 @@ interface MaterialCountUpDebugClientBundle extends ClientBundle { MaterialCountUpDebugClientBundle INSTANCE = GWT.create(MaterialCountUpDebugClientBundle.class); - @Source("resources/js/countup.js") + @Source("resources/js/countUp.js") TextResource countUpJsDebug(); } diff --git a/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.js b/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.js new file mode 100644 index 000000000..0bc799139 --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.js @@ -0,0 +1,248 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +// playground: stackblitz.com/edit/countup-typescript +var CountUp = /** @class */ (function () { + function CountUp(target, endVal, options) { + var _this = this; + this.target = target; + this.endVal = endVal; + this.options = options; + this.version = '2.0.4'; + this.defaults = { + startVal: 0, + decimalPlaces: 0, + duration: 2, + useEasing: true, + useGrouping: true, + smartEasingThreshold: 999, + smartEasingAmount: 333, + separator: ',', + decimal: '.', + prefix: '', + suffix: '' + }; + this.finalEndVal = null; // for smart easing + this.useEasing = true; + this.countDown = false; + this.error = ''; + this.startVal = 0; + this.paused = true; + this.count = function (timestamp) { + if (!_this.startTime) { + _this.startTime = timestamp; + } + var progress = timestamp - _this.startTime; + _this.remaining = _this.duration - progress; + // to ease or not to ease + if (_this.useEasing) { + if (_this.countDown) { + _this.frameVal = _this.startVal - _this.easingFn(progress, 0, _this.startVal - _this.endVal, _this.duration); + } + else { + _this.frameVal = _this.easingFn(progress, _this.startVal, _this.endVal - _this.startVal, _this.duration); + } + } + else { + if (_this.countDown) { + _this.frameVal = _this.startVal - ((_this.startVal - _this.endVal) * (progress / _this.duration)); + } + else { + _this.frameVal = _this.startVal + (_this.endVal - _this.startVal) * (progress / _this.duration); + } + } + // don't go past endVal since progress can exceed duration in the last frame + if (_this.countDown) { + _this.frameVal = (_this.frameVal < _this.endVal) ? _this.endVal : _this.frameVal; + } + else { + _this.frameVal = (_this.frameVal > _this.endVal) ? _this.endVal : _this.frameVal; + } + // decimal + _this.frameVal = Math.round(_this.frameVal * _this.decimalMult) / _this.decimalMult; + // format and print value + _this.printValue(_this.frameVal); + // whether to continue + if (progress < _this.duration) { + _this.rAF = requestAnimationFrame(_this.count); + } + else if (_this.finalEndVal !== null) { + // smart easing + _this.update(_this.finalEndVal); + } + else { + if (_this.callback) { + _this.callback(); + } + } + }; + // default format and easing functions + this.formatNumber = function (num) { + var neg = (num < 0) ? '-' : ''; + var result, x, x1, x2, x3; + result = Math.abs(num).toFixed(_this.options.decimalPlaces); + result += ''; + x = result.split('.'); + x1 = x[0]; + x2 = x.length > 1 ? _this.options.decimal + x[1] : ''; + if (_this.options.useGrouping) { + x3 = ''; + for (var i = 0, len = x1.length; i < len; ++i) { + if (i !== 0 && (i % 3) === 0) { + x3 = _this.options.separator + x3; + } + x3 = x1[len - i - 1] + x3; + } + x1 = x3; + } + // optional numeral substitution + if (_this.options.numerals && _this.options.numerals.length) { + x1 = x1.replace(/[0-9]/g, function (w) { return _this.options.numerals[+w]; }); + x2 = x2.replace(/[0-9]/g, function (w) { return _this.options.numerals[+w]; }); + } + return neg + _this.options.prefix + x1 + x2 + _this.options.suffix; + }; + this.easeOutExpo = function (t, b, c, d) { + return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; + }; + this.options = __assign({}, this.defaults, options); + this.formattingFn = (this.options.formattingFn) ? + this.options.formattingFn : this.formatNumber; + this.easingFn = (this.options.easingFn) ? + this.options.easingFn : this.easeOutExpo; + this.startVal = this.validateValue(this.options.startVal); + this.frameVal = this.startVal; + this.endVal = this.validateValue(endVal); + this.options.decimalPlaces = Math.max(0 || this.options.decimalPlaces); + this.decimalMult = Math.pow(10, this.options.decimalPlaces); + this.resetDuration(); + this.options.separator = String(this.options.separator); + this.useEasing = this.options.useEasing; + if (this.options.separator === '') { + this.options.useGrouping = false; + } + this.el = (typeof target === 'string') ? document.getElementById(target) : target; + if (this.el) { + this.printValue(this.startVal); + } + else { + this.error = '[CountUp] target is null or undefined'; + } + } + // determines where easing starts and whether to count down or up + CountUp.prototype.determineDirectionAndSmartEasing = function () { + var end = (this.finalEndVal) ? this.finalEndVal : this.endVal; + this.countDown = (this.startVal > end); + var animateAmount = end - this.startVal; + if (Math.abs(animateAmount) > this.options.smartEasingThreshold) { + this.finalEndVal = end; + var up = (this.countDown) ? 1 : -1; + this.endVal = end + (up * this.options.smartEasingAmount); + this.duration = this.duration / 2; + } + else { + this.endVal = end; + this.finalEndVal = null; + } + if (this.finalEndVal) { + this.useEasing = false; + } + else { + this.useEasing = this.options.useEasing; + } + }; + // start animation + CountUp.prototype.start = function (callback) { + if (this.error) { + return; + } + this.callback = callback; + if (this.duration > 0) { + this.determineDirectionAndSmartEasing(); + this.paused = false; + this.rAF = requestAnimationFrame(this.count); + } + else { + this.printValue(this.endVal); + } + }; + // pause/resume animation + CountUp.prototype.pauseResume = function () { + if (!this.paused) { + cancelAnimationFrame(this.rAF); + } + else { + this.startTime = null; + this.duration = this.remaining; + this.startVal = this.frameVal; + this.determineDirectionAndSmartEasing(); + this.rAF = requestAnimationFrame(this.count); + } + this.paused = !this.paused; + }; + // reset to startVal so animation can be run again + CountUp.prototype.reset = function () { + cancelAnimationFrame(this.rAF); + this.paused = true; + this.resetDuration(); + this.startVal = this.validateValue(this.options.startVal); + this.frameVal = this.startVal; + this.printValue(this.startVal); + }; + // pass a new endVal and start animation + CountUp.prototype.update = function (newEndVal) { + cancelAnimationFrame(this.rAF); + this.startTime = null; + this.endVal = this.validateValue(newEndVal); + if (this.endVal === this.frameVal) { + return; + } + this.startVal = this.frameVal; + if (!this.finalEndVal) { + this.resetDuration(); + } + this.determineDirectionAndSmartEasing(); + this.rAF = requestAnimationFrame(this.count); + }; + CountUp.prototype.printValue = function (val) { + var result = this.formattingFn(val); + if (this.el.tagName === 'INPUT') { + var input = this.el; + input.value = result; + } + else if (this.el.tagName === 'text' || this.el.tagName === 'tspan') { + this.el.textContent = result; + } + else { + this.el.innerHTML = result; + } + }; + CountUp.prototype.ensureNumber = function (n) { + return (typeof n === 'number' && !isNaN(n)); + }; + CountUp.prototype.validateValue = function (value) { + var newValue = Number(value); + if (!this.ensureNumber(newValue)) { + this.error = "[CountUp] invalid start or end value: " + value; + return null; + } + else { + return newValue; + } + }; + CountUp.prototype.resetDuration = function () { + this.startTime = null; + this.duration = Number(this.options.duration) * 1000; + this.remaining = this.duration; + }; + return CountUp; +}()); +export { CountUp }; diff --git a/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.min.js b/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.min.js new file mode 100644 index 000000000..ae53b40cd --- /dev/null +++ b/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countUp.min.js @@ -0,0 +1 @@ +var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(t){for(var i,a=1,s=arguments.length;as.endVal?s.endVal:s.frameVal,s.frameVal=Math.round(s.frameVal*s.decimalMult)/s.decimalMult,s.printValue(s.frameVal),i1?s.options.decimal+a[1]:"",s.options.useGrouping){r="";for(var l=0,h=n.length;lt;var i=t-this.startVal;if(Math.abs(i)>this.options.smartEasingThreshold){this.finalEndVal=t;var a=this.countDown?1:-1;this.endVal=t+a*this.options.smartEasingAmount,this.duration=this.duration/2}else this.endVal=t,this.finalEndVal=null;this.finalEndVal?this.useEasing=!1:this.useEasing=this.options.useEasing},t.prototype.start=function(t){this.error||(this.callback=t,this.duration>0?(this.determineDirectionAndSmartEasing(),this.paused=!1,this.rAF=requestAnimationFrame(this.count)):this.printValue(this.endVal))},t.prototype.pauseResume=function(){this.paused?(this.startTime=null,this.duration=this.remaining,this.startVal=this.frameVal,this.determineDirectionAndSmartEasing(),this.rAF=requestAnimationFrame(this.count)):cancelAnimationFrame(this.rAF),this.paused=!this.paused},t.prototype.reset=function(){cancelAnimationFrame(this.rAF),this.paused=!0,this.resetDuration(),this.startVal=this.validateValue(this.options.startVal),this.frameVal=this.startVal,this.printValue(this.startVal)},t.prototype.update=function(t){cancelAnimationFrame(this.rAF),this.startTime=null,this.endVal=this.validateValue(t),this.endVal!==this.frameVal&&(this.startVal=this.frameVal,this.finalEndVal||this.resetDuration(),this.determineDirectionAndSmartEasing(),this.rAF=requestAnimationFrame(this.count))},t.prototype.printValue=function(t){var i=this.formattingFn(t);"INPUT"===this.el.tagName?this.el.value=i:"text"===this.el.tagName||"tspan"===this.el.tagName?this.el.textContent=i:this.el.innerHTML=i},t.prototype.ensureNumber=function(t){return"number"==typeof t&&!isNaN(t)},t.prototype.validateValue=function(t){var i=Number(t);return this.ensureNumber(i)?i:(this.error="[CountUp] invalid start or end value: "+t,null)},t.prototype.resetDuration=function(){this.startTime=null,this.duration=1e3*Number(this.options.duration),this.remaining=this.duration},t}();export{CountUp}; \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.js b/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.js deleted file mode 100644 index 1a8ac5c56..000000000 --- a/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.js +++ /dev/null @@ -1,196 +0,0 @@ -/* - - countUp.js - by @inorganik - - */ - -// target = id of html element or var of previously selected html element where counting occurs -// startVal = the value you want to begin at -// endVal = the value you want to arrive at -// decimals = number of decimal places, default 0 -// duration = duration of animation in seconds, default 2 -// options = optional object of options (see below) - -var CountUp = function(target, startVal, endVal, decimals, duration, options) { - - // make sure requestAnimationFrame and cancelAnimationFrame are defined - // polyfill for browsers without native support - // by Opera engineer Erik Möller - var lastTime = 0; - var vendors = ['webkit', 'moz', 'ms', 'o']; - for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; - window.cancelAnimationFrame = - window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; - } - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function(callback, element) { - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = window.setTimeout(function() { callback(currTime + timeToCall); }, - timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - } - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function(id) { - clearTimeout(id); - }; - } - - var self = this; - - // default options - self.options = { - useEasing : true, // toggle easing - useGrouping : true, // 1,000,000 vs 1000000 - separator : ',', // character to use as a separator - decimal : '.', // character to use as a decimal - easingFn: null, // optional custom easing closure function, default is Robert Penner's easeOutExpo - formattingFn: null // optional custom formatting function, default is self.formatNumber below - }; - // extend default options with passed options object - for (var key in options) { - if (options.hasOwnProperty(key)) { - self.options[key] = options[key]; - } - } - if (self.options.separator === '') { self.options.useGrouping = false; } - if (!self.options.prefix) self.options.prefix = ''; - if (!self.options.suffix) self.options.suffix = ''; - - self.d = (typeof target === 'string') ? document.getElementById(target) : target; - self.startVal = Number(startVal); - self.endVal = Number(endVal); - self.countDown = (self.startVal > self.endVal); - self.frameVal = self.startVal; - self.decimals = Math.max(0, decimals || 0); - self.dec = Math.pow(10, self.decimals); - self.duration = Number(duration) * 1000 || 2000; - - self.formatNumber = function(nStr) { - nStr = nStr.toFixed(self.decimals); - nStr += ''; - var x, x1, x2, rgx; - x = nStr.split('.'); - x1 = x[0]; - x2 = x.length > 1 ? self.options.decimal + x[1] : ''; - rgx = /(\d+)(\d{3})/; - if (self.options.useGrouping) { - while (rgx.test(x1)) { - x1 = x1.replace(rgx, '$1' + self.options.separator + '$2'); - } - } - return self.options.prefix + x1 + x2 + self.options.suffix; - }; - // Robert Penner's easeOutExpo - self.easeOutExpo = function(t, b, c, d) { - return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; - }; - - self.easingFn = self.options.easingFn ? self.options.easingFn : self.easeOutExpo; - self.formattingFn = self.options.formattingFn ? self.options.formattingFn : self.formatNumber; - - self.version = function () { return '1.7.1'; }; - - // Print value to target - self.printValue = function(value) { - var result = self.formattingFn(value); - - if (self.d.tagName === 'INPUT') { - this.d.value = result; - } - else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { - this.d.textContent = result; - } - else { - this.d.innerHTML = result; - } - }; - - self.count = function(timestamp) { - - if (!self.startTime) { self.startTime = timestamp; } - - self.timestamp = timestamp; - var progress = timestamp - self.startTime; - self.remaining = self.duration - progress; - - // to ease or not to ease - if (self.options.useEasing) { - if (self.countDown) { - self.frameVal = self.startVal - self.easingFn(progress, 0, self.startVal - self.endVal, self.duration); - } else { - self.frameVal = self.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); - } - } else { - if (self.countDown) { - self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); - } else { - self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); - } - } - - // don't go past endVal since progress can exceed duration in the last frame - if (self.countDown) { - self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; - } else { - self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; - } - - // decimal - self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; - - // format and print value - self.printValue(self.frameVal); - - // whether to continue - if (progress < self.duration) { - self.rAF = requestAnimationFrame(self.count); - } else { - if (self.callback) { self.callback(); } - } - }; - // start your animation - self.start = function(callback) { - self.callback = callback; - self.rAF = requestAnimationFrame(self.count); - return false; - }; - // toggles pause/resume animation - self.pauseResume = function() { - if (!self.paused) { - self.paused = true; - cancelAnimationFrame(self.rAF); - } else { - self.paused = false; - delete self.startTime; - self.duration = self.remaining; - self.startVal = self.frameVal; - requestAnimationFrame(self.count); - } - }; - // reset to startVal so animation can be run again - self.reset = function() { - self.paused = false; - delete self.startTime; - self.startVal = startVal; - cancelAnimationFrame(self.rAF); - self.printValue(self.startVal); - }; - // pass a new endVal and start animation - self.update = function (newEndVal) { - cancelAnimationFrame(self.rAF); - self.paused = false; - delete self.startTime; - self.startVal = self.frameVal; - self.endVal = Number(newEndVal); - self.countDown = (self.startVal > self.endVal); - self.rAF = requestAnimationFrame(self.count); - }; - - // format startVal on initialization - self.printValue(self.startVal); -}; \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.min.js b/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.min.js deleted file mode 100644 index 77fa8a100..000000000 --- a/src/main/resources/gwt/material/design/addins/client/countup/resources/js/countup.min.js +++ /dev/null @@ -1 +0,0 @@ -var CountUp=function(a,t,n,e,i,r){for(var o=0,s=["webkit","moz","ms","o"],m=0;mu.endVal,u.frameVal=u.startVal,u.decimals=Math.max(0,e||0),u.dec=Math.pow(10,u.decimals),u.duration=1e3*Number(i)||2e3,u.formatNumber=function(a){a=a.toFixed(u.decimals),a+="";var t,n,e,i;if(t=a.split("."),n=t[0],e=t.length>1?u.options.decimal+t[1]:"",i=/(\d+)(\d{3})/,u.options.useGrouping)for(;i.test(n);)n=n.replace(i,"$1"+u.options.separator+"$2");return u.options.prefix+n+e+u.options.suffix},u.easeOutExpo=function(a,t,n,e){return n*(-Math.pow(2,-10*a/e)+1)*1024/1023+t},u.easingFn=u.options.easingFn?u.options.easingFn:u.easeOutExpo,u.formattingFn=u.options.formattingFn?u.options.formattingFn:u.formatNumber,u.version=function(){return"1.7.1"},u.printValue=function(a){var t=u.formattingFn(a);"INPUT"===u.d.tagName?this.d.value=t:"text"===u.d.tagName||"tspan"===u.d.tagName?this.d.textContent=t:this.d.innerHTML=t},u.count=function(a){u.startTime||(u.startTime=a),u.timestamp=a;var t=a-u.startTime;u.remaining=u.duration-t,u.options.useEasing?u.countDown?u.frameVal=u.startVal-u.easingFn(t,0,u.startVal-u.endVal,u.duration):u.frameVal=u.easingFn(t,u.startVal,u.endVal-u.startVal,u.duration):u.countDown?u.frameVal=u.startVal-(u.startVal-u.endVal)*(t/u.duration):u.frameVal=u.startVal+(u.endVal-u.startVal)*(t/u.duration),u.countDown?u.frameVal=u.frameValu.endVal?u.endVal:u.frameVal,u.frameVal=Math.round(u.frameVal*u.dec)/u.dec,u.printValue(u.frameVal),tu.endVal,u.rAF=requestAnimationFrame(u.count)},u.printValue(u.startVal)}; \ No newline at end of file From 17565a576ebd4b945ed6f7801244862ac255aa30 Mon Sep 17 00:00:00 2001 From: Mark Kevin Baldemor Date: Tue, 3 Mar 2020 15:38:53 +0800 Subject: [PATCH 172/247] Input Mask upgraded version from 1.14.15 to 1.14.16 --- .../inputmask/resources/js/inputmask.js | 217 +++++++++--------- .../inputmask/resources/js/inputmask.min.js | 36 +-- 2 files changed, 126 insertions(+), 127 deletions(-) diff --git a/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.js b/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.js index 3a1a7e7b9..7e0216cbc 100644 --- a/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.js +++ b/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.js @@ -1,6 +1,6 @@ /** * jquery.mask.js - * @version: v1.14.15 + * @version: v1.14.16 * @author: Igor Escobar * * Created by Igor Escobar on 2012-03-10. Please report any bug at github.com/igorescobar/jQuery-Mask-Plugin @@ -41,7 +41,7 @@ if (typeof define === 'function' && define.amd) { define(['jquery'], factory); - } else if (typeof exports === 'object') { + } else if (typeof exports === 'object' && typeof Meteor === 'undefined') { module.exports = factory(require('jquery')); } else { factory(jQuery || Zepto); @@ -96,44 +96,44 @@ }, events: function() { el - .on('keydown.mask', function (e) { - el.data('mask-keycode', e.keyCode || e.which); - el.data('mask-previus-value', el.val()); - el.data('mask-previus-caret-pos', p.getCaret()); - p.maskDigitPosMapOld = p.maskDigitPosMap; - }) - .on($.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour) - .on('paste.mask drop.mask', function () { - setTimeout(function () { - el.keydown().keyup(); - }, 100); - }) - .on('change.mask', function () { - el.data('changed', true); - }) - .on('blur.mask', function () { - if (oldValue !== p.val() && !el.data('changed')) { - el.trigger('change'); - } - el.data('changed', false); - }) - // it's very important that this callback remains in this position - // otherwhise oldValue it's going to work buggy - .on('blur.mask', function () { - oldValue = p.val(); - }) - // select all text on focus - .on('focus.mask', function (e) { - if (options.selectOnFocus === true) { - $(e.target).select(); - } - }) - // clear the value if it not complete the mask - .on('focusout.mask', function () { - if (options.clearIfNotMatch && !regexMask.test(p.val())) { - p.val(''); - } - }); + .on('keydown.mask', function(e) { + el.data('mask-keycode', e.keyCode || e.which); + el.data('mask-previus-value', el.val()); + el.data('mask-previus-caret-pos', p.getCaret()); + p.maskDigitPosMapOld = p.maskDigitPosMap; + }) + .on($.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour) + .on('paste.mask drop.mask', function() { + setTimeout(function() { + el.keydown().keyup(); + }, 100); + }) + .on('change.mask', function(){ + el.data('changed', true); + }) + .on('blur.mask', function(){ + if (oldValue !== p.val() && !el.data('changed')) { + el.trigger('change'); + } + el.data('changed', false); + }) + // it's very important that this callback remains in this position + // otherwhise oldValue it's going to work buggy + .on('blur.mask', function() { + oldValue = p.val(); + }) + // select all text on focus + .on('focus.mask', function (e) { + if (options.selectOnFocus === true) { + $(e.target).select(); + } + }) + // clear the value if it not complete the mask + .on('focusout.mask', function() { + if (options.clearIfNotMatch && !regexMask.test(p.val())) { + p.val(''); + } + }); }, getRegexMask: function() { var maskChunks = [], translation, pattern, optional, recursive, oRecursive, r; @@ -163,7 +163,7 @@ if (oRecursive) { r = r.replace(new RegExp('(' + oRecursive.digit + '(.*' + oRecursive.digit + ')?)'), '($1)?') - .replace(new RegExp(oRecursive.digit, 'g'), oRecursive.pattern); + .replace(new RegExp(oRecursive.digit, 'g'), oRecursive.pattern); } return new RegExp(r); @@ -187,9 +187,8 @@ return r; }, - calculateCaretPosition: function () { - var oldVal = el.data('mask-previus-value') || '', - newVal = p.getMasked(), + calculateCaretPosition: function(oldVal) { + var newVal = p.getMasked(), caretPosNew = p.getCaret(); if (oldVal !== newVal) { var caretPosOld = el.data('mask-previus-caret-pos') || 0, @@ -229,15 +228,15 @@ // if the cursor is at the end keep it there if (caretPosNew > oldValL) { - caretPosNew = newValL * 10; + caretPosNew = newValL * 10; } else if (caretPosOld >= caretPosNew && caretPosOld !== oldValL) { - if (!p.maskDigitPosMapOld[caretPosNew]) { - var caretPos = caretPosNew; - caretPosNew -= maskDigitsBeforeCaretAllOld - maskDigitsBeforeCaretAll; - caretPosNew -= maskDigitsBeforeCaret; - if (p.maskDigitPosMap[caretPosNew]) { - caretPosNew = caretPos; - } + if (!p.maskDigitPosMapOld[caretPosNew]) { + var caretPos = caretPosNew; + caretPosNew -= maskDigitsBeforeCaretAllOld - maskDigitsBeforeCaretAll; + caretPosNew -= maskDigitsBeforeCaret; + if (p.maskDigitPosMap[caretPosNew]) { + caretPosNew = caretPos; + } } } else if (caretPosNew > caretPosOld) { @@ -255,12 +254,13 @@ if ($.inArray(keyCode, jMask.byPassKeys) === -1) { var newVal = p.getMasked(), - caretPos = p.getCaret(); + caretPos = p.getCaret(), + oldVal = el.data('mask-previus-value') || ''; // this is a compensation to devices/browsers that don't compensate // caret positioning the right way - setTimeout(function () { - p.setCaret(p.calculateCaretPosition()); + setTimeout(function() { + p.setCaret(p.calculateCaretPosition(oldVal)); }, $.jMaskGlobals.keyStrokeCompensation); p.val(newVal); @@ -305,7 +305,7 @@ if (translation) { if (valDigit.match(translation.pattern)) { buf[addMethod](valDigit); - if (translation.recursive) { + if (translation.recursive) { if (resetPos === -1) { resetPos = m; } else if (m === lastMaskChar && m !== resetPos) { @@ -331,7 +331,7 @@ m += offset; v -= offset; } else { - p.invalid.push({p: v, v: valDigit, e: translation.pattern}); + p.invalid.push({p: v, v: valDigit, e: translation.pattern}); } v += offset; } else { @@ -361,12 +361,12 @@ p.mapMaskdigitPositions(newVal, maskDigitPosArr, valLen); return newVal; }, - mapMaskdigitPositions: function (newVal, maskDigitPosArr, valLen) { - var maskDiff = options.reverse ? newVal.length - valLen : 0; - p.maskDigitPosMap = {}; - for (var i = 0; i < maskDigitPosArr.length; i++) { - p.maskDigitPosMap[maskDigitPosArr[i] + maskDiff] = 1; - } + mapMaskdigitPositions: function(newVal, maskDigitPosArr, valLen) { + var maskDiff = options.reverse ? newVal.length - valLen : 0; + p.maskDigitPosMap = {}; + for (var i = 0; i < maskDigitPosArr.length; i++) { + p.maskDigitPosMap[maskDigitPosArr[i] + maskDiff] = 1; + } }, callbacks: function (e) { var val = p.val(), @@ -409,15 +409,15 @@ // get value without mask jMask.getCleanVal = function() { - return p.getMasked(true); + return p.getMasked(true); }; // get masked value without the value being in the input or element jMask.getMaskedVal = function(val) { - return p.getMasked(false, val); + return p.getMasked(false, val); }; - jMask.init = function (onlyMask) { + jMask.init = function(onlyMask) { onlyMask = onlyMask || false; options = options || {}; @@ -441,7 +441,7 @@ // and then press the "back" button, the autocomplete will erase // the data. Works fine on IE9+, FF, Opera, Safari. if (el.data('mask')) { - el.attr('autocomplete', 'off'); + el.attr('autocomplete', 'off'); } // detect if is necessary let the user type freely. @@ -472,54 +472,53 @@ $.maskWatchers = {}; var HTMLAttributes = function () { - var input = $(this), - options = {}, - prefix = 'data-mask-', - mask = input.attr('data-mask'); - - if (input.attr(prefix + 'reverse')) { - options.reverse = true; - } + var input = $(this), + options = {}, + prefix = 'data-mask-', + mask = input.attr('data-mask'); - if (input.attr(prefix + 'clearifnotmatch')) { - options.clearIfNotMatch = true; - } - - if (input.attr(prefix + 'selectonfocus') === 'true') { - options.selectOnFocus = true; - } + if (input.attr(prefix + 'reverse')) { + options.reverse = true; + } - if (notSameMaskObject(input, mask, options)) { - return input.data('mask', new Mask(this, mask, options)); - } - }, - notSameMaskObject = function (field, mask, options) { - options = options || {}; - var maskObject = $(field).data('mask'), - stringify = JSON.stringify, - value = $(field).val() || $(field).text(); - try { - if (typeof mask === 'function') { - mask = mask(value); - } - return typeof maskObject !== 'object' || stringify(maskObject.options) !== stringify(options) || maskObject.mask !== mask; - } catch (e) { - } - }, - eventSupported = function (eventName) { - var el = document.createElement('div'), isSupported; + if (input.attr(prefix + 'clearifnotmatch')) { + options.clearIfNotMatch = true; + } - eventName = 'on' + eventName; - isSupported = (eventName in el); + if (input.attr(prefix + 'selectonfocus') === 'true') { + options.selectOnFocus = true; + } - if (!isSupported) { - el.setAttribute(eventName, 'return;'); - isSupported = typeof el[eventName] === 'function'; + if (notSameMaskObject(input, mask, options)) { + return input.data('mask', new Mask(this, mask, options)); + } + }, + notSameMaskObject = function(field, mask, options) { + options = options || {}; + var maskObject = $(field).data('mask'), + stringify = JSON.stringify, + value = $(field).val() || $(field).text(); + try { + if (typeof mask === 'function') { + mask = mask(value); } - el = null; + return typeof maskObject !== 'object' || stringify(maskObject.options) !== stringify(options) || maskObject.mask !== mask; + } catch (e) {} + }, + eventSupported = function(eventName) { + var el = document.createElement('div'), isSupported; + + eventName = 'on' + eventName; + isSupported = (eventName in el); + + if ( !isSupported ) { + el.setAttribute(eventName, 'return;'); + isSupported = typeof el[eventName] === 'function'; + } + el = null; - return isSupported; - }; + return isSupported; + }; $.fn.mask = function(mask, options) { options = options || {}; diff --git a/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.min.js b/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.min.js index ce86d08bc..1f22376e7 100644 --- a/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.min.js +++ b/src/main/resources/gwt/material/design/addins/client/inputmask/resources/js/inputmask.min.js @@ -1,19 +1,19 @@ -// jQuery Mask Plugin v1.14.15 +// jQuery Mask Plugin v1.14.16 // github.com/igorescobar/jQuery-Mask-Plugin -var $jscomp={scope:{},findInternal:function(a,l,d){a instanceof String&&(a=String(a));for(var p=a.length,h=0;hd?g=10*e:f>=g&&f!==d?c.maskDigitPosMapOld[g]||(f=g,g=g-(l-h)-a,c.maskDigitPosMap[g]&&(g=f)):g>f&& -(g=g+(h-l)+m)}return g},behaviour:function(f){f=f||window.event;c.invalid=[];var e=b.data("mask-keycode");if(-1===a.inArray(e,m.byPassKeys)){var e=c.getMasked(),g=c.getCaret();setTimeout(function(){c.setCaret(c.calculateCaretPosition())},a.jMaskGlobals.keyStrokeCompensation);c.val(e);c.setCaret(g);return c.callbacks(f)}},getMasked:function(a,b){var g=[],d=void 0===b?c.val():b+"",n=0,h=e.length,q=0,l=d.length,k=1,r="push",p=-1,t=0,y=[],v,z;f.reverse?(r="unshift",k=-1,v=0,n=h-1,q=l-1,z=function(){return-1< -n&&-1g?h=10*d:e>=h&&e!==g?c.maskDigitPosMapOld[h]||(e=h,h=h-(k-l)-a,c.maskDigitPosMap[h]&&(h=e)):h>e&&(h=h+(l-k)+f)}return h},behaviour:function(d){d= +d||window.event;c.invalid=[];var e=b.data("mask-keycode");if(-1===a.inArray(e,l.byPassKeys)){e=c.getMasked();var h=c.getCaret(),g=b.data("mask-previus-value")||"";setTimeout(function(){c.setCaret(c.calculateCaretPosition(g))},a.jMaskGlobals.keyStrokeCompensation);c.val(e);c.setCaret(h);return c.callbacks(d)}},getMasked:function(a,b){var h=[],f=void 0===b?c.val():b+"",g=0,k=d.length,n=0,p=f.length,m=1,r="push",u=-1,w=0;b=[];if(e.reverse){r="unshift";m=-1;var x=0;g=k-1;n=p-1;var A=function(){return-1< +g&&-1 Date: Wed, 11 Mar 2020 14:47:45 +0800 Subject: [PATCH 173/247] Migrated MaterialCombobox (SlickJs) version from 1.6.0 to 1.8.0 --- .../avatar/resources/js/jdenticon-1.3.2.js | 801 ------------------ .../resources/js/jdenticon-1.3.2.min.js | 13 - .../client/carousel/resources/js/slick.js | 244 ++++-- .../client/carousel/resources/js/slick.min.js | 19 +- 4 files changed, 179 insertions(+), 898 deletions(-) delete mode 100644 src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.js delete mode 100644 src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.min.js diff --git a/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.js b/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.js deleted file mode 100644 index 8d6357815..000000000 --- a/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.js +++ /dev/null @@ -1,801 +0,0 @@ -/** - * Jdenticon 1.3.2 - * http://jdenticon.com - * - * Built: 2015-10-10T11:55:57.451Z - * - * Copyright (c) 2014-2015 Daniel Mester Pirttijärvi - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source distribution. - * - */ - -/*jslint bitwise: true */ - -(function (global, name, factory) { - var jQuery = global["jQuery"], - jdenticon = factory(global, jQuery); - - // Node.js - if (typeof module !== "undefined" && "exports" in module) { - module["exports"] = jdenticon; - } - // RequireJS - else if (typeof define === "function" && define["amd"]) { - define([], function () { return jdenticon; }); - } - // No module loader - else { - global[name] = jdenticon; - } -})(this, "jdenticon", function (global, jQuery) { - "use strict"; - - - - - /** - * Represents a point. - * @private - * @constructor - */ - function Point(x, y) { - this.x = x; - this.y = y; - }; - - - /** - * Translates and rotates a point before being passed on to the canvas context. This was previously done by the canvas context itself, - * but this caused a rendering issue in Chrome on sizes > 256 where the rotation transformation of inverted paths was not done properly. - * @param {number} x The x-coordinate of the upper left corner of the transformed rectangle. - * @param {number} y The y-coordinate of the upper left corner of the transformed rectangle. - * @param {number} size The size of the transformed rectangle. - * @param {number} rotation Rotation specified as 0 = 0 rad, 1 = 0.5π rad, 2 = π rad, 3 = 1.5π rad - * @private - * @constructor - */ - function Transform(x, y, size, rotation) { - this._x = x; - this._y = y; - this._size = size; - this._rotation = rotation; - } - Transform.prototype = { - /** - * Transforms the specified point based on the translation and rotation specification for this Transform. - * @param {number} x x-coordinate - * @param {number} y y-coordinate - * @param {number=} w The width of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle. - * @param {number=} h The height of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle. - */ - transformPoint: function (x, y, w, h) { - var right = this._x + this._size, - bottom = this._y + this._size; - return this._rotation === 1 ? new Point(right - y - (h || 0), this._y + x) : - this._rotation === 2 ? new Point(right - x - (w || 0), bottom - y - (h || 0)) : - this._rotation === 3 ? new Point(this._x + y, bottom - x - (w || 0)) : - new Point(this._x + x, this._y + y); - } - }; - Transform.noTransform = new Transform(0, 0, 0, 0); - - - - /** - * Provides helper functions for rendering common basic shapes. - * @private - * @constructor - */ - function Graphics(renderer) { - this._renderer = renderer; - this._transform = Transform.noTransform; - } - Graphics.prototype = { - /** - * Adds a polygon to the underlying renderer. - * @param {Array} points The points of the polygon clockwise on the format [ x0, y0, x1, y1, ..., xn, yn ] - * @param {boolean=} invert Specifies if the polygon will be inverted. - */ - addPolygon: function (points, invert) { - var di = invert ? -2 : 2, - transform = this._transform, - transformedPoints = [], - i; - - for (i = invert ? points.length - 2 : 0; i < points.length && i >= 0; i += di) { - transformedPoints.push(transform.transformPoint(points[i], points[i + 1])); - } - - this._renderer.addPolygon(transformedPoints); - }, - - /** - * Adds a polygon to the underlying renderer. - * Source: http://stackoverflow.com/a/2173084 - * @param {number} x The x-coordinate of the upper left corner of the rectangle holding the entire ellipse. - * @param {number} y The y-coordinate of the upper left corner of the rectangle holding the entire ellipse. - * @param {number} size The size of the ellipse. - * @param {boolean=} invert Specifies if the ellipse will be inverted. - */ - addCircle: function (x, y, size, invert) { - var p = this._transform.transformPoint(x, y, size, size); - this._renderer.addCircle(p, size, invert); - }, - - /** - * Adds a rectangle to the underlying renderer. - * @param {number} x The x-coordinate of the upper left corner of the rectangle. - * @param {number} y The y-coordinate of the upper left corner of the rectangle. - * @param {number} w The width of the rectangle. - * @param {number} h The height of the rectangle. - * @param {boolean=} invert Specifies if the rectangle will be inverted. - */ - addRectangle: function (x, y, w, h, invert) { - this.addPolygon([ - x, y, - x + w, y, - x + w, y + h, - x, y + h - ], invert); - }, - - /** - * Adds a right triangle to the underlying renderer. - * @param {number} x The x-coordinate of the upper left corner of the rectangle holding the triangle. - * @param {number} y The y-coordinate of the upper left corner of the rectangle holding the triangle. - * @param {number} w The width of the triangle. - * @param {number} h The height of the triangle. - * @param {number} r The rotation of the triangle (clockwise). 0 = right corner of the triangle in the lower left corner of the bounding rectangle. - * @param {boolean=} invert Specifies if the triangle will be inverted. - */ - addTriangle: function (x, y, w, h, r, invert) { - var points = [ - x + w, y, - x + w, y + h, - x, y + h, - x, y - ]; - points.splice(((r || 0) % 4) * 2, 2); - this.addPolygon(points, invert); - }, - - /** - * Adds a rhombus to the underlying renderer. - * @param {number} x The x-coordinate of the upper left corner of the rectangle holding the rhombus. - * @param {number} y The y-coordinate of the upper left corner of the rectangle holding the rhombus. - * @param {number} w The width of the rhombus. - * @param {number} h The height of the rhombus. - * @param {boolean=} invert Specifies if the rhombus will be inverted. - */ - addRhombus: function (x, y, w, h, invert) { - this.addPolygon([ - x + w / 2, y, - x + w, y + h / 2, - x + w / 2, y + h, - x, y + h / 2 - ], invert); - } - }; - - - - - var shapes = { - center: [ - /** @param {Graphics} g */ - function (g, cell, index) { - var k = cell * 0.42; - g.addPolygon([ - 0, 0, - cell, 0, - cell, cell - k * 2, - cell - k, cell, - 0, cell - ]); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var w = 0 | (cell * 0.5), - h = 0 | (cell * 0.8); - g.addTriangle(cell - w, 0, w, h, 2); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var s = 0 | (cell / 3); - g.addRectangle(s, s, cell - s, cell - s); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var inner = 0 | (cell * 0.1), - outer = 0 | (cell * 0.25); - g.addRectangle(outer, outer, cell - inner - outer, cell - inner - outer); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var m = 0 | (cell * 0.15), - s = 0 | (cell * 0.5); - g.addCircle(cell - s - m, cell - s - m, s); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var inner = cell * 0.1, - outer = inner * 4; - - g.addRectangle(0, 0, cell, cell); - g.addPolygon([ - outer, outer, - cell - inner, outer, - outer + (cell - outer - inner) / 2, cell - inner - ], true); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - g.addPolygon([ - 0, 0, - cell, 0, - cell, cell * 0.7, - cell * 0.4, cell * 0.4, - cell * 0.7, cell, - 0, cell - ]); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - g.addTriangle(cell / 2, cell / 2, cell / 2, cell / 2, 3); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - g.addRectangle(0, 0, cell, cell / 2); - g.addRectangle(0, cell / 2, cell / 2, cell / 2); - g.addTriangle(cell / 2, cell / 2, cell / 2, cell / 2, 1); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var inner = 0 | (cell * 0.14), - outer = 0 | (cell * 0.35); - g.addRectangle(0, 0, cell, cell); - g.addRectangle(outer, outer, cell - outer - inner, cell - outer - inner, true); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var inner = cell * 0.12, - outer = inner * 3; - - g.addRectangle(0, 0, cell, cell); - g.addCircle(outer, outer, cell - inner - outer, true); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - g.addTriangle(cell / 2, cell / 2, cell / 2, cell / 2, 3); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var m = cell * 0.25; - g.addRectangle(0, 0, cell, cell); - g.addRhombus(m, m, cell - m, cell - m, true); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var m = cell * 0.4, s = cell * 1.2; - if (!index) { - g.addCircle(m, m, s); - } - } - ], - - outer: [ - /** @param {Graphics} g */ - function (g, cell, index) { - g.addTriangle(0, 0, cell, cell, 0); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - g.addTriangle(0, cell / 2, cell, cell / 2, 0); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - g.addRhombus(0, 0, cell, cell); - }, - /** @param {Graphics} g */ - function (g, cell, index) { - var m = cell / 6; - g.addCircle(m, m, cell - 2 * m); - } - ] - }; - - - - - function decToHex(v) { - v |= 0; // Ensure integer value - return v < 0 ? "00" : - v < 16 ? "0" + v.toString(16) : - v < 256 ? v.toString(16) : - "ff"; - } - - function hueToRgb(m1, m2, h) { - h = h < 0 ? h + 6 : h > 6 ? h - 6 : h; - return decToHex(255 * ( - h < 1 ? m1 + (m2 - m1) * h : - h < 3 ? m2 : - h < 4 ? m1 + (m2 - m1) * (4 - h) : - m1)); - } - - /** - * Functions for converting colors to hex-rgb representations. - * @private - */ - var color = { - /** - * @param {number} r Red channel [0, 255] - * @param {number} g Green channel [0, 255] - * @param {number} b Blue channel [0, 255] - */ - rgb: function (r, g, b) { - return "#" + decToHex(r) + decToHex(g) + decToHex(b); - }, - /** - * @param h Hue [0, 1] - * @param s Saturation [0, 1] - * @param l Lightness [0, 1] - */ - hsl: function (h, s, l) { - // Based on http://www.w3.org/TR/2011/REC-css3-color-20110607/#hsl-color - if (s == 0) { - var partialHex = decToHex(l * 255); - return "#" + partialHex + partialHex + partialHex; - } - else { - var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s, - m1 = l * 2 - m2; - return "#" + - hueToRgb(m1, m2, h * 6 + 2) + - hueToRgb(m1, m2, h * 6) + - hueToRgb(m1, m2, h * 6 - 2); - } - }, - // This function will correct the lightness for the "dark" hues - correctedHsl: function (h, s, l) { - // The corrector specifies the perceived middle lightnesses for each hue - var correctors = [ 0.55, 0.5, 0.5, 0.46, 0.6, 0.55, 0.55 ], - corrector = correctors[(h * 6 + 0.5) | 0]; - - // Adjust the input lightness relative to the corrector - l = l < 0.5 ? l * corrector * 2 : corrector + (l - 0.5) * (1 - corrector) * 2; - - return color.hsl(h, s, l); - } - }; - - - - - /** - * Gets a set of identicon color candidates for a specified hue and config. - */ - function colorTheme(hue, config) { - return [ - // Dark gray - color.hsl(0, 0, config.grayscaleLightness(0)), - // Mid color - color.correctedHsl(hue, config.saturation, config.colorLightness(0.5)), - // Light gray - color.hsl(0, 0, config.grayscaleLightness(1)), - // Light color - color.correctedHsl(hue, config.saturation, config.colorLightness(1)), - // Dark color - color.correctedHsl(hue, config.saturation, config.colorLightness(0)) - ]; - } - - - - - /** - * Draws an identicon to a specified renderer. - */ - function iconGenerator(renderer, hash, x, y, size, padding, config) { - var undefined; - - // Calculate padding - padding = (size * (padding === undefined ? 0.08 : padding)) | 0; - size -= padding * 2; - - // Sizes smaller than 30 px are not supported. If really needed, apply a scaling transformation - // to the context before passing it to this function. - if (size < 30) { - throw new Error("Jdenticon cannot render identicons smaller than 30 pixels."); - } - if (!/^[0-9a-f]{11,}$/i.test(hash)) { - throw new Error("Invalid hash passed to Jdenticon."); - } - - var graphics = new Graphics(renderer); - - // Calculate cell size and ensure it is an integer - var cell = 0 | (size / 4); - - // Since the cell size is integer based, the actual icon will be slightly smaller than specified => center icon - x += 0 | (padding + size / 2 - cell * 2); - y += 0 | (padding + size / 2 - cell * 2); - - function renderShape(colorIndex, shapes, index, rotationIndex, positions) { - var r = rotationIndex ? parseInt(hash.charAt(rotationIndex), 16) : 0, - shape = shapes[parseInt(hash.charAt(index), 16) % shapes.length], - i; - - renderer.beginShape(availableColors[selectedColorIndexes[colorIndex]]); - - for (i = 0; i < positions.length; i++) { - graphics._transform = new Transform(x + positions[i][0] * cell, y + positions[i][1] * cell, cell, r++ % 4); - shape(graphics, cell, i); - } - - renderer.endShape(); - } - - // AVAILABLE COLORS - var hue = parseInt(hash.substr(-7), 16) / 0xfffffff, - - // Available colors for this icon - availableColors = colorTheme(hue, config), - - // The index of the selected colors - selectedColorIndexes = [], - index; - - function isDuplicate(values) { - if (values.indexOf(index) >= 0) { - for (var i = 0; i < values.length; i++) { - if (selectedColorIndexes.indexOf(values[i]) >= 0) { - return true; - } - } - } - } - - for (var i = 0; i < 3; i++) { - index = parseInt(hash.charAt(8 + i), 16) % availableColors.length; - if (isDuplicate([0, 4]) || // Disallow dark gray and dark color combo - isDuplicate([2, 3])) { // Disallow light gray and light color combo - index = 1; - } - selectedColorIndexes.push(index); - } - - // ACTUAL RENDERING - // Sides - renderShape(0, shapes.outer, 2, 3, [[1, 0], [2, 0], [2, 3], [1, 3], [0, 1], [3, 1], [3, 2], [0, 2]]); - // Corners - renderShape(1, shapes.outer, 4, 5, [[0, 0], [3, 0], [3, 3], [0, 3]]); - // Center - renderShape(2, shapes.center, 1, null, [[1, 1], [2, 1], [2, 2], [1, 2]]); - }; - - - - /** - * Represents an SVG path element. - * @private - * @constructor - */ - function SvgPath() { - /** - * This property holds the data string (path.d) of the SVG path. - */ - this.dataString = ""; - } - SvgPath.prototype = { - /** - * Adds a polygon with the current fill color to the SVG path. - * @param points An array of Point objects. - */ - addPolygon: function (points) { - var dataString = "M" + points[0].x + " " + points[0].y; - for (var i = 1; i < points.length; i++) { - dataString += "L" + points[i].x + " " + points[i].y; - } - this.dataString += dataString + "Z"; - }, - /** - * Adds a circle with the current fill color to the SVG path. - * @param {Point} point The upper left corner of the circle bounding box. - * @param {number} diameter The diameter of the circle. - * @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path). - */ - addCircle: function (point, diameter, counterClockwise) { - var sweepFlag = counterClockwise ? 0 : 1, - radius = diameter / 2; - this.dataString += - "M" + (point.x) + " " + (point.y + radius) + - "a" + radius + "," + radius + " 0 1," + sweepFlag + " " + diameter + ",0" + - "a" + radius + "," + radius + " 0 1," + sweepFlag + " " + (-diameter) + ",0"; - } - }; - - - - /** - * Renderer producing SVG output. - * @private - * @constructor - */ - function SvgRenderer(width, height) { - this._pathsByColor = { }; - this._size = { w: width, h: height }; - } - SvgRenderer.prototype = { - /** - * Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape. - * @param {string} color Fill color on format #xxxxxx. - */ - beginShape: function (color) { - this._path = this._pathsByColor[color] || (this._pathsByColor[color] = new SvgPath()); - }, - /** - * Marks the end of the currently drawn shape. - */ - endShape: function () { }, - /** - * Adds a polygon with the current fill color to the SVG. - * @param points An array of Point objects. - */ - addPolygon: function (points) { - this._path.addPolygon(points); - }, - /** - * Adds a circle with the current fill color to the SVG. - * @param {Point} point The upper left corner of the circle bounding box. - * @param {number} diameter The diameter of the circle. - * @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path). - */ - addCircle: function (point, diameter, counterClockwise) { - this._path.addCircle(point, diameter, counterClockwise); - }, - /** - * Gets the rendered image as an SVG string. - * @param {boolean=} fragment If true, the container svg element is not included in the result. - */ - toSvg: function (fragment) { - var svg = fragment ? '' : - ''; - - for (var color in this._pathsByColor) { - svg += ''; - } - - return fragment ? svg : - svg + ''; - } - }; - - - - /** - * Renderer redirecting drawing commands to a canvas context. - * @private - * @constructor - */ - function CanvasRenderer(ctx, width, height) { - this._ctx = ctx; - ctx.clearRect(0, 0, width, height); - } - CanvasRenderer.prototype = { - /** - * Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape. - * @param {string} color Fill color on format #xxxxxx. - */ - beginShape: function (color) { - this._ctx.fillStyle = color; - this._ctx.beginPath(); - }, - /** - * Marks the end of the currently drawn shape. This causes the queued paths to be rendered on the canvas. - */ - endShape: function () { - this._ctx.fill(); - }, - /** - * Adds a polygon to the rendering queue. - * @param points An array of Point objects. - */ - addPolygon: function (points) { - var ctx = this._ctx, i; - ctx.moveTo(points[0].x, points[0].y); - for (i = 1; i < points.length; i++) { - ctx.lineTo(points[i].x, points[i].y); - } - ctx.closePath(); - }, - /** - * Adds a circle to the rendering queue. - * @param {Point} point The upper left corner of the circle bounding box. - * @param {number} diameter The diameter of the circle. - * @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path). - */ - addCircle: function (point, diameter, counterClockwise) { - var ctx = this._ctx, - radius = diameter / 2; - ctx.arc(point.x + radius, point.y + radius, radius, 0, Math.PI * 2, counterClockwise); - ctx.closePath(); - } - }; - - - - - - - var /** @const */ - HASH_ATTRIBUTE = "data-jdenticon-hash", - supportsQuerySelectorAll = "document" in global && "querySelectorAll" in document; - - /** - * Gets the normalized current Jdenticon color configuration. Missing fields have default values. - */ - function getCurrentConfig() { - var configObject = jdenticon["config"] || global["jdenticon_config"] || { }, - lightnessConfig = configObject["lightness"] || { }, - saturation = configObject["saturation"]; - - /** - * Creates a lightness range. - */ - function lightness(configName, defaultMin, defaultMax) { - var range = lightnessConfig[configName] instanceof Array ? lightnessConfig[configName] : [defaultMin, defaultMax]; - - /** - * Gets a lightness relative the specified value in the specified lightness range. - */ - return function (value) { - value = range[0] + value * (range[1] - range[0]); - return value < 0 ? 0 : value > 1 ? 1 : value; - }; - } - - return { - saturation: typeof saturation == "number" ? saturation : 0.5, - colorLightness: lightness("color", 0.4, 0.8), - grayscaleLightness: lightness("grayscale", 0.3, 0.9) - } - } - - /** - * Updates the identicon in the specified canvas or svg elements. - * @param {string=} hash Optional hash to be rendered. If not specified, the hash specified by the data-jdenticon-hash is used. - * @param {number=} padding Optional padding in percents. Extra padding might be added to center the rendered identicon. - */ - function update(el, hash, padding) { - if (typeof(el) === "string") { - if (supportsQuerySelectorAll) { - var elements = document.querySelectorAll(el); - for (var i = 0; i < elements.length; i++) { - update(elements[i], hash, padding); - } - } - return; - } - if (!el || !el["tagName"]) { - // No element found - return; - } - hash = hash || el.getAttribute(HASH_ATTRIBUTE); - if (!hash) { - // No hash specified - return; - } - - var isSvg = el["tagName"].toLowerCase() == "svg", - isCanvas = el["tagName"].toLowerCase() == "canvas"; - - // Ensure we have a supported element - if (!isSvg && !(isCanvas && "getContext" in el)) { - return; - } - - var width = Number(el.getAttribute("width")) || el.clientWidth || 0, - height = Number(el.getAttribute("height")) || el.clientHeight || 0, - renderer = isSvg ? new SvgRenderer(width, height) : new CanvasRenderer(el.getContext("2d"), width, height), - size = Math.min(width, height); - - // Draw icon - iconGenerator(renderer, hash, 0, 0, size, padding, getCurrentConfig()); - - // SVG needs postprocessing - if (isSvg) { - // Parse svg to a temporary span element. - // Simply using innerHTML does unfortunately not work on IE. - var wrapper = document.createElement("span"); - wrapper.innerHTML = renderer.toSvg(false); - - // Then replace the content of the target element with the parsed svg. - while (el.firstChild) { - el.removeChild(el.firstChild); - } - var newNodes = wrapper.firstChild.childNodes; - while (newNodes.length) { - el.appendChild(newNodes[0]); - } - - // Set viewBox attribute to ensure the svg scales nicely. - el.setAttribute("viewBox", "0 0 " + width + " " + height); - } - } - - /** - * Draws an identicon to a context. - */ - function drawIcon(ctx, hash, size) { - if (!ctx) { - throw new Error("No canvas specified."); - } - - var renderer = new CanvasRenderer(ctx, size, size); - iconGenerator(renderer, hash, 0, 0, size, 0, getCurrentConfig()); - } - - /** - * Draws an identicon to a context. - * @param {number=} padding Optional padding in percents. Extra padding might be added to center the rendered identicon. - */ - function toSvg(hash, size, padding) { - var renderer = new SvgRenderer(size, size); - iconGenerator(renderer, hash, 0, 0, size, padding, getCurrentConfig()); - return renderer.toSvg(); - } - - /** - * Updates all canvas elements with the data-jdenticon-hash attribute. - */ - function jdenticon() { - if (supportsQuerySelectorAll) { - update("svg[" + HASH_ATTRIBUTE + "],canvas[" + HASH_ATTRIBUTE + "]"); - } - } - - // Public API - jdenticon["drawIcon"] = drawIcon; - jdenticon["toSvg"] = toSvg; - jdenticon["update"] = update; - jdenticon["version"] = "1.3.2"; - - // Basic jQuery plugin - if (jQuery) { - jQuery["fn"]["jdenticon"] = function (hash, padding) { - this["each"](function (index, el) { - update(el, hash, padding); - }); - return this; - }; - } - - // Schedule to render all identicons on the page once it has been loaded. - if (typeof setTimeout === "function") { - setTimeout(jdenticon, 0); - } - - return jdenticon; - -}); \ No newline at end of file diff --git a/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.min.js b/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.min.js deleted file mode 100644 index 739b92fbd..000000000 --- a/src/main/resources/gwt/material/design/addins/client/avatar/resources/js/jdenticon-1.3.2.min.js +++ /dev/null @@ -1,13 +0,0 @@ -// Jdenticon 1.3.2 | jdenticon.com | zlib licensed | (c) 2014-2015 Daniel Mester Pirttijärvi -(function(k,g,h){var l=h(k,k.jQuery);"undefined"!==typeof module&&"exports"in module?module.exports=l:"function"===typeof define&&define.amd?define([],function(){return l}):k[g]=l})(this,"jdenticon",function(k,g){function h(b,a){this.x=b;this.y=a}function l(b,a,c,d){this.o=b;this.s=a;this.f=c;this.l=d}function A(b){this.C=b;this.m=l.O}function m(b){b|=0;return 0>b?"00":16>b?"0"+b.toString(16):256>b?b.toString(16):"ff"}function q(b,a,c){c=0>c?c+6:6c?b+(a-b)*c:3>c?a:4>c?b+(a- -b)*(4-c):b))}function D(b,a){return[n.w(0,0,a.H(0)),n.v(b,a.A,a.u(.5)),n.w(0,0,a.H(1)),n.v(b,a.A,a.u(1)),n.v(b,a.A,a.u(0))]}function r(b,a,c,d,t){var f=0,u=0;function v(c,d,t,e,g){e=e?parseInt(a.charAt(e),16):0;d=d[parseInt(a.charAt(t),16)%d.length];b.F(n[m[c]]);for(c=0;cc)throw Error("Jdenticon cannot render identicons smaller than 30 pixels."); -if(!/^[0-9a-f]{11,}$/i.test(a))throw Error("Invalid hash passed to Jdenticon.");var k=new A(b),h=0|c/4,f=f+(0|d+c/2-2*h),u=u+(0|d+c/2-2*h),n=D(parseInt(a.substr(-7),16)/268435455,t),m=[],g;for(c=0;3>c;c++){g=parseInt(a.charAt(8+c),16)%n.length;if(e([0,4])||e([2,3]))g=1;m.push(g)}v(0,w.J,2,3,[[1,0],[2,0],[2,3],[1,3],[0,1],[3,1],[3,2],[0,2]]);v(1,w.J,4,5,[[0,0],[3,0],[3,3],[0,3]]);v(2,w.N,1,null,[[1,1],[2,1],[2,2],[1,2]])}function B(){this.i=""}function x(b,a){this.j={};this.f={M:b,I:a}}function y(b, -a,c){this.h=b;b.clearRect(0,0,a,c)}function z(){function b(a,b,f){var e=c[a]instanceof Array?c[a]:[b,f];return function(a){a=e[0]+a*(e[1]-e[0]);return 0>a?0:1=c?c*(a+1):c+a-c*a;c=2*c-a;return"#"+q(c,a,6*b+2)+q(c,a,6*b)+q(c,a,6*b-2)},v:function(b,a,c){var d=[.55,.5,.5,.46,.6,.55,.55][6*b+.5|0];return n.w(b,a,.5>c?c*d*2:d+(c-.5)*(1-d)*2)}};B.prototype={a:function(b){for(var a="M"+b[0].x+" "+b[0].y,c=1;c< -b.length;c++)a+="L"+b[c].x+" "+b[c].y;this.i+=a+"Z"},b:function(b,a,c){c=c?0:1;var d=a/2;this.i+="M"+b.x+" "+(b.y+d)+"a"+d+","+d+" 0 1,"+c+" "+a+",0a"+d+","+d+" 0 1,"+c+" "+-a+",0"}};x.prototype={F:function(b){this.B=this.j[b]||(this.j[b]=new B)},G:function(){},a:function(b){this.B.a(b)},b:function(b,a,c){this.B.b(b,a,c)},K:function(b){var a=b?"":'', -c;for(c in this.j)a+='';return b?a:a+""}};y.prototype={F:function(b){this.h.fillStyle=b;this.h.beginPath()},G:function(){this.h.fill()},a:function(b){var a=this.h,c;a.moveTo(b[0].x,b[0].y);for(c=1;cPrevious', - nextArrow: '', + prevArrow: '', + nextArrow: '', autoplay: false, autoplaySpeed: 3000, centerMode: false, centerPadding: '50px', cssEase: 'ease', customPaging: function(slider, i) { - return $('',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(b,c){return a('',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('