diff --git a/admin/themes/default/fonts/FontAwesome.otf b/admin/themes/default/fonts/FontAwesome.otf
index f7936cc1e7..401ec0f36e 100644
Binary files a/admin/themes/default/fonts/FontAwesome.otf and b/admin/themes/default/fonts/FontAwesome.otf differ
diff --git a/admin/themes/default/fonts/fontawesome-webfont.eot b/admin/themes/default/fonts/fontawesome-webfont.eot
index 33b2bb8005..e9f60ca953 100644
Binary files a/admin/themes/default/fonts/fontawesome-webfont.eot and b/admin/themes/default/fonts/fontawesome-webfont.eot differ
diff --git a/admin/themes/default/fonts/fontawesome-webfont.svg b/admin/themes/default/fonts/fontawesome-webfont.svg
index 1ee89d4368..855c845e53 100644
--- a/admin/themes/default/fonts/fontawesome-webfont.svg
+++ b/admin/themes/default/fonts/fontawesome-webfont.svg
@@ -1,565 +1,2671 @@
-
diff --git a/admin/themes/default/fonts/fontawesome-webfont.ttf b/admin/themes/default/fonts/fontawesome-webfont.ttf
index ed9372f8ea..35acda2fa1 100644
Binary files a/admin/themes/default/fonts/fontawesome-webfont.ttf and b/admin/themes/default/fonts/fontawesome-webfont.ttf differ
diff --git a/admin/themes/default/fonts/fontawesome-webfont.woff b/admin/themes/default/fonts/fontawesome-webfont.woff
index 8b280b98fa..400014a4b0 100644
Binary files a/admin/themes/default/fonts/fontawesome-webfont.woff and b/admin/themes/default/fonts/fontawesome-webfont.woff differ
diff --git a/admin/themes/default/fonts/fontawesome-webfont.woff2 b/admin/themes/default/fonts/fontawesome-webfont.woff2
index 3311d58514..4d13fc6040 100644
Binary files a/admin/themes/default/fonts/fontawesome-webfont.woff2 and b/admin/themes/default/fonts/fontawesome-webfont.woff2 differ
diff --git a/admin/themes/default/sass/vendor/font-awesome/_bordered-pulled.scss b/admin/themes/default/sass/vendor/font-awesome/_bordered-pulled.scss
index 9d3fdf3a0b..d4b85a02f2 100644
--- a/admin/themes/default/sass/vendor/font-awesome/_bordered-pulled.scss
+++ b/admin/themes/default/sass/vendor/font-awesome/_bordered-pulled.scss
@@ -7,6 +7,15 @@
border-radius: .1em;
}
+.#{$fa-css-prefix}-pull-left { float: left; }
+.#{$fa-css-prefix}-pull-right { float: right; }
+
+.#{$fa-css-prefix} {
+ &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
+ &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
+}
+
+/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
diff --git a/admin/themes/default/sass/vendor/font-awesome/_core.scss b/admin/themes/default/sass/vendor/font-awesome/_core.scss
index 5a2db9d561..7425ef85fc 100644
--- a/admin/themes/default/sass/vendor/font-awesome/_core.scss
+++ b/admin/themes/default/sass/vendor/font-awesome/_core.scss
@@ -3,11 +3,10 @@
.#{$fa-css-prefix} {
display: inline-block;
- font: normal normal normal #{$fa-font-size-base}/1 FontAwesome; // shortening font declaration
+ font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
- transform: translate(0, 0); // ensures no half-pixel rendering in firefox
}
diff --git a/admin/themes/default/sass/vendor/font-awesome/_icons.scss b/admin/themes/default/sass/vendor/font-awesome/_icons.scss
index fbcfe81237..e63e702c4d 100644
--- a/admin/themes/default/sass/vendor/font-awesome/_icons.scss
+++ b/admin/themes/default/sass/vendor/font-awesome/_icons.scss
@@ -163,6 +163,7 @@
.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
+.#{$fa-css-prefix}-feed:before,
.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
@@ -437,7 +438,7 @@
.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
-.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
+.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }
.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
@@ -487,11 +488,14 @@
.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
.#{$fa-css-prefix}-ra:before,
+.#{$fa-css-prefix}-resistance:before,
.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
.#{$fa-css-prefix}-ge:before,
.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
+.#{$fa-css-prefix}-y-combinator-square:before,
+.#{$fa-css-prefix}-yc-square:before,
.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
@@ -502,7 +506,6 @@
.#{$fa-css-prefix}-send-o:before,
.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
-.#{$fa-css-prefix}-genderless:before,
.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
@@ -573,6 +576,7 @@
.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
+.#{$fa-css-prefix}-intersex:before,
.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
@@ -582,6 +586,7 @@
.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
+.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
@@ -594,3 +599,191 @@
.#{$fa-css-prefix}-train:before { content: $fa-var-train; }
.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
+.#{$fa-css-prefix}-yc:before,
+.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
+.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
+.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
+.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
+.#{$fa-css-prefix}-battery-4:before,
+.#{$fa-css-prefix}-battery:before,
+.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
+.#{$fa-css-prefix}-battery-3:before,
+.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
+.#{$fa-css-prefix}-battery-2:before,
+.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
+.#{$fa-css-prefix}-battery-1:before,
+.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
+.#{$fa-css-prefix}-battery-0:before,
+.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
+.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
+.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
+.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
+.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
+.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
+.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
+.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
+.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
+.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
+.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
+.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
+.#{$fa-css-prefix}-hourglass-1:before,
+.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
+.#{$fa-css-prefix}-hourglass-2:before,
+.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
+.#{$fa-css-prefix}-hourglass-3:before,
+.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
+.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
+.#{$fa-css-prefix}-hand-grab-o:before,
+.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
+.#{$fa-css-prefix}-hand-stop-o:before,
+.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
+.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
+.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
+.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
+.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
+.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
+.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
+.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
+.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
+.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
+.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
+.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
+.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
+.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
+.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
+.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
+.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
+.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
+.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
+.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
+.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
+.#{$fa-css-prefix}-tv:before,
+.#{$fa-css-prefix}-television:before { content: $fa-var-television; }
+.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
+.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
+.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
+.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
+.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
+.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
+.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
+.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
+.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
+.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
+.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
+.#{$fa-css-prefix}-map:before { content: $fa-var-map; }
+.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
+.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
+.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
+.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
+.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
+.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
+.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }
+.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }
+.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }
+.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }
+.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }
+.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }
+.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }
+.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }
+.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }
+.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }
+.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }
+.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }
+.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }
+.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }
+.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }
+.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }
+.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }
+.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }
+.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }
+.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }
+.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }
+.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }
+.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }
+.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }
+.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }
+.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }
+.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }
+.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }
+.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }
+.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }
+.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }
+.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }
+.#{$fa-css-prefix}-asl-interpreting:before,
+.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }
+.#{$fa-css-prefix}-deafness:before,
+.#{$fa-css-prefix}-hard-of-hearing:before,
+.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }
+.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }
+.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }
+.#{$fa-css-prefix}-signing:before,
+.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }
+.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }
+.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }
+.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }
+.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }
+.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }
+.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }
+.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
+.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }
+.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }
+.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }
+.#{$fa-css-prefix}-google-plus-circle:before,
+.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }
+.#{$fa-css-prefix}-fa:before,
+.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }
+.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; }
+.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; }
+.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; }
+.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; }
+.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; }
+.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; }
+.#{$fa-css-prefix}-vcard:before,
+.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; }
+.#{$fa-css-prefix}-vcard-o:before,
+.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; }
+.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; }
+.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; }
+.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; }
+.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; }
+.#{$fa-css-prefix}-drivers-license:before,
+.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; }
+.#{$fa-css-prefix}-drivers-license-o:before,
+.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; }
+.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; }
+.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; }
+.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; }
+.#{$fa-css-prefix}-thermometer-4:before,
+.#{$fa-css-prefix}-thermometer:before,
+.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; }
+.#{$fa-css-prefix}-thermometer-3:before,
+.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; }
+.#{$fa-css-prefix}-thermometer-2:before,
+.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; }
+.#{$fa-css-prefix}-thermometer-1:before,
+.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; }
+.#{$fa-css-prefix}-thermometer-0:before,
+.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; }
+.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; }
+.#{$fa-css-prefix}-bathtub:before,
+.#{$fa-css-prefix}-s15:before,
+.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; }
+.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; }
+.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; }
+.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; }
+.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; }
+.#{$fa-css-prefix}-times-rectangle:before,
+.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; }
+.#{$fa-css-prefix}-times-rectangle-o:before,
+.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; }
+.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; }
+.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; }
+.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; }
+.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; }
+.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; }
+.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; }
+.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; }
+.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; }
+.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; }
+.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; }
+.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; }
diff --git a/admin/themes/default/sass/vendor/font-awesome/_mixins.scss b/admin/themes/default/sass/vendor/font-awesome/_mixins.scss
index 6b7f160931..c3bbd5745d 100644
--- a/admin/themes/default/sass/vendor/font-awesome/_mixins.scss
+++ b/admin/themes/default/sass/vendor/font-awesome/_mixins.scss
@@ -3,25 +3,58 @@
@mixin fa-icon() {
display: inline-block;
- font: normal normal normal #{$fa-font-size-base}/1 FontAwesome; // shortening font declaration
+ font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
- transform: translate(0, 0); // ensures no half-pixel rendering in firefox
}
@mixin fa-icon-rotate($degrees, $rotation) {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
-webkit-transform: rotate($degrees);
-ms-transform: rotate($degrees);
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
-webkit-transform: scale($horiz, $vert);
-ms-transform: scale($horiz, $vert);
transform: scale($horiz, $vert);
}
+
+
+// Only display content to screen readers. A la Bootstrap 4.
+//
+// See: http://a11yproject.com/posts/how-to-hide-content/
+
+@mixin sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0,0,0,0);
+ border: 0;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+//
+// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+//
+// Credit: HTML5 Boilerplate
+
+@mixin sr-only-focusable {
+ &:active,
+ &:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+ }
+}
diff --git a/admin/themes/default/sass/vendor/font-awesome/_screen-reader.scss b/admin/themes/default/sass/vendor/font-awesome/_screen-reader.scss
new file mode 100644
index 0000000000..637426f0da
--- /dev/null
+++ b/admin/themes/default/sass/vendor/font-awesome/_screen-reader.scss
@@ -0,0 +1,5 @@
+// Screen Readers
+// -------------------------
+
+.sr-only { @include sr-only(); }
+.sr-only-focusable { @include sr-only-focusable(); }
diff --git a/admin/themes/default/sass/vendor/font-awesome/_variables.scss b/admin/themes/default/sass/vendor/font-awesome/_variables.scss
index 7778fe14a2..07ff1c3f2d 100644
--- a/admin/themes/default/sass/vendor/font-awesome/_variables.scss
+++ b/admin/themes/default/sass/vendor/font-awesome/_variables.scss
@@ -2,22 +2,29 @@
// --------------------------
$fa-font-path: "../fonts" !default;
-$img-path: "../img" !default;
$fa-font-size-base: 14px !default;
-//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts" !default; // for referencing Bootstrap CDN font files directly
-$fa-css-prefix: fa !default;
-$fa-version: "4.3.0" !default;
+$fa-line-height-base: 1 !default;
+//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly
+$fa-css-prefix: icon !default;
+$fa-version: "4.7.0" !default;
$fa-border-color: #eee !default;
$fa-inverse: #fff !default;
$fa-li-width: (30em / 14) !default;
+$fa-var-500px: "\f26e";
+$fa-var-address-book: "\f2b9";
+$fa-var-address-book-o: "\f2ba";
+$fa-var-address-card: "\f2bb";
+$fa-var-address-card-o: "\f2bc";
$fa-var-adjust: "\f042";
$fa-var-adn: "\f170";
$fa-var-align-center: "\f037";
$fa-var-align-justify: "\f039";
$fa-var-align-left: "\f036";
$fa-var-align-right: "\f038";
+$fa-var-amazon: "\f270";
$fa-var-ambulance: "\f0f9";
+$fa-var-american-sign-language-interpreting: "\f2a3";
$fa-var-anchor: "\f13d";
$fa-var-android: "\f17b";
$fa-var-angellist: "\f209";
@@ -48,16 +55,34 @@ $fa-var-arrows: "\f047";
$fa-var-arrows-alt: "\f0b2";
$fa-var-arrows-h: "\f07e";
$fa-var-arrows-v: "\f07d";
+$fa-var-asl-interpreting: "\f2a3";
+$fa-var-assistive-listening-systems: "\f2a2";
$fa-var-asterisk: "\f069";
$fa-var-at: "\f1fa";
+$fa-var-audio-description: "\f29e";
$fa-var-automobile: "\f1b9";
$fa-var-backward: "\f04a";
+$fa-var-balance-scale: "\f24e";
$fa-var-ban: "\f05e";
+$fa-var-bandcamp: "\f2d5";
$fa-var-bank: "\f19c";
$fa-var-bar-chart: "\f080";
$fa-var-bar-chart-o: "\f080";
$fa-var-barcode: "\f02a";
$fa-var-bars: "\f0c9";
+$fa-var-bath: "\f2cd";
+$fa-var-bathtub: "\f2cd";
+$fa-var-battery: "\f240";
+$fa-var-battery-0: "\f244";
+$fa-var-battery-1: "\f243";
+$fa-var-battery-2: "\f242";
+$fa-var-battery-3: "\f241";
+$fa-var-battery-4: "\f240";
+$fa-var-battery-empty: "\f244";
+$fa-var-battery-full: "\f240";
+$fa-var-battery-half: "\f242";
+$fa-var-battery-quarter: "\f243";
+$fa-var-battery-three-quarters: "\f241";
$fa-var-bed: "\f236";
$fa-var-beer: "\f0fc";
$fa-var-behance: "\f1b4";
@@ -72,12 +97,17 @@ $fa-var-birthday-cake: "\f1fd";
$fa-var-bitbucket: "\f171";
$fa-var-bitbucket-square: "\f172";
$fa-var-bitcoin: "\f15a";
+$fa-var-black-tie: "\f27e";
+$fa-var-blind: "\f29d";
+$fa-var-bluetooth: "\f293";
+$fa-var-bluetooth-b: "\f294";
$fa-var-bold: "\f032";
$fa-var-bolt: "\f0e7";
$fa-var-bomb: "\f1e2";
$fa-var-book: "\f02d";
$fa-var-bookmark: "\f02e";
$fa-var-bookmark-o: "\f097";
+$fa-var-braille: "\f2a1";
$fa-var-briefcase: "\f0b1";
$fa-var-btc: "\f15a";
$fa-var-bug: "\f188";
@@ -90,7 +120,11 @@ $fa-var-buysellads: "\f20d";
$fa-var-cab: "\f1ba";
$fa-var-calculator: "\f1ec";
$fa-var-calendar: "\f073";
+$fa-var-calendar-check-o: "\f274";
+$fa-var-calendar-minus-o: "\f272";
$fa-var-calendar-o: "\f133";
+$fa-var-calendar-plus-o: "\f271";
+$fa-var-calendar-times-o: "\f273";
$fa-var-camera: "\f030";
$fa-var-camera-retro: "\f083";
$fa-var-car: "\f1b9";
@@ -106,7 +140,9 @@ $fa-var-cart-arrow-down: "\f218";
$fa-var-cart-plus: "\f217";
$fa-var-cc: "\f20a";
$fa-var-cc-amex: "\f1f3";
+$fa-var-cc-diners-club: "\f24c";
$fa-var-cc-discover: "\f1f2";
+$fa-var-cc-jcb: "\f24b";
$fa-var-cc-mastercard: "\f1f1";
$fa-var-cc-paypal: "\f1f4";
$fa-var-cc-stripe: "\f1f5";
@@ -128,12 +164,14 @@ $fa-var-chevron-left: "\f053";
$fa-var-chevron-right: "\f054";
$fa-var-chevron-up: "\f077";
$fa-var-child: "\f1ae";
+$fa-var-chrome: "\f268";
$fa-var-circle: "\f111";
$fa-var-circle-o: "\f10c";
$fa-var-circle-o-notch: "\f1ce";
$fa-var-circle-thin: "\f1db";
$fa-var-clipboard: "\f0ea";
$fa-var-clock-o: "\f017";
+$fa-var-clone: "\f24d";
$fa-var-close: "\f00d";
$fa-var-cloud: "\f0c2";
$fa-var-cloud-download: "\f0ed";
@@ -142,20 +180,26 @@ $fa-var-cny: "\f157";
$fa-var-code: "\f121";
$fa-var-code-fork: "\f126";
$fa-var-codepen: "\f1cb";
+$fa-var-codiepie: "\f284";
$fa-var-coffee: "\f0f4";
$fa-var-cog: "\f013";
$fa-var-cogs: "\f085";
$fa-var-columns: "\f0db";
$fa-var-comment: "\f075";
$fa-var-comment-o: "\f0e5";
+$fa-var-commenting: "\f27a";
+$fa-var-commenting-o: "\f27b";
$fa-var-comments: "\f086";
$fa-var-comments-o: "\f0e6";
$fa-var-compass: "\f14e";
$fa-var-compress: "\f066";
$fa-var-connectdevelop: "\f20e";
+$fa-var-contao: "\f26d";
$fa-var-copy: "\f0c5";
$fa-var-copyright: "\f1f9";
+$fa-var-creative-commons: "\f25e";
$fa-var-credit-card: "\f09d";
+$fa-var-credit-card-alt: "\f283";
$fa-var-crop: "\f125";
$fa-var-crosshairs: "\f05b";
$fa-var-css3: "\f13c";
@@ -166,6 +210,8 @@ $fa-var-cutlery: "\f0f5";
$fa-var-dashboard: "\f0e4";
$fa-var-dashcube: "\f210";
$fa-var-database: "\f1c0";
+$fa-var-deaf: "\f2a4";
+$fa-var-deafness: "\f2a4";
$fa-var-dedent: "\f03b";
$fa-var-delicious: "\f1a5";
$fa-var-desktop: "\f108";
@@ -176,17 +222,25 @@ $fa-var-dollar: "\f155";
$fa-var-dot-circle-o: "\f192";
$fa-var-download: "\f019";
$fa-var-dribbble: "\f17d";
+$fa-var-drivers-license: "\f2c2";
+$fa-var-drivers-license-o: "\f2c3";
$fa-var-dropbox: "\f16b";
$fa-var-drupal: "\f1a9";
+$fa-var-edge: "\f282";
$fa-var-edit: "\f044";
+$fa-var-eercast: "\f2da";
$fa-var-eject: "\f052";
$fa-var-ellipsis-h: "\f141";
$fa-var-ellipsis-v: "\f142";
$fa-var-empire: "\f1d1";
$fa-var-envelope: "\f0e0";
$fa-var-envelope-o: "\f003";
+$fa-var-envelope-open: "\f2b6";
+$fa-var-envelope-open-o: "\f2b7";
$fa-var-envelope-square: "\f199";
+$fa-var-envira: "\f299";
$fa-var-eraser: "\f12d";
+$fa-var-etsy: "\f2d7";
$fa-var-eur: "\f153";
$fa-var-euro: "\f153";
$fa-var-exchange: "\f0ec";
@@ -194,11 +248,13 @@ $fa-var-exclamation: "\f12a";
$fa-var-exclamation-circle: "\f06a";
$fa-var-exclamation-triangle: "\f071";
$fa-var-expand: "\f065";
+$fa-var-expeditedssl: "\f23e";
$fa-var-external-link: "\f08e";
$fa-var-external-link-square: "\f14c";
$fa-var-eye: "\f06e";
$fa-var-eye-slash: "\f070";
$fa-var-eyedropper: "\f1fb";
+$fa-var-fa: "\f2b4";
$fa-var-facebook: "\f09a";
$fa-var-facebook-f: "\f09a";
$fa-var-facebook-official: "\f230";
@@ -206,6 +262,7 @@ $fa-var-facebook-square: "\f082";
$fa-var-fast-backward: "\f049";
$fa-var-fast-forward: "\f050";
$fa-var-fax: "\f1ac";
+$fa-var-feed: "\f09e";
$fa-var-female: "\f182";
$fa-var-fighter-jet: "\f0fb";
$fa-var-file: "\f15b";
@@ -231,6 +288,8 @@ $fa-var-film: "\f008";
$fa-var-filter: "\f0b0";
$fa-var-fire: "\f06d";
$fa-var-fire-extinguisher: "\f134";
+$fa-var-firefox: "\f269";
+$fa-var-first-order: "\f2b0";
$fa-var-flag: "\f024";
$fa-var-flag-checkered: "\f11e";
$fa-var-flag-o: "\f11d";
@@ -243,9 +302,13 @@ $fa-var-folder-o: "\f114";
$fa-var-folder-open: "\f07c";
$fa-var-folder-open-o: "\f115";
$fa-var-font: "\f031";
+$fa-var-font-awesome: "\f2b4";
+$fa-var-fonticons: "\f280";
+$fa-var-fort-awesome: "\f286";
$fa-var-forumbee: "\f211";
$fa-var-forward: "\f04e";
$fa-var-foursquare: "\f180";
+$fa-var-free-code-camp: "\f2c5";
$fa-var-frown-o: "\f119";
$fa-var-futbol-o: "\f1e3";
$fa-var-gamepad: "\f11b";
@@ -254,29 +317,50 @@ $fa-var-gbp: "\f154";
$fa-var-ge: "\f1d1";
$fa-var-gear: "\f013";
$fa-var-gears: "\f085";
-$fa-var-genderless: "\f1db";
+$fa-var-genderless: "\f22d";
+$fa-var-get-pocket: "\f265";
+$fa-var-gg: "\f260";
+$fa-var-gg-circle: "\f261";
$fa-var-gift: "\f06b";
$fa-var-git: "\f1d3";
$fa-var-git-square: "\f1d2";
$fa-var-github: "\f09b";
$fa-var-github-alt: "\f113";
$fa-var-github-square: "\f092";
+$fa-var-gitlab: "\f296";
$fa-var-gittip: "\f184";
$fa-var-glass: "\f000";
+$fa-var-glide: "\f2a5";
+$fa-var-glide-g: "\f2a6";
$fa-var-globe: "\f0ac";
$fa-var-google: "\f1a0";
$fa-var-google-plus: "\f0d5";
+$fa-var-google-plus-circle: "\f2b3";
+$fa-var-google-plus-official: "\f2b3";
$fa-var-google-plus-square: "\f0d4";
$fa-var-google-wallet: "\f1ee";
$fa-var-graduation-cap: "\f19d";
$fa-var-gratipay: "\f184";
+$fa-var-grav: "\f2d6";
$fa-var-group: "\f0c0";
$fa-var-h-square: "\f0fd";
$fa-var-hacker-news: "\f1d4";
+$fa-var-hand-grab-o: "\f255";
+$fa-var-hand-lizard-o: "\f258";
$fa-var-hand-o-down: "\f0a7";
$fa-var-hand-o-left: "\f0a5";
$fa-var-hand-o-right: "\f0a4";
$fa-var-hand-o-up: "\f0a6";
+$fa-var-hand-paper-o: "\f256";
+$fa-var-hand-peace-o: "\f25b";
+$fa-var-hand-pointer-o: "\f25a";
+$fa-var-hand-rock-o: "\f255";
+$fa-var-hand-scissors-o: "\f257";
+$fa-var-hand-spock-o: "\f259";
+$fa-var-hand-stop-o: "\f256";
+$fa-var-handshake-o: "\f2b5";
+$fa-var-hard-of-hearing: "\f2a4";
+$fa-var-hashtag: "\f292";
$fa-var-hdd-o: "\f0a0";
$fa-var-header: "\f1dc";
$fa-var-headphones: "\f025";
@@ -287,16 +371,33 @@ $fa-var-history: "\f1da";
$fa-var-home: "\f015";
$fa-var-hospital-o: "\f0f8";
$fa-var-hotel: "\f236";
+$fa-var-hourglass: "\f254";
+$fa-var-hourglass-1: "\f251";
+$fa-var-hourglass-2: "\f252";
+$fa-var-hourglass-3: "\f253";
+$fa-var-hourglass-end: "\f253";
+$fa-var-hourglass-half: "\f252";
+$fa-var-hourglass-o: "\f250";
+$fa-var-hourglass-start: "\f251";
+$fa-var-houzz: "\f27c";
$fa-var-html5: "\f13b";
+$fa-var-i-cursor: "\f246";
+$fa-var-id-badge: "\f2c1";
+$fa-var-id-card: "\f2c2";
+$fa-var-id-card-o: "\f2c3";
$fa-var-ils: "\f20b";
$fa-var-image: "\f03e";
+$fa-var-imdb: "\f2d8";
$fa-var-inbox: "\f01c";
$fa-var-indent: "\f03c";
+$fa-var-industry: "\f275";
$fa-var-info: "\f129";
$fa-var-info-circle: "\f05a";
$fa-var-inr: "\f156";
$fa-var-instagram: "\f16d";
$fa-var-institution: "\f19c";
+$fa-var-internet-explorer: "\f26b";
+$fa-var-intersex: "\f224";
$fa-var-ioxhost: "\f208";
$fa-var-italic: "\f033";
$fa-var-joomla: "\f1aa";
@@ -324,6 +425,7 @@ $fa-var-line-chart: "\f201";
$fa-var-link: "\f0c1";
$fa-var-linkedin: "\f0e1";
$fa-var-linkedin-square: "\f08c";
+$fa-var-linode: "\f2b8";
$fa-var-linux: "\f17c";
$fa-var-list: "\f03a";
$fa-var-list-alt: "\f022";
@@ -335,13 +437,18 @@ $fa-var-long-arrow-down: "\f175";
$fa-var-long-arrow-left: "\f177";
$fa-var-long-arrow-right: "\f178";
$fa-var-long-arrow-up: "\f176";
+$fa-var-low-vision: "\f2a8";
$fa-var-magic: "\f0d0";
$fa-var-magnet: "\f076";
$fa-var-mail-forward: "\f064";
$fa-var-mail-reply: "\f112";
$fa-var-mail-reply-all: "\f122";
$fa-var-male: "\f183";
+$fa-var-map: "\f279";
$fa-var-map-marker: "\f041";
+$fa-var-map-o: "\f278";
+$fa-var-map-pin: "\f276";
+$fa-var-map-signs: "\f277";
$fa-var-mars: "\f222";
$fa-var-mars-double: "\f227";
$fa-var-mars-stroke: "\f229";
@@ -351,25 +458,37 @@ $fa-var-maxcdn: "\f136";
$fa-var-meanpath: "\f20c";
$fa-var-medium: "\f23a";
$fa-var-medkit: "\f0fa";
+$fa-var-meetup: "\f2e0";
$fa-var-meh-o: "\f11a";
$fa-var-mercury: "\f223";
+$fa-var-microchip: "\f2db";
$fa-var-microphone: "\f130";
$fa-var-microphone-slash: "\f131";
$fa-var-minus: "\f068";
$fa-var-minus-circle: "\f056";
$fa-var-minus-square: "\f146";
$fa-var-minus-square-o: "\f147";
+$fa-var-mixcloud: "\f289";
$fa-var-mobile: "\f10b";
$fa-var-mobile-phone: "\f10b";
+$fa-var-modx: "\f285";
$fa-var-money: "\f0d6";
$fa-var-moon-o: "\f186";
$fa-var-mortar-board: "\f19d";
$fa-var-motorcycle: "\f21c";
+$fa-var-mouse-pointer: "\f245";
$fa-var-music: "\f001";
$fa-var-navicon: "\f0c9";
$fa-var-neuter: "\f22c";
$fa-var-newspaper-o: "\f1ea";
+$fa-var-object-group: "\f247";
+$fa-var-object-ungroup: "\f248";
+$fa-var-odnoklassniki: "\f263";
+$fa-var-odnoklassniki-square: "\f264";
+$fa-var-opencart: "\f23d";
$fa-var-openid: "\f19b";
+$fa-var-opera: "\f26a";
+$fa-var-optin-monster: "\f23c";
$fa-var-outdent: "\f03b";
$fa-var-pagelines: "\f18c";
$fa-var-paint-brush: "\f1fc";
@@ -379,18 +498,22 @@ $fa-var-paperclip: "\f0c6";
$fa-var-paragraph: "\f1dd";
$fa-var-paste: "\f0ea";
$fa-var-pause: "\f04c";
+$fa-var-pause-circle: "\f28b";
+$fa-var-pause-circle-o: "\f28c";
$fa-var-paw: "\f1b0";
$fa-var-paypal: "\f1ed";
$fa-var-pencil: "\f040";
$fa-var-pencil-square: "\f14b";
$fa-var-pencil-square-o: "\f044";
+$fa-var-percent: "\f295";
$fa-var-phone: "\f095";
$fa-var-phone-square: "\f098";
$fa-var-photo: "\f03e";
$fa-var-picture-o: "\f03e";
$fa-var-pie-chart: "\f200";
-$fa-var-pied-piper: "\f1a7";
+$fa-var-pied-piper: "\f2ae";
$fa-var-pied-piper-alt: "\f1a8";
+$fa-var-pied-piper-pp: "\f1a7";
$fa-var-pinterest: "\f0d2";
$fa-var-pinterest-p: "\f231";
$fa-var-pinterest-square: "\f0d3";
@@ -403,28 +526,36 @@ $fa-var-plus: "\f067";
$fa-var-plus-circle: "\f055";
$fa-var-plus-square: "\f0fe";
$fa-var-plus-square-o: "\f196";
+$fa-var-podcast: "\f2ce";
$fa-var-power-off: "\f011";
$fa-var-print: "\f02f";
+$fa-var-product-hunt: "\f288";
$fa-var-puzzle-piece: "\f12e";
$fa-var-qq: "\f1d6";
$fa-var-qrcode: "\f029";
$fa-var-question: "\f128";
$fa-var-question-circle: "\f059";
+$fa-var-question-circle-o: "\f29c";
+$fa-var-quora: "\f2c4";
$fa-var-quote-left: "\f10d";
$fa-var-quote-right: "\f10e";
$fa-var-ra: "\f1d0";
$fa-var-random: "\f074";
+$fa-var-ravelry: "\f2d9";
$fa-var-rebel: "\f1d0";
$fa-var-recycle: "\f1b8";
$fa-var-reddit: "\f1a1";
+$fa-var-reddit-alien: "\f281";
$fa-var-reddit-square: "\f1a2";
$fa-var-refresh: "\f021";
+$fa-var-registered: "\f25d";
$fa-var-remove: "\f00d";
$fa-var-renren: "\f18b";
$fa-var-reorder: "\f0c9";
$fa-var-repeat: "\f01e";
$fa-var-reply: "\f112";
$fa-var-reply-all: "\f122";
+$fa-var-resistance: "\f1d0";
$fa-var-retweet: "\f079";
$fa-var-rmb: "\f157";
$fa-var-road: "\f018";
@@ -437,8 +568,11 @@ $fa-var-rss-square: "\f143";
$fa-var-rub: "\f158";
$fa-var-ruble: "\f158";
$fa-var-rupee: "\f156";
+$fa-var-s15: "\f2cd";
+$fa-var-safari: "\f267";
$fa-var-save: "\f0c7";
$fa-var-scissors: "\f0c4";
+$fa-var-scribd: "\f28a";
$fa-var-search: "\f002";
$fa-var-search-minus: "\f010";
$fa-var-search-plus: "\f00e";
@@ -456,10 +590,15 @@ $fa-var-sheqel: "\f20b";
$fa-var-shield: "\f132";
$fa-var-ship: "\f21a";
$fa-var-shirtsinbulk: "\f214";
+$fa-var-shopping-bag: "\f290";
+$fa-var-shopping-basket: "\f291";
$fa-var-shopping-cart: "\f07a";
+$fa-var-shower: "\f2cc";
$fa-var-sign-in: "\f090";
+$fa-var-sign-language: "\f2a7";
$fa-var-sign-out: "\f08b";
$fa-var-signal: "\f012";
+$fa-var-signing: "\f2a7";
$fa-var-simplybuilt: "\f215";
$fa-var-sitemap: "\f0e8";
$fa-var-skyatlas: "\f216";
@@ -468,6 +607,10 @@ $fa-var-slack: "\f198";
$fa-var-sliders: "\f1de";
$fa-var-slideshare: "\f1e7";
$fa-var-smile-o: "\f118";
+$fa-var-snapchat: "\f2ab";
+$fa-var-snapchat-ghost: "\f2ac";
+$fa-var-snapchat-square: "\f2ad";
+$fa-var-snowflake-o: "\f2dc";
$fa-var-soccer-ball-o: "\f1e3";
$fa-var-sort: "\f0dc";
$fa-var-sort-alpha-asc: "\f15d";
@@ -500,7 +643,11 @@ $fa-var-steam-square: "\f1b7";
$fa-var-step-backward: "\f048";
$fa-var-step-forward: "\f051";
$fa-var-stethoscope: "\f0f1";
+$fa-var-sticky-note: "\f249";
+$fa-var-sticky-note-o: "\f24a";
$fa-var-stop: "\f04d";
+$fa-var-stop-circle: "\f28d";
+$fa-var-stop-circle-o: "\f28e";
$fa-var-street-view: "\f21d";
$fa-var-strikethrough: "\f0cc";
$fa-var-stumbleupon: "\f1a4";
@@ -509,6 +656,7 @@ $fa-var-subscript: "\f12c";
$fa-var-subway: "\f239";
$fa-var-suitcase: "\f0f2";
$fa-var-sun-o: "\f185";
+$fa-var-superpowers: "\f2dd";
$fa-var-superscript: "\f12b";
$fa-var-support: "\f1cd";
$fa-var-table: "\f0ce";
@@ -518,6 +666,8 @@ $fa-var-tag: "\f02b";
$fa-var-tags: "\f02c";
$fa-var-tasks: "\f0ae";
$fa-var-taxi: "\f1ba";
+$fa-var-telegram: "\f2c6";
+$fa-var-television: "\f26c";
$fa-var-tencent-weibo: "\f1d5";
$fa-var-terminal: "\f120";
$fa-var-text-height: "\f034";
@@ -525,6 +675,18 @@ $fa-var-text-width: "\f035";
$fa-var-th: "\f00a";
$fa-var-th-large: "\f009";
$fa-var-th-list: "\f00b";
+$fa-var-themeisle: "\f2b2";
+$fa-var-thermometer: "\f2c7";
+$fa-var-thermometer-0: "\f2cb";
+$fa-var-thermometer-1: "\f2ca";
+$fa-var-thermometer-2: "\f2c9";
+$fa-var-thermometer-3: "\f2c8";
+$fa-var-thermometer-4: "\f2c7";
+$fa-var-thermometer-empty: "\f2cb";
+$fa-var-thermometer-full: "\f2c7";
+$fa-var-thermometer-half: "\f2c9";
+$fa-var-thermometer-quarter: "\f2ca";
+$fa-var-thermometer-three-quarters: "\f2c8";
$fa-var-thumb-tack: "\f08d";
$fa-var-thumbs-down: "\f165";
$fa-var-thumbs-o-down: "\f088";
@@ -534,6 +696,8 @@ $fa-var-ticket: "\f145";
$fa-var-times: "\f00d";
$fa-var-times-circle: "\f057";
$fa-var-times-circle-o: "\f05c";
+$fa-var-times-rectangle: "\f2d3";
+$fa-var-times-rectangle-o: "\f2d4";
$fa-var-tint: "\f043";
$fa-var-toggle-down: "\f150";
$fa-var-toggle-left: "\f191";
@@ -541,6 +705,7 @@ $fa-var-toggle-off: "\f204";
$fa-var-toggle-on: "\f205";
$fa-var-toggle-right: "\f152";
$fa-var-toggle-up: "\f151";
+$fa-var-trademark: "\f25c";
$fa-var-train: "\f238";
$fa-var-transgender: "\f224";
$fa-var-transgender-alt: "\f225";
@@ -548,6 +713,7 @@ $fa-var-trash: "\f1f8";
$fa-var-trash-o: "\f014";
$fa-var-tree: "\f1bb";
$fa-var-trello: "\f181";
+$fa-var-tripadvisor: "\f262";
$fa-var-trophy: "\f091";
$fa-var-truck: "\f0d1";
$fa-var-try: "\f195";
@@ -555,33 +721,45 @@ $fa-var-tty: "\f1e4";
$fa-var-tumblr: "\f173";
$fa-var-tumblr-square: "\f174";
$fa-var-turkish-lira: "\f195";
+$fa-var-tv: "\f26c";
$fa-var-twitch: "\f1e8";
$fa-var-twitter: "\f099";
$fa-var-twitter-square: "\f081";
$fa-var-umbrella: "\f0e9";
$fa-var-underline: "\f0cd";
$fa-var-undo: "\f0e2";
+$fa-var-universal-access: "\f29a";
$fa-var-university: "\f19c";
$fa-var-unlink: "\f127";
$fa-var-unlock: "\f09c";
$fa-var-unlock-alt: "\f13e";
$fa-var-unsorted: "\f0dc";
$fa-var-upload: "\f093";
+$fa-var-usb: "\f287";
$fa-var-usd: "\f155";
$fa-var-user: "\f007";
+$fa-var-user-circle: "\f2bd";
+$fa-var-user-circle-o: "\f2be";
$fa-var-user-md: "\f0f0";
+$fa-var-user-o: "\f2c0";
$fa-var-user-plus: "\f234";
$fa-var-user-secret: "\f21b";
$fa-var-user-times: "\f235";
$fa-var-users: "\f0c0";
+$fa-var-vcard: "\f2bb";
+$fa-var-vcard-o: "\f2bc";
$fa-var-venus: "\f221";
$fa-var-venus-double: "\f226";
$fa-var-venus-mars: "\f228";
$fa-var-viacoin: "\f237";
+$fa-var-viadeo: "\f2a9";
+$fa-var-viadeo-square: "\f2aa";
$fa-var-video-camera: "\f03d";
+$fa-var-vimeo: "\f27d";
$fa-var-vimeo-square: "\f194";
$fa-var-vine: "\f1ca";
$fa-var-vk: "\f189";
+$fa-var-volume-control-phone: "\f2a0";
$fa-var-volume-down: "\f027";
$fa-var-volume-off: "\f026";
$fa-var-volume-up: "\f028";
@@ -591,16 +769,32 @@ $fa-var-weibo: "\f18a";
$fa-var-weixin: "\f1d7";
$fa-var-whatsapp: "\f232";
$fa-var-wheelchair: "\f193";
+$fa-var-wheelchair-alt: "\f29b";
$fa-var-wifi: "\f1eb";
+$fa-var-wikipedia-w: "\f266";
+$fa-var-window-close: "\f2d3";
+$fa-var-window-close-o: "\f2d4";
+$fa-var-window-maximize: "\f2d0";
+$fa-var-window-minimize: "\f2d1";
+$fa-var-window-restore: "\f2d2";
$fa-var-windows: "\f17a";
$fa-var-won: "\f159";
$fa-var-wordpress: "\f19a";
+$fa-var-wpbeginner: "\f297";
+$fa-var-wpexplorer: "\f2de";
+$fa-var-wpforms: "\f298";
$fa-var-wrench: "\f0ad";
$fa-var-xing: "\f168";
$fa-var-xing-square: "\f169";
+$fa-var-y-combinator: "\f23b";
+$fa-var-y-combinator-square: "\f1d4";
$fa-var-yahoo: "\f19e";
+$fa-var-yc: "\f23b";
+$fa-var-yc-square: "\f1d4";
$fa-var-yelp: "\f1e9";
$fa-var-yen: "\f157";
+$fa-var-yoast: "\f2b1";
$fa-var-youtube: "\f167";
$fa-var-youtube-play: "\f16a";
$fa-var-youtube-square: "\f166";
+
diff --git a/admin/themes/default/sass/vendor/font-awesome/font-awesome.scss b/admin/themes/default/sass/vendor/font-awesome/font-awesome.scss
index 388ac6b0cd..f1c83aaa5d 100644
--- a/admin/themes/default/sass/vendor/font-awesome/font-awesome.scss
+++ b/admin/themes/default/sass/vendor/font-awesome/font-awesome.scss
@@ -1,5 +1,5 @@
/*!
- * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@@ -15,3 +15,4 @@
@import "rotated-flipped";
@import "stacked";
@import "icons";
+@import "screen-reader";
diff --git a/classes/controller/FrontController.php b/classes/controller/FrontController.php
index 6885395fc9..f44477c2d1 100644
--- a/classes/controller/FrontController.php
+++ b/classes/controller/FrontController.php
@@ -428,7 +428,13 @@ public function init()
}
}
- $languages = Language::getLanguages(true, $this->context->shop->id);
+ if ($languages = Language::getLanguages(true, $this->context->shop->id)) {
+ $languages = array_column($languages, null, 'id_lang');
+ }
+ if ($currencies = Currency::getCurrencies()) {
+ $currencies = array_column($currencies, null, 'id_currency');
+ }
+
$meta_language = array();
foreach ($languages as $lang) {
$meta_language[] = $lang['iso_code'];
@@ -471,7 +477,7 @@ public function init()
'lang_id' => (int)$this->context->language->id,
'come_from' => Tools::getHttpHost(true, true).Tools::htmlentitiesUTF8(str_replace(array('\'', '\\'), '', urldecode($_SERVER['REQUEST_URI']))),
'cart_qties' => (int)$cart->nbProducts(),
- 'currencies' => Currency::getCurrencies(),
+ 'currencies' => $currencies,
'languages' => $languages,
'meta_language' => implode(',', $meta_language),
'priceDisplay' => Product::getTaxCalculationMethod((int)$this->context->cookie->id_customer),
@@ -1143,7 +1149,10 @@ public function setMedia()
}
$this->addCSS(_THEME_CSS_DIR_.'grid_prestashop.css', 'all'); // retro compat themes 1.5.0.1
+ $this->addCSS(_THEME_CSS_DIR_.'bootstrap.min.css', 'all');
+ $this->addCSS(_THEME_CSS_DIR_.'icons.css', 'all');
$this->addCSS(_THEME_CSS_DIR_.'global.css', 'all');
+
$this->addJquery();
$this->addJqueryPlugin('easing');
$this->addJS(_PS_JS_DIR_.'tools.js');
diff --git a/controllers/front/AuthController.php b/controllers/front/AuthController.php
index 91b583007a..c9a41f6c27 100644
--- a/controllers/front/AuthController.php
+++ b/controllers/front/AuthController.php
@@ -33,7 +33,6 @@ class AuthControllerCore extends FrontController
/**
* @var bool create_account
*/
- protected $create_account;
protected $id_country;
public $informations;
public $confirmations;
@@ -55,10 +54,6 @@ public function init()
if (!Tools::getIsset('step') && $this->context->customer->isLogged() && !$this->ajax) {
Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
}
-
- if (Tools::getValue('create_account')) {
- $this->create_account = true;
- }
}
/**
@@ -141,10 +136,6 @@ public function initContent()
));
}
- if (Tools::getValue('create_account')) {
- $this->context->smarty->assign('email_create', 1);
- }
-
if (Tools::getValue('multi-shipping') == 1) {
$this->context->smarty->assign('multi_shipping', true);
} else {
@@ -154,43 +145,8 @@ public function initContent()
$this->context->smarty->assign('field_required', $this->context->customer->validateFieldsRequiredDatabase());
$this->assignAddressFormat();
-
- // Call a hook to display more information on form
- $this->context->smarty->assign(array(
- 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'),
- 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop')
- ));
-
// Just set $this->template value here in case it's used by Ajax
$this->setTemplate(_PS_THEME_DIR_.'authentication.tpl');
-
- if ($this->ajax) {
- // Call a hook to display more information on form
- $this->context->smarty->assign(array(
- 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'),
- 'genders' => Gender::getGenders()
- ));
-
- $return = array(
- 'hasConfirmation' => !empty($this->confirmations),
- 'confirmations' => $this->confirmations,
- 'hasInformation' => !empty($this->informations),
- 'informations' => $this->informations,
- 'hasError' => !empty($this->errors),
- 'errors' => $this->errors,
- 'hasAjaxExtraData' => !empty($this->ajaxExtraData),
- 'ajaxExtraData' => $this->ajaxExtraData,
- 'token' => Tools::getToken(false)
- );
-
- // send page html only if no errors in the form and we have to open registration form
- // It also prevents opening html in the response in case of an error for XSS protection
- if (empty($this->errors)) {
- $return['page'] = $this->context->smarty->fetch($this->template);
- }
-
- $this->ajaxDie(json_encode($return));
- }
}
/**
@@ -272,14 +228,7 @@ protected function assignAddressFormat()
*/
public function postProcess()
{
- if (Tools::isSubmit('SubmitCreate')) {
- $this->processSubmitCreate();
- }
-
- if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) {
- $this->processSubmitAccount();
- }
-
+ // @todo
if (Tools::isSubmit('submitTransformAccount')) {
$this->processTransformAccount();
}
@@ -378,374 +327,6 @@ protected function processCustomerNewsletter(&$customer)
}
}
- /**
- * Process submit on an account
- */
- protected function processSubmitAccount()
- {
- Hook::exec('actionBeforeSubmitAccount');
- $this->create_account = true;
- if (Tools::isSubmit('submitAccount')) {
- $this->context->smarty->assign('email_create', 1);
- }
- // New Guest customer
- if (!Tools::getValue('is_new_customer', 1) && !Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) {
- $this->errors[] = Tools::displayError('You cannot create a guest account.');
- }
- if (!Tools::getValue('is_new_customer', 1)) {
- $_POST['passwd'] = md5(time()._COOKIE_KEY_);
- }
- if ($guest_email = Tools::getValue('guest_email')) {
- $_POST['email'] = $guest_email;
- }
- // Checked the user address in case he changed his email address
- if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) {
- if (Customer::customerExists($email)) {
- $this->errors[] = Tools::displayError('An account using this email address has already been registered.', false);
- } elseif (Tools::getValue('is_new_customer', 1) && Customer::customerExists($email, false, false)) {
- $this->errors[] = Tools::displayError('You are already registered as a guest with this email address.').' '.Tools::displayError('').' to generate a password for your account.';
- }
- }
-
- if (!count($this->errors)) {
- // Preparing customer
- $customer = new Customer();
- $lastnameAddress = Tools::getValue('lastname');
- $firstnameAddress = Tools::getValue('firstname');
- $phoneAddress = Tools::getValue('phone');
- $_POST['lastname'] = Tools::getValue('customer_lastname', $lastnameAddress);
- $_POST['firstname'] = Tools::getValue('customer_firstname', $firstnameAddress);
- $_POST['phone'] = Tools::getValue('customer_phone', $phoneAddress);
- $addresses_types = [];
- if (Configuration::get('PS_REGISTRATION_PROCESS_TYPE')) {
- $addresses_types[] = 'address';
- }
-
- if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) {
- $addresses_types[] = 'address_invoice';
- }
-
- if (Configuration::get('PS_ONE_PHONE_AT_LEAST') && !Tools::getValue('phone')) {
- $this->errors[] = Tools::displayError('Phone number is required.');
- }
-
- if (!Tools::getValue('is_new_customer', 1)) {
- if (Validate::isEmail($email = Tools::getValue('email'))
- && $idCustomer = Customer::customerExists(Tools::getValue('email'), true, false)
- ) {
- $customer = new Customer($idCustomer);
- }
- }
-
- $this->errors = array_unique(array_merge($this->errors, $customer->validateController()));
-
- // Check the requires fields which are settings in the BO
- $this->errors = $this->errors + $customer->validateFieldsRequiredDatabase();
-
- if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
- if (!count($this->errors)) {
-
- $this->processCustomerNewsletter($customer);
-
- $customer->firstname = Tools::ucwords($customer->firstname);
- if (Configuration::get('PS_CUSTOMER_BIRTHDATE')) {
- $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
- if (!Validate::isBirthDate($customer->birthday)) {
- $this->errors[] = Tools::displayError('Invalid date of birth.');
- }
- }
-
- // New Guest customer
- $customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0);
- $customer->active = 1;
-
- if (!count($this->errors)) {
- $customer->phone = Tools::getValue('phone');
- if ($customer->add()) {
- if (!$customer->is_guest) {
- if (!$this->sendConfirmationMail($customer)) {
- $this->errors[] = Tools::displayError('The email cannot be sent.');
- }
- }
-
- $this->context->updateCustomer($customer, 1);
-
- $this->context->cart->update();
- Hook::exec('actionCustomerAccountAdd', array(
- '_POST' => $_POST,
- 'newCustomer' => $customer
- ));
- if ($this->ajax) {
- $return = array(
- 'hasError' => !empty($this->errors),
- 'errors' => $this->errors,
- 'isSaved' => true,
- 'id_customer' => (int)$this->context->cookie->id_customer,
- 'id_address_delivery' => $this->context->cart->id_address_delivery,
- 'id_address_invoice' => $this->context->cart->id_address_invoice,
- 'token' => Tools::getToken(false)
- );
- $this->ajaxDie(json_encode($return));
- }
-
- if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
- Tools::redirect(html_entity_decode($back));
- }
-
- // redirection: if cart is not empty : redirection to the cart
- if (count($this->context->cart->getProducts(true)) > 0) {
- $multi = (int)Tools::getValue('multi-shipping');
- Tools::redirect('index.php?controller=order'.($multi ? '&multi-shipping='.$multi : ''));
- }
- // else : redirection to the account
- else {
- Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
- }
- } else {
- $this->errors[] = Tools::displayError('An error occurred while creating your account.');
- }
- }
- }
- } else {
- // if registration type is in one step, we save the address
-
- $_POST['lastname'] = $lastnameAddress;
- $_POST['firstname'] = $firstnameAddress;
- $post_back = $_POST;
- // Preparing addresses
- foreach ($addresses_types as $addresses_type) {
- $$addresses_type = new Address();
- $$addresses_type->id_customer = 1;
-
- if ($addresses_type == 'address_invoice') {
- foreach ($_POST as $key => &$post) {
- if ($tmp = Tools::getValue($key.'_invoice')) {
- $post = $tmp;
- }
- }
- }
-
- $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
- if ($addresses_type == 'address_invoice') {
- $_POST = $post_back;
- }
-
- if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) {
- $this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country');
- }
-
- if (!$country->active) {
- $this->errors[] = Tools::displayError('This country is not active.');
- }
-
- $postcode = $$addresses_type->postcode;
- /* Check zip code format */
- if ($country->zip_code_format && !$country->checkZipCode($postcode)) {
- $this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))));
- } elseif (empty($postcode) && $country->need_zip_code) {
- $this->errors[] = Tools::displayError('A Zip / Postal code is required.');
- } elseif ($postcode && !Validate::isPostCode($postcode)) {
- $this->errors[] = Tools::displayError('The Zip / Postal code is invalid.');
- }
-
- if ($country->need_identification_number) {
- if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE')) {
- $$addresses_type->dni = null;
- } elseif (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))) {
- $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.');
- }
- } elseif (!$country->need_identification_number) {
- $$addresses_type->dni = null;
- }
-
- if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) {
- if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) {
- $this->errors[] = Tools::displayError('Country is invalid');
- }
- }
- $contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0;
- $id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0;
- if ((Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) {
- $this->errors[] = Tools::displayError('This country requires you to choose a State.');
- }
- }
- }
- if (!(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == '')
- && !@checkdate((int) Tools::getValue('months'), (int) Tools::getValue('days'), (int) Tools::getValue('years'))
- ) {
- $this->errors[] = Tools::displayError('Invalid date of birth');
- }
-
- if (!count($this->errors)) {
- if (!Tools::getValue('is_new_customer', 1)) {
- if ($idCustomer = Customer::customerExists(Tools::getValue('email'), true, false)) {
- if ($idAddress = Customer::getCustomerIdAddress($idCustomer)) {
- $address = new Address($idAddress);
- }
- }
- } else {
- if (Customer::customerExists(Tools::getValue('email'))) {
- $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false);
- }
- }
-
- $this->processCustomerNewsletter($customer);
-
- if (Configuration::get('PS_CUSTOMER_BIRTHDATE')) {
- $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
- if (!Validate::isBirthDate($customer->birthday)) {
- $this->errors[] = Tools::displayError('Invalid date of birth');
- }
- }
-
- if (!count($this->errors)) {
- $customer->active = 1;
- // New Guest customer
- if (Tools::isSubmit('is_new_customer')) {
- $customer->is_guest = !Tools::getValue('is_new_customer', 1);
- } else {
- $customer->is_guest = 0;
- }
- $customer->phone = Tools::getValue('phone');
- if (!$customer->save()) {
- $this->errors[] = Tools::displayError('An error occurred while creating your account.');
- } else {
- $_POST['phone'] = $phoneAddress;
-
- foreach ($addresses_types as $addresses_type) {
- $$addresses_type->id_customer = (int)$customer->id;
- if ($addresses_type == 'address_invoice') {
- foreach ($_POST as $key => &$post) {
- if ($tmp = Tools::getValue($key.'_invoice')) {
- $post = $tmp;
- }
- }
- }
-
- $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
- if ($addresses_type == 'address_invoice') {
- $_POST = $post_back;
- }
- if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->save()) {
- $this->errors[] = Tools::displayError('An error occurred while creating your address.');
- }
- }
- if (!count($this->errors)) {
- if (!$customer->is_guest) {
- $this->context->customer = $customer;
- $customer->cleanGroups();
- // we add the guest customer in the default customer group
- $customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP')));
- if (!$this->sendConfirmationMail($customer)) {
- // webkul - we will not stop process on email delivery fails
- //$this->errors[] = Tools::displayError('The email cannot be sent.');
- }
- } else {
- $customer->cleanGroups();
- // we add the guest customer in the guest customer group
- $customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
- }
-
- $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id);
- if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) {
- $this->context->cart->id_address_invoice = (int)$address_invoice->id;
- }
-
- if ($this->ajax && Configuration::get('PS_ORDER_PROCESS_TYPE')) {
- $delivery_option = array((int)$this->context->cart->id_address_delivery => (int)$this->context->cart->id_carrier.',');
- $this->context->cart->setDeliveryOption($delivery_option);
- }
-
- $this->context->updateCustomer($customer, 1);
- // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
- $this->context->cart->update();
-
- // Avoid articles without delivery address on the cart
- $this->context->cart->autosetProductAddress();
-
- Hook::exec('actionCustomerAccountAdd', array(
- '_POST' => $_POST,
- 'newCustomer' => $customer
- ));
- if ($this->ajax) {
- $return = array(
- 'hasError' => !empty($this->errors),
- 'errors' => $this->errors,
- 'isSaved' => true,
- 'id_customer' => (int)$this->context->cookie->id_customer,
- 'id_address_delivery' => $this->context->cart->id_address_delivery,
- 'id_address_invoice' => $this->context->cart->id_address_invoice,
- 'token' => Tools::getToken(false)
- );
- $this->ajaxDie(json_encode($return));
- }
- // if registration type is in two steps, we redirect to register address
- if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
- Tools::redirect('index.php?controller=address');
- }
-
- if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
- Tools::redirect(html_entity_decode($back));
- }
-
- // redirection: if cart is not empty : redirection to the cart
- if (count($this->context->cart->getProducts(true)) > 0) {
- Tools::redirect('index.php?controller=order'.($multi = (int)Tools::getValue('multi-shipping') ? '&multi-shipping='.$multi : ''));
- }
- // else : redirection to the account
- else {
- Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
- }
- }
- }
- }
- }
- }
-
- if (count($this->errors)) {
- //for retro compatibility to display guest account creation form on authentication page
- if (Tools::getValue('submitGuestAccount')) {
- $_GET['display_guest_checkout'] = 1;
- }
-
- if (!Tools::getValue('is_new_customer')) {
- unset($_POST['passwd']);
- }
- if ($this->ajax) {
- $return = array(
- 'hasError' => !empty($this->errors),
- 'errors' => $this->errors,
- 'isSaved' => false,
- 'id_customer' => 0
- );
- $this->ajaxDie(json_encode($return));
- }
- $this->context->smarty->assign('account_error', $this->errors);
- }
- }
-
- /**
- * Process submit on a creation
- */
- protected function processSubmitCreate()
- {
- if (!Validate::isEmail($email = trim(Tools::getValue('email_create'))) || empty($email)) {
- $this->errors[] = Tools::displayError('Invalid email address.');
- } elseif (Customer::customerExists($email)) {
- $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please choose another one or sign in.', false);
- $_POST['email'] = trim(Tools::getValue('email_create'));
- unset($_POST['email_create']);
- } elseif ($id_customer = Customer::customerExists($email, true, false)) {
- $this->informations[] = Tools::displayError('You are already registered as a guest with this email address.').' '.Tools::displayError('').' to generate a password for your account.';
- } elseif (Tools::getValue('back') && !Validate::isUrl(Tools::getValue('back'))) {
- $this->errors[] = Tools::displayError('back url is invalid.');
- } else {
- $this->create_account = true;
- $this->context->smarty->assign('email_create', Tools::safeOutput($email));
- $_POST['email'] = $email;
- }
- }
-
/**
* Process submit for account transformation
*/
diff --git a/controllers/front/CategoryController.php b/controllers/front/CategoryController.php
index 582344f7d6..f4dc4bac5e 100644
--- a/controllers/front/CategoryController.php
+++ b/controllers/front/CategoryController.php
@@ -64,6 +64,9 @@ public function setMedia()
$this->addJS(_THEME_JS_DIR_.'scenes.js');
$this->addJqueryPlugin(array('scrollTo', 'serialScroll'));
}
+ $this->addCSS(_PS_JS_DIR_.'/owl-carousel/assets/owl.carousel.min.css');
+ $this->addCSS(_PS_JS_DIR_.'/owl-carousel/assets/owl.theme.default.min.css');
+ $this->addJS(_PS_JS_DIR_.'/owl-carousel/owl.carousel.min.js');
$this->addJS(_THEME_JS_DIR_.'category.js');
}
@@ -238,6 +241,106 @@ public function initContent()
$feat_img_dir = _PS_IMG_.'rf/';
$ratting_img = _MODULE_DIR_.'hotelreservationsystem/views/img/Slices/icons-sprite.png';
+ $objHotel = new HotelBranchInformation($id_hotel, $this->context->language->id);
+ $invoiceAddressPatternRules['avoid'] = ['lastname', 'firstname'];
+
+ $idHotelAddress = $objHotel->getHotelIdAddress();
+ $objHotelAddress = new Address((int) $idHotelAddress);
+ $formattedHotelAddress = AddressFormat::generateAddress($objHotelAddress, $invoiceAddressPatternRules, ', ', ' ');
+ $objHotelImage = new HotelImage();
+ $hotelImageLargeType = ImageType::getFormatedName('large');
+ $hotelImageSmallType = ImageType::getFormatedName('small');
+
+ $hotelImages = array();
+ if ($hotelImagesByHotel = $objHotelImage->getImagesByHotelId($id_hotel)) {
+ foreach ($hotelImagesByHotel as $hotelImage) {
+ $hotelImages[] = array(
+ 'id' => (int) $hotelImage['id'],
+ 'cover' => (bool) $hotelImage['cover'],
+ 'large_link' => $this->context->link->getMediaLink(
+ $objHotelImage->getImageLink((int) $hotelImage['id'], $hotelImageLargeType)
+ ),
+ 'small_link' => $this->context->link->getMediaLink(
+ $objHotelImage->getImageLink((int) $hotelImage['id'], $hotelImageSmallType)
+ ),
+ 'id_htl_image_category' => $hotelImage['id_htl_image_category'],
+ 'category_name' => $hotelImage['category_name']
+ );
+ }
+ }
+ $hotelCoverImage = null;
+ if ($hotelImages) {
+ foreach ($hotelImages as $hotelImage) {
+ if ($hotelImage['cover']) {
+ $hotelCoverImage = $hotelImage;
+ break;
+ }
+ }
+
+ if ($hotelCoverImage === null) {
+ $hotelCoverImage = $hotelImages[0];
+ }
+ }
+
+ $hotelGalleryImages = array();
+ if ($hotelCoverImage !== null && $hotelImages) {
+ foreach ($hotelImages as $hotelImage) {
+ if ((int) $hotelImage['id'] === (int) $hotelCoverImage['id']) {
+ continue;
+ }
+ $hotelGalleryImages[] = $hotelImage;
+ }
+ }
+
+ $hotelGalleryImages = array_slice($hotelGalleryImages, 0, 2);
+
+ // Organize all images by category for the full gallery
+ $hotelGalleryByIdCategory = array();
+ if ($hotelImages) {
+ foreach ($hotelImages as $image) {
+ $categoryId = isset($image['id_htl_image_category']) && $image['id_htl_image_category'] ? $image['id_htl_image_category'] : 'uncategorized';
+ $categoryName = isset($image['category_name']) && $image['category_name'] ? $image['category_name'] : 'Uncategorized';
+ if (!isset($hotelGalleryByIdCategory[$categoryId])) {
+ $hotelGalleryByIdCategory[$categoryId] = array('id' => $categoryId, 'name' => $categoryName, 'images' => array());
+ }
+
+ $hotelGalleryByIdCategory[$categoryId]['images'][] = array(
+ 'id' => $image['id'],
+ 'large_link' => $this->context->link->getMediaLink($objHotelImage->getImageLink((int) $image['id'], $hotelImageLargeType)),
+ 'small_link' => $this->context->link->getMediaLink($objHotelImage->getImageLink((int) $image['id'], $hotelImageSmallType)),
+ 'cover' => $image['cover']
+ );
+ }
+ }
+ // Get all image categories for the hotel
+ $hotelImageCategories = HotelImageCategory::getImageCategories($this->context->language->id);
+
+ // Google Map on category page
+ $displayHotelLocation = false;
+ if (($apiKey = Configuration::get('PS_API_KEY')) && Configuration::get('WK_GOOGLE_ACTIVE_MAP') && ($PS_MAP_ID = Configuration::get('PS_MAP_ID'))) {
+ $idCategory = Tools::getValue('id_category');
+ $idHotel = HotelBranchInformation::getHotelIdByIdCategory($idCategory);
+ $objHotel = new HotelBranchInformation($idHotel, $this->context->language->id);
+
+ if (floatval($objHotel->latitude) != 0 && floatval($objHotel->longitude) != 0) {
+ $displayHotelLocation = true;
+ Media::addJsDef(array(
+ 'hotel_location' => array(
+ 'latitude' => $objHotel->latitude,
+ 'longitude' => $objHotel->longitude,
+ 'map_input_text' => $objHotel->map_input_text,
+ ),
+ 'PS_MAP_ID' => $PS_MAP_ID,
+ 'hotel_name' => $objHotel->hotel_name,
+ 'PS_STORES_ICON' => $this->context->link->getMediaLink(_PS_IMG_.Configuration::get('PS_STORES_ICON')),
+ ));
+
+ $this->addJS('https://maps.googleapis.com/maps/api/js?key='.$apiKey.'&libraries=places,marker&loading=async&callback=initMap&language='.$this->context->language->iso_code.'®ion='.$this->context->country->iso_code);
+
+ $this->context->smarty->assign('hotel', $objHotel);
+ }
+ }
+
$this->context->smarty->assign(array(
'warning_num' => $warning_num,
'num_days' => $num_days,
@@ -249,6 +352,15 @@ public function initContent()
'display_all_room_types' => $displayAllRoomsTypes,
'id_hotel' => $id_hotel,
'currency' => $currency,
+ 'objHotel' => $objHotel,
+ 'display_hotel_location' => $displayHotelLocation,
+ 'hotel_contact' => $objHotelAddress->phone,
+ 'hotel_address' => $formattedHotelAddress,
+ 'hotel_cover_image' => $hotelCoverImage,
+ 'hotel_gallery_images' => $hotelGalleryImages,
+ 'hotel_gallery_all_images' => $hotelImages,
+ 'hotel_gallery_by_category' => $hotelGalleryByIdCategory,
+ 'hotel_image_categories' => $hotelImageCategories,
'feat_img_dir' => $feat_img_dir,
'ratting_img' => $ratting_img,
));
diff --git a/controllers/front/HistoryController.php b/controllers/front/HistoryController.php
index 09ba285bb0..c0322cda5e 100644
--- a/controllers/front/HistoryController.php
+++ b/controllers/front/HistoryController.php
@@ -39,6 +39,7 @@ public function setMedia()
));
$this->addJqueryPlugin(array('footable', 'footable-sort'));
+ $this->addJS(_THEME_JS_DIR_.'history.js');
}
/**
@@ -48,6 +49,8 @@ public function setMedia()
public function initContent()
{
$this->show_breadcrump = true;
+ $selectedOrderState = (int)Tools::getValue('id_order_state', 0);
+ $historySearch = trim(Tools::getValue('history_search', ''));
parent::initContent();
if ($orders = Order::getCustomerOrders($this->context->customer->id)) {
@@ -57,9 +60,21 @@ public function initContent()
$order['virtual'] = $myOrder->isVirtual(false);
}
}
+
+ if ($selectedOrderState) {
+ $orders = array_values(array_filter($orders, function ($order) use ($selectedOrderState) {
+ return (int)$order['id_order_state'] === $selectedOrderState;
+ }));
+ }
}
+
+ $orderStates = OrderState::getOrderStates((int)$this->context->language->id);
+
$this->context->smarty->assign(array(
'orders' => $orders,
+ 'order_states' => $orderStates,
+ 'selected_order_state' => $selectedOrderState,
+ 'history_search' => $historySearch,
'overbooking_order_states' => OrderState::getOverBookingStates(),
'invoiceAllowed' => (int)Configuration::get('PS_INVOICE'),
'reorderingAllowed' => !(bool)Configuration::get('PS_DISALLOW_HISTORY_REORDERING'),
diff --git a/controllers/front/MyAccountController.php b/controllers/front/MyAccountController.php
index b1960f1df6..0dd4e87a9f 100644
--- a/controllers/front/MyAccountController.php
+++ b/controllers/front/MyAccountController.php
@@ -34,7 +34,7 @@ class MyAccountControllerCore extends FrontController
public function setMedia()
{
parent::setMedia();
- $this->addCSS(_THEME_CSS_DIR_.'my-account.css');
+ // $this->addCSS(_THEME_CSS_DIR_.'my-account.css');
}
/**
diff --git a/controllers/front/OrderDetailController.php b/controllers/front/OrderDetailController.php
index 8f50f3991d..1f0ddcaab5 100644
--- a/controllers/front/OrderDetailController.php
+++ b/controllers/front/OrderDetailController.php
@@ -858,7 +858,7 @@ public function setMedia()
if (Tools::getValue('ajax') != 'true') {
parent::setMedia();
- $this->addCSS(_THEME_CSS_DIR_.'order-detail.css');
+ // $this->addCSS(_THEME_CSS_DIR_.'order-detail.css');
$this->addJS(array(
_THEME_JS_DIR_.'order-detail.js',
diff --git a/controllers/front/ParentOrderController.php b/controllers/front/ParentOrderController.php
index a519c33059..58b98ffdee 100644
--- a/controllers/front/ParentOrderController.php
+++ b/controllers/front/ParentOrderController.php
@@ -316,8 +316,9 @@ protected function _assignShoppingCart()
{
$summary = $this->context->cart->getSummaryDetails();
$cartProducts = $this->context->cart->getProducts();
+ $feat_img_dir = _PS_IMG_.'rf/';
if (!empty($cartProducts)) {
-
+ $this->context->smarty->assign('feat_img_dir', $feat_img_dir);
if ($cartBookingInfo = HotelCartBookingData::getHotelCartBookingData()) {
$this->context->smarty->assign('cart_htl_data', $cartBookingInfo);
}
diff --git a/controllers/front/ProductController.php b/controllers/front/ProductController.php
index e9fb16151e..72eddb1dc6 100644
--- a/controllers/front/ProductController.php
+++ b/controllers/front/ProductController.php
@@ -442,6 +442,7 @@ public function initContent()
'hotel_latitude' => $hotel_branch_obj->latitude,
'hotel_longitude' => $hotel_branch_obj->longitude,
'hotel_map_input_text' => $hotel_branch_obj->map_input_text,
+ 'hotel_email' => $hotel_branch_obj->email,
'hotel_address1' => $addressInfo['address1'],
'hotel_phone' => $addressInfo['phone'],
'hotel_name' => $hotel_name,
@@ -573,7 +574,8 @@ public function initContent()
'category-'.(isset($this->category) ? $this->category->getFieldByLang('link_rewrite') : ''),
),
'display_discount_price' => Configuration::get('PS_DISPLAY_DISCOUNT_PRICE'),
- 'display_google_maps' => Configuration::get('WK_GOOGLE_ACTIVE_MAP'),
+ // Only show the map tab when Maps is enabled and required credentials are configured.
+ 'display_google_maps' => (bool) (Configuration::get('WK_GOOGLE_ACTIVE_MAP')&& Configuration::get('PS_API_KEY')&& Configuration::get('PS_MAP_ID')),
)
);
}
diff --git a/controllers/front/RegisterController.php b/controllers/front/RegisterController.php
new file mode 100644
index 0000000000..8903c09a31
--- /dev/null
+++ b/controllers/front/RegisterController.php
@@ -0,0 +1,666 @@
+confirmations = array();
+ $this->informations = array();
+ $this->errors = array();
+ $this->ajaxExtraData = array();
+
+ if (!Tools::getIsset('step') && $this->context->customer->isLogged() && !$this->ajax) {
+ Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
+ }
+ }
+
+ /**
+ * Set default medias for this controller
+ * @see FrontController::setMedia()
+ */
+ public function setMedia()
+ {
+ parent::setMedia();
+ if (!$this->useMobileTheme()) {
+ $this->addCSS(_THEME_CSS_DIR_.'authentication.css');
+ }
+
+ $this->addJqueryPlugin('typewatch');
+ $this->addJS(array(
+ _THEME_JS_DIR_.'tools/statesManagement.js',
+ _THEME_JS_DIR_.'authentication.js',
+ _PS_JS_DIR_.'validate.js'
+ ));
+ }
+
+ /**
+ * Run ajax process
+ * @see FrontController::displayAjax()
+ */
+ public function displayAjax()
+ {
+ $this->display();
+ }
+
+ /**
+ * Assign template vars related to page content
+ * @see FrontController::initContent()
+ */
+ public function initContent()
+ {
+ parent::initContent();
+
+ $this->context->smarty->assign('genders', Gender::getGenders());
+
+ $this->assignDate();
+
+ $this->assignCountries();
+
+ $newsletter = Configuration::get('PS_CUSTOMER_NWSL') || (Module::isInstalled('blocknewsletter') && Module::getInstanceByName('blocknewsletter')->active);
+
+ $this->context->smarty->assign('birthday', (bool) Configuration::get('PS_CUSTOMER_BIRTHDATE'));
+ $this->context->smarty->assign('newsletter', $newsletter);
+ $this->context->smarty->assign('optin', (bool)Configuration::get('PS_CUSTOMER_OPTIN'));
+
+ $back = Tools::getValue('back');
+ $key = Tools::safeOutput(Tools::getValue('key'));
+
+ if (!empty($key)) {
+ $back .= (strpos($back, '?') !== false ? '&' : '?').'key='.$key;
+ }
+
+ // sanitize backurl for XSS protection
+ $back = filter_var($back, FILTER_SANITIZE_URL);
+
+ if ($back == Tools::secureReferrer(Tools::getValue('back'))) {
+ $this->context->smarty->assign('back', html_entity_decode($back));
+ } else {
+ $this->context->smarty->assign('back', Tools::safeOutput($back));
+ }
+
+ if (Tools::getValue('display_guest_checkout')) {
+ if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) {
+ $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true);
+ } else {
+ $countries = Country::getCountries($this->context->language->id, true);
+ }
+
+ $this->context->smarty->assign(array(
+ 'inOrderProcess' => true,
+ 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'),
+ 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'),
+ 'sl_country' => (int)$this->id_country,
+ 'countries' => $countries
+ ));
+ }
+
+ if (Tools::getValue('multi-shipping') == 1) {
+ $this->context->smarty->assign('multi_shipping', true);
+ } else {
+ $this->context->smarty->assign('multi_shipping', false);
+ }
+
+ $this->context->smarty->assign('field_required', $this->context->customer->validateFieldsRequiredDatabase());
+
+ $this->assignAddressFormat();
+
+ // Call a hook to display more information on form
+ $this->context->smarty->assign(array(
+ 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'),
+ 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop')
+ ));
+
+ // Just set $this->template value here in case it's used by Ajax
+ $this->setTemplate(_PS_THEME_DIR_.'register.tpl');
+ }
+
+ /**
+ * Assign date var to smarty
+ */
+ protected function assignDate()
+ {
+ $selectedYears = (int)(Tools::getValue('years', 0));
+ $years = Tools::dateYears();
+ $selectedMonths = (int)(Tools::getValue('months', 0));
+ $months = Tools::dateMonths();
+ $selectedDays = (int)(Tools::getValue('days', 0));
+ $days = Tools::dateDays();
+
+ $this->context->smarty->assign(array(
+ 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'),
+ 'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), //retro compat
+ 'years' => $years,
+ 'sl_year' => $selectedYears,
+ 'months' => $months,
+ 'sl_month' => $selectedMonths,
+ 'days' => $days,
+ 'sl_day' => $selectedDays
+ ));
+ }
+
+ /**
+ * Assign countries var to smarty
+ */
+ protected function assignCountries()
+ {
+ $this->id_country = (int)Tools::getCountry();
+ if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) {
+ $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true);
+ } else {
+ $countries = Country::getCountries($this->context->language->id, true);
+ }
+ $this->context->smarty->assign(array(
+ 'countries' => $countries,
+ 'PS_REGISTRATION_PROCESS_TYPE' => Configuration::get('PS_REGISTRATION_PROCESS_TYPE'),
+ 'sl_country' => (int)$this->id_country,
+ ));
+ }
+
+ /**
+ * Assign address var to smarty
+ */
+ protected function assignAddressFormat()
+ {
+ $addressItems = array();
+ $addressFormat = AddressFormat::getOrderedAddressFields((int)$this->id_country, false, true);
+ $requireFormFieldsList = AddressFormat::getFieldsRequired();
+
+ foreach ($addressFormat as $addressline) {
+ foreach (explode(' ', $addressline) as $addressItem) {
+ $addressItems[] = trim($addressItem);
+ }
+ }
+
+ // Add missing require fields for a new user susbscription form
+ foreach ($requireFormFieldsList as $fieldName) {
+ if (!in_array($fieldName, $addressItems)) {
+ $addressItems[] = trim($fieldName);
+ }
+ }
+
+ foreach (array('inv', 'dlv') as $addressType) {
+ $this->context->smarty->assign(array(
+ $addressType.'_adr_fields' => $addressFormat,
+ $addressType.'_all_fields' => $addressItems,
+ 'required_fields' => $requireFormFieldsList
+ ));
+ }
+ }
+
+ /**
+ * Start forms process
+ * @see FrontController::postProcess()
+ */
+ public function postProcess()
+ {
+ if (Tools::isSubmit('SubmitCreate')) {
+ $this->processSubmitCreate();
+ }
+
+ if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) {
+ $this->processSubmitAccount();
+ }
+ }
+
+ /**
+ * Process the newsletter settings and set the customer infos.
+ *
+ * @param Customer $customer Reference on the customer Object.
+ *
+ * @note At this point, the email has been validated.
+ */
+ protected function processCustomerNewsletter(&$customer)
+ {
+ $blocknewsletter = Module::isInstalled('blocknewsletter') && $module_newsletter = Module::getInstanceByName('blocknewsletter');
+ if ($blocknewsletter && $module_newsletter->active && !Tools::getValue('newsletter')) {
+ require_once _PS_MODULE_DIR_.'blocknewsletter/blocknewsletter.php';
+ if (is_callable(array($module_newsletter, 'isNewsletterRegistered')) && $module_newsletter->isNewsletterRegistered(Tools::getValue('email')) == Blocknewsletter::GUEST_REGISTERED) {
+ /* Force newsletter registration as customer as already registred as guest */
+ $_POST['newsletter'] = true;
+ }
+ }
+
+ if (Tools::getValue('newsletter')) {
+ $customer->newsletter = true;
+ $customer->ip_registration_newsletter = pSQL(Tools::getRemoteAddr());
+ $customer->newsletter_date_add = pSQL(date('Y-m-d H:i:s'));
+ /** @var Blocknewsletter $module_newsletter */
+ if ($blocknewsletter && $module_newsletter->active) {
+ $module_newsletter->confirmSubscription(Tools::getValue('email'));
+ }
+ }
+ }
+
+ /**
+ * Process submit on an account
+ */
+ protected function processSubmitAccount()
+ {
+ Hook::exec('actionBeforeSubmitAccount');
+ $this->create_account = true;
+ if (Tools::isSubmit('submitAccount')) {
+ $this->context->smarty->assign('email_create', 1);
+ }
+ // New Guest customer
+ if (!Tools::getValue('is_new_customer', 1) && !Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) {
+ $this->errors[] = Tools::displayError('You cannot create a guest account.');
+ }
+ if (!Tools::getValue('is_new_customer', 1)) {
+ $_POST['passwd'] = md5(time()._COOKIE_KEY_);
+ }
+ if ($guest_email = Tools::getValue('guest_email')) {
+ $_POST['email'] = $guest_email;
+ }
+ // Checked the user address in case he changed his email address
+ if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) {
+ if (Customer::customerExists($email)) {
+ $this->errors[] = Tools::displayError('An account using this email address has already been registered.', false);
+ } elseif (Tools::getValue('is_new_customer', 1) && Customer::customerExists($email, false, false)) {
+ $this->errors[] = Tools::displayError('You are already registered as a guest with this email address.').' '.Tools::displayError('').' to generate a password for your account.';
+ }
+ }
+
+ if (!count($this->errors)) {
+ // Preparing customer
+ $customer = new Customer();
+ $lastnameAddress = Tools::getValue('lastname');
+ $firstnameAddress = Tools::getValue('firstname');
+ $phoneAddress = Tools::getValue('phone');
+ $_POST['lastname'] = Tools::getValue('customer_lastname', $lastnameAddress);
+ $_POST['firstname'] = Tools::getValue('customer_firstname', $firstnameAddress);
+ $_POST['phone'] = Tools::getValue('customer_phone', $phoneAddress);
+ $addresses_types = [];
+ if (Configuration::get('PS_REGISTRATION_PROCESS_TYPE')) {
+ $addresses_types[] = 'address';
+ }
+
+ if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) {
+ $addresses_types[] = 'address_invoice';
+ }
+
+ if (Configuration::get('PS_ONE_PHONE_AT_LEAST') && !Tools::getValue('phone')) {
+ $this->errors[] = Tools::displayError('Phone number is required.');
+ }
+
+ if (!Tools::getValue('is_new_customer', 1)) {
+ if (Validate::isEmail($email = Tools::getValue('email'))
+ && $idCustomer = Customer::customerExists(Tools::getValue('email'), true, false)
+ ) {
+ $customer = new Customer($idCustomer);
+ }
+ }
+
+ $this->errors = array_unique(array_merge($this->errors, $customer->validateController()));
+
+ // Check the requires fields which are settings in the BO
+ $this->errors = $this->errors + $customer->validateFieldsRequiredDatabase();
+
+ if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
+ if (!count($this->errors)) {
+
+ $this->processCustomerNewsletter($customer);
+
+ $customer->firstname = Tools::ucwords($customer->firstname);
+ if (Configuration::get('PS_CUSTOMER_BIRTHDATE')) {
+ $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
+ if (!Validate::isBirthDate($customer->birthday)) {
+ $this->errors[] = Tools::displayError('Invalid date of birth.');
+ }
+ }
+
+ // New Guest customer
+ $customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0);
+ $customer->active = 1;
+
+ if (!count($this->errors)) {
+ $customer->phone = Tools::getValue('phone');
+ if ($customer->add()) {
+ if (!$customer->is_guest) {
+ if (!$this->sendConfirmationMail($customer)) {
+ $this->errors[] = Tools::displayError('The email cannot be sent.');
+ }
+ }
+
+ $this->context->updateCustomer($customer, 1);
+
+ $this->context->cart->update();
+ Hook::exec('actionCustomerAccountAdd', array(
+ '_POST' => $_POST,
+ 'newCustomer' => $customer
+ ));
+ if ($this->ajax) {
+ $return = array(
+ 'hasError' => !empty($this->errors),
+ 'errors' => $this->errors,
+ 'isSaved' => true,
+ 'id_customer' => (int)$this->context->cookie->id_customer,
+ 'id_address_delivery' => $this->context->cart->id_address_delivery,
+ 'id_address_invoice' => $this->context->cart->id_address_invoice,
+ 'token' => Tools::getToken(false)
+ );
+ $this->ajaxDie(json_encode($return));
+ }
+
+ if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
+ Tools::redirect(html_entity_decode($back));
+ }
+
+ // redirection: if cart is not empty : redirection to the cart
+ if (count($this->context->cart->getProducts(true)) > 0) {
+ $multi = (int)Tools::getValue('multi-shipping');
+ Tools::redirect('index.php?controller=order'.($multi ? '&multi-shipping='.$multi : ''));
+ }
+ // else : redirection to the account
+ else {
+ Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
+ }
+ } else {
+ $this->errors[] = Tools::displayError('An error occurred while creating your account.');
+ }
+ }
+ }
+ } else {
+ // if registration type is in one step, we save the address
+
+ $_POST['lastname'] = $lastnameAddress;
+ $_POST['firstname'] = $firstnameAddress;
+ $post_back = $_POST;
+ // Preparing addresses
+ foreach ($addresses_types as $addresses_type) {
+ $$addresses_type = new Address();
+ $$addresses_type->id_customer = 1;
+
+ if ($addresses_type == 'address_invoice') {
+ foreach ($_POST as $key => &$post) {
+ if ($tmp = Tools::getValue($key.'_invoice')) {
+ $post = $tmp;
+ }
+ }
+ }
+
+ $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
+ if ($addresses_type == 'address_invoice') {
+ $_POST = $post_back;
+ }
+
+ if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) {
+ $this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country');
+ }
+
+ if (!$country->active) {
+ $this->errors[] = Tools::displayError('This country is not active.');
+ }
+
+ $postcode = $$addresses_type->postcode;
+ /* Check zip code format */
+ if ($country->zip_code_format && !$country->checkZipCode($postcode)) {
+ $this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))));
+ } elseif (empty($postcode) && $country->need_zip_code) {
+ $this->errors[] = Tools::displayError('A Zip / Postal code is required.');
+ } elseif ($postcode && !Validate::isPostCode($postcode)) {
+ $this->errors[] = Tools::displayError('The Zip / Postal code is invalid.');
+ }
+
+ if ($country->need_identification_number) {
+ if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE')) {
+ $$addresses_type->dni = null;
+ } elseif (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))) {
+ $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.');
+ }
+ } elseif (!$country->need_identification_number) {
+ $$addresses_type->dni = null;
+ }
+
+ if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) {
+ if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) {
+ $this->errors[] = Tools::displayError('Country is invalid');
+ }
+ }
+ $contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0;
+ $id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0;
+ if ((Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) {
+ $this->errors[] = Tools::displayError('This country requires you to choose a State.');
+ }
+ }
+ }
+ if (!(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == '')
+ && !@checkdate((int) Tools::getValue('months'), (int) Tools::getValue('days'), (int) Tools::getValue('years'))
+ ) {
+ $this->errors[] = Tools::displayError('Invalid date of birth');
+ }
+
+ if (!count($this->errors)) {
+ if (!Tools::getValue('is_new_customer', 1)) {
+ if ($idCustomer = Customer::customerExists(Tools::getValue('email'), true, false)) {
+ if ($idAddress = Customer::getCustomerIdAddress($idCustomer)) {
+ $address = new Address($idAddress);
+ }
+ }
+ } else {
+ if (Customer::customerExists(Tools::getValue('email'))) {
+ $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please enter a valid password or request a new one. ', false);
+ }
+ }
+
+ $this->processCustomerNewsletter($customer);
+
+ if (Configuration::get('PS_CUSTOMER_BIRTHDATE')) {
+ $customer->birthday = (empty($_POST['years']) ? '' : (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
+ if (!Validate::isBirthDate($customer->birthday)) {
+ $this->errors[] = Tools::displayError('Invalid date of birth');
+ }
+ }
+
+ if (!count($this->errors)) {
+ $customer->active = 1;
+ // New Guest customer
+ if (Tools::isSubmit('is_new_customer')) {
+ $customer->is_guest = !Tools::getValue('is_new_customer', 1);
+ } else {
+ $customer->is_guest = 0;
+ }
+ $customer->phone = Tools::getValue('phone');
+ if (!$customer->save()) {
+ $this->errors[] = Tools::displayError('An error occurred while creating your account.');
+ } else {
+ $_POST['phone'] = $phoneAddress;
+
+ foreach ($addresses_types as $addresses_type) {
+ $$addresses_type->id_customer = (int)$customer->id;
+ if ($addresses_type == 'address_invoice') {
+ foreach ($_POST as $key => &$post) {
+ if ($tmp = Tools::getValue($key.'_invoice')) {
+ $post = $tmp;
+ }
+ }
+ }
+
+ $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController()));
+ if ($addresses_type == 'address_invoice') {
+ $_POST = $post_back;
+ }
+ if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->save()) {
+ $this->errors[] = Tools::displayError('An error occurred while creating your address.');
+ }
+ }
+ if (!count($this->errors)) {
+ if (!$customer->is_guest) {
+ $this->context->customer = $customer;
+ $customer->cleanGroups();
+ // we add the guest customer in the default customer group
+ $customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP')));
+ if (!$this->sendConfirmationMail($customer)) {
+ // webkul - we will not stop process on email delivery fails
+ //$this->errors[] = Tools::displayError('The email cannot be sent.');
+ }
+ } else {
+ $customer->cleanGroups();
+ // we add the guest customer in the guest customer group
+ $customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP')));
+ }
+
+ $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id);
+ if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) {
+ $this->context->cart->id_address_invoice = (int)$address_invoice->id;
+ }
+
+ if ($this->ajax && Configuration::get('PS_ORDER_PROCESS_TYPE')) {
+ $delivery_option = array((int)$this->context->cart->id_address_delivery => (int)$this->context->cart->id_carrier.',');
+ $this->context->cart->setDeliveryOption($delivery_option);
+ }
+
+ $this->context->updateCustomer($customer, 1);
+ // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
+ $this->context->cart->update();
+
+ // Avoid articles without delivery address on the cart
+ $this->context->cart->autosetProductAddress();
+
+ Hook::exec('actionCustomerAccountAdd', array(
+ '_POST' => $_POST,
+ 'newCustomer' => $customer
+ ));
+ if ($this->ajax) {
+ $return = array(
+ 'hasError' => !empty($this->errors),
+ 'errors' => $this->errors,
+ 'isSaved' => true,
+ 'id_customer' => (int)$this->context->cookie->id_customer,
+ 'id_address_delivery' => $this->context->cart->id_address_delivery,
+ 'id_address_invoice' => $this->context->cart->id_address_invoice,
+ 'token' => Tools::getToken(false)
+ );
+ $this->ajaxDie(json_encode($return));
+ }
+ // if registration type is in two steps, we redirect to register address
+ if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) {
+ Tools::redirect('index.php?controller=address');
+ }
+
+ if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer($back)) {
+ Tools::redirect(html_entity_decode($back));
+ }
+
+ // redirection: if cart is not empty : redirection to the cart
+ if (count($this->context->cart->getProducts(true)) > 0) {
+ Tools::redirect('index.php?controller=order'.($multi = (int)Tools::getValue('multi-shipping') ? '&multi-shipping='.$multi : ''));
+ }
+ // else : redirection to the account
+ else {
+ Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account'));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (count($this->errors)) {
+ //for retro compatibility to display guest account creation form on authentication page
+ if (Tools::getValue('submitGuestAccount')) {
+ $_GET['display_guest_checkout'] = 1;
+ }
+
+ if (!Tools::getValue('is_new_customer')) {
+ unset($_POST['passwd']);
+ }
+ if ($this->ajax) {
+ $return = array(
+ 'hasError' => !empty($this->errors),
+ 'errors' => $this->errors,
+ 'isSaved' => false,
+ 'id_customer' => 0
+ );
+ $this->ajaxDie(json_encode($return));
+ }
+ $this->context->smarty->assign('account_error', $this->errors);
+ }
+ }
+
+ /**
+ * Process submit on a creation
+ */
+ protected function processSubmitCreate()
+ {
+ if (!Validate::isEmail($email = trim(Tools::getValue('email_create'))) || empty($email)) {
+ $this->errors[] = Tools::displayError('Invalid email address.');
+ } elseif (Customer::customerExists($email)) {
+ $this->errors[] = Tools::displayError('An account using this email address has already been registered. Please choose another one or sign in.', false);
+ $_POST['email'] = trim(Tools::getValue('email_create'));
+ unset($_POST['email_create']);
+ } elseif ($id_customer = Customer::customerExists($email, true, false)) {
+ $this->informations[] = Tools::displayError('You are already registered as a guest with this email address.').' '.Tools::displayError('').' to generate a password for your account.';
+ } elseif (Tools::getValue('back') && !Validate::isUrl(Tools::getValue('back'))) {
+ $this->errors[] = Tools::displayError('back url is invalid.');
+ } else {
+ $this->create_account = true;
+ $this->context->smarty->assign('email_create', Tools::safeOutput($email));
+ $_POST['email'] = $email;
+ }
+ }
+
+ /**
+ * sendConfirmationMail
+ * @param Customer $customer
+ * @return bool
+ */
+ protected function sendConfirmationMail(Customer $customer)
+ {
+ if (!Configuration::get('PS_CUSTOMER_CREATION_EMAIL')) {
+ return true;
+ }
+
+ return Mail::Send(
+ $this->context->language->id,
+ 'account',
+ Mail::l('Welcome!'),
+ array(
+ '{firstname}' => $customer->firstname,
+ '{lastname}' => $customer->lastname,
+ '{email}' => $customer->email,
+ ),
+ $customer->email,
+ $customer->firstname.' '.$customer->lastname
+ );
+ }
+}
diff --git a/img/logo.jpg b/img/logo.jpg
index 422601c85c..5a1e0f646a 100644
Binary files a/img/logo.jpg and b/img/logo.jpg differ
diff --git a/img/rf/1.jpg b/img/rf/1.jpg
index 9d820ba439..b138bc1211 100644
Binary files a/img/rf/1.jpg and b/img/rf/1.jpg differ
diff --git a/img/rf/2.jpg b/img/rf/2.jpg
index ed46f7fff3..5045ea07f6 100644
Binary files a/img/rf/2.jpg and b/img/rf/2.jpg differ
diff --git a/img/rf/3.jpg b/img/rf/3.jpg
index d5f91bdbfc..1255a611a7 100644
Binary files a/img/rf/3.jpg and b/img/rf/3.jpg differ
diff --git a/img/rf/4.jpg b/img/rf/4.jpg
index 05c7251eb9..328a6eb4e1 100644
Binary files a/img/rf/4.jpg and b/img/rf/4.jpg differ
diff --git a/img/rf/5.jpg b/img/rf/5.jpg
index 33236f769c..4bafc2798b 100644
Binary files a/img/rf/5.jpg and b/img/rf/5.jpg differ
diff --git a/img/rf/6.jpg b/img/rf/6.jpg
index 6f057b5a98..c8189167ce 100644
Binary files a/img/rf/6.jpg and b/img/rf/6.jpg differ
diff --git a/img/rf/7.jpg b/img/rf/7.jpg
index bd7203ed16..801de40f67 100644
Binary files a/img/rf/7.jpg and b/img/rf/7.jpg differ
diff --git a/install/data/theme.sql b/install/data/theme.sql
index 9ce4b813b1..b2322d0b9b 100644
--- a/install/data/theme.sql
+++ b/install/data/theme.sql
@@ -52,12 +52,6 @@ UPDATE `PREFIX_configuration` SET value = 'CAT3,CAT8,CAT5,LNK1' WHERE name = 'MO
UPDATE `PREFIX_configuration` SET value = '0' WHERE name = 'MOD_BLOCKTOPMENU_SEARCH';
UPDATE `PREFIX_configuration` SET value = 'https://www.facebook.com/qloapps' WHERE name = 'BLOCKSOCIAL_FACEBOOK';
UPDATE `PREFIX_configuration` SET value = 'https://twitter.com/qloapps' WHERE name = 'BLOCKSOCIAL_TWITTER';
-UPDATE `PREFIX_configuration` SET value = 'My Company' WHERE name = 'BLOCKCONTACTINFOS_COMPANY';
-UPDATE `PREFIX_configuration` SET value = '42 Puffin street\n12345 Puffinville\nFrance' WHERE name = 'BLOCKCONTACTINFOS_ADDRESS';
-UPDATE `PREFIX_configuration` SET value = '0123-456-789' WHERE name = 'BLOCKCONTACTINFOS_PHONE';
-UPDATE `PREFIX_configuration` SET value = 'sales@yourcompany.com' WHERE name = 'BLOCKCONTACTINFOS_EMAIL';
-UPDATE `PREFIX_configuration` SET value = '0123-456-789' WHERE name = 'BLOCKCONTACT_TELNUMBER';
-UPDATE `PREFIX_configuration` SET value = 'sales@yourcompany.com' WHERE name = 'BLOCKCONTACT_EMAIL';
UPDATE `PREFIX_configuration` SET value = '1' WHERE name = 'SUPPLIER_DISPLAY_TEXT';
UPDATE `PREFIX_configuration` SET value = '5' WHERE name = 'SUPPLIER_DISPLAY_TEXT_NB';
UPDATE `PREFIX_configuration` SET value = '1' WHERE name = 'SUPPLIER_DISPLAY_FORM';
@@ -73,15 +67,27 @@ DELETE FROM `PREFIX_hook_module` WHERE id_hook = (SELECT id_hook FROM `PREFIX_ho
/* displayHome */
SET @id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayHome');
UPDATE `PREFIX_hook_module` SET position = 1
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'themeconfigurator')
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'wkhotelroom')
AND id_hook = @id_hook;
UPDATE `PREFIX_hook_module` SET position = 2
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockfacebook')
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'wkhotelfeaturesblock')
AND id_hook = @id_hook;
UPDATE `PREFIX_hook_module` SET position = 3
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcmsinfo')
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'hotelreservationsystem')
+AND id_hook = @id_hook;
+
+UPDATE `PREFIX_hook_module` SET position = 4
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'qlohotelofferings')
+AND id_hook = @id_hook;
+
+UPDATE `PREFIX_hook_module` SET position = 5
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'wktestimonialblock')
+AND id_hook = @id_hook;
+
+UPDATE `PREFIX_hook_module` SET position = 6
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'wkabouthotelblock')
AND id_hook = @id_hook;
/* displayNav */
@@ -98,10 +104,6 @@ UPDATE `PREFIX_hook_module` SET position = 3
WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocklanguages')
AND id_hook = @id_hook;
-UPDATE `PREFIX_hook_module` SET position = 4
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcontact')
-AND id_hook = @id_hook;
-
/* displayTop */
SET @id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayTop');
@@ -150,21 +152,34 @@ AND id_hook = @id_hook;
/* displayFooter */
SET @id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayFooter');
UPDATE `PREFIX_hook_module` SET position = 1
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocknewsletter')
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'hotelreservationsystem')
AND id_hook = @id_hook;
UPDATE `PREFIX_hook_module` SET position = 2
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'wkabouthotelblock')
+AND id_hook = @id_hook;
+
+UPDATE `PREFIX_hook_module` SET position = 3
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocknavigationmenu')
+AND id_hook = @id_hook;
+
+UPDATE `PREFIX_hook_module` SET position = 4
WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocksocial')
AND id_hook = @id_hook;
UPDATE `PREFIX_hook_module` SET position = 5
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockmyaccountfooter')
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocknewsletter')
AND id_hook = @id_hook;
UPDATE `PREFIX_hook_module` SET position = 6
-WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcontactinfos')
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'wkfooternotificationblock')
AND id_hook = @id_hook;
+UPDATE `PREFIX_hook_module` SET position = 9
+WHERE id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata')
+AND id_hook = @id_hook;
+
+
/* displayProductButtons */
SET @id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayProductButtons');
UPDATE `PREFIX_hook_module` SET position = 1
diff --git a/install/data/xml/meta.xml b/install/data/xml/meta.xml
index 4c9a0b2259..106b923e5b 100644
--- a/install/data/xml/meta.xml
+++ b/install/data/xml/meta.xml
@@ -152,5 +152,9 @@
'; + var childAgeSelect = '
'; childAgeSelect += '