')).parent().data('animated', false);
+
+ if ($element.data('animated') !== false)
+ $div.addClass('switch-animate').data('animated', true);
+
+ $div
+ .append($switchLeft)
+ .append($label)
+ .append($switchRight);
+
+ $element.find('>div').addClass(
+ $element.find(inputSelector).is(':checked') ? 'switch-on' : 'switch-off'
+ );
+
+ if ($element.find(inputSelector).is(':disabled'))
+ $(this).addClass('deactivate');
+
+ var changeStatus = function ($this) {
+ if ($element.parent('label').is('.label-change-switch')) {
+
+ } else {
+ $this.siblings('label').trigger('mousedown').trigger('mouseup').trigger('click');
+ }
+ };
+
+ $element.on('keydown', function (e) {
+ if (e.keyCode === 32) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ changeStatus($(e.target).find('span:first'));
+ }
+ });
+
+ $switchLeft.on('click', function (e) {
+ changeStatus($(this));
+ });
+
+ $switchRight.on('click', function (e) {
+ changeStatus($(this));
+ });
+
+ $element.find(inputSelector).on('change', function (e, skipOnChange) {
+ var $this = $(this)
+ , $element = $this.parent()
+ , thisState = $this.is(':checked')
+ , state = $element.is('.switch-off');
+
+ e.preventDefault();
+
+ $element.css('left', '');
+
+ if (state === thisState) {
+
+ if (thisState)
+ $element.removeClass('switch-off').addClass('switch-on');
+ else $element.removeClass('switch-on').addClass('switch-off');
+
+ if ($element.data('animated') !== false)
+ $element.addClass("switch-animate");
+
+ if (typeof skipOnChange === 'boolean' && skipOnChange)
+ return;
+
+ $element.parent().trigger('switch-change', {'el': $this, 'value': thisState})
+ }
+ });
+
+ $element.find('label').on('mousedown touchstart', function (e) {
+ var $this = $(this);
+ moving = false;
+
+ e.preventDefault();
+ e.stopImmediatePropagation();
+
+ $this.closest('div').removeClass('switch-animate');
+
+ if ($this.closest('.has-switch').is('.deactivate')) {
+ $this.unbind('click');
+ } else if ($this.closest('.switch-on').parent().is('.radio-no-uncheck')) {
+ $this.unbind('click');
+ } else {
+ $this.on('mousemove touchmove', function (e) {
+ var $element = $(this).closest('.make-switch')
+ , relativeX = (e.pageX || e.originalEvent.targetTouches[0].pageX) - $element.offset().left
+ , percent = (relativeX / $element.width()) * 100
+ , left = 25
+ , right = 75;
+
+ moving = true;
+
+ if (percent < left)
+ percent = left;
+ else if (percent > right)
+ percent = right;
+
+ $element.find('>div').css('left', (percent - right) + "%")
+ });
+
+ $this.on('click touchend', function (e) {
+ var $this = $(this)
+ , $myInputBox = $this.siblings('input');
+
+ e.stopImmediatePropagation();
+ e.preventDefault();
+
+ $this.unbind('mouseleave');
+
+ if (moving)
+ $myInputBox.prop('checked', !(parseInt($this.parent().css('left')) < -25));
+ else
+ $myInputBox.prop("checked", !$myInputBox.is(":checked"));
+
+ moving = false;
+ $myInputBox.trigger('change');
+ });
+
+ $this.on('mouseleave', function (e) {
+ var $this = $(this)
+ , $myInputBox = $this.siblings('input');
+
+ e.preventDefault();
+ e.stopImmediatePropagation();
+
+ $this.unbind('mouseleave mousemove');
+ $this.trigger('mouseup');
+
+ $myInputBox.prop('checked', !(parseInt($this.parent().css('left')) < -25)).trigger('change');
+ });
+
+ $this.on('mouseup', function (e) {
+ e.stopImmediatePropagation();
+ e.preventDefault();
+
+ $(this).trigger('mouseleave');
+ });
+ }
+ });
+
+ if ($form.data('bootstrapSwitch') !== 'injected') {
+ $form.bind('reset', function () {
+ setTimeout(function () {
+ $form.find('.make-switch').each(function () {
+ var $input = $(this).find(inputSelector);
+
+ $input.prop('checked', $input.is(':checked')).trigger('change');
+ });
+ }, 1);
+ });
+ $form.data('bootstrapSwitch', 'injected');
+ }
+ }
+ );
+ },
+ toggleActivation: function () {
+ var $this = $(this);
+
+ $this.toggleClass('deactivate');
+ $this.find(inputSelector).prop('disabled', $this.is('.deactivate'));
+ },
+ isActive: function () {
+ return !$(this).hasClass('deactivate');
+ },
+ setActive: function (active) {
+ var $this = $(this);
+
+ if (active) {
+ $this.removeClass('deactivate');
+ $this.find(inputSelector).removeAttr('disabled');
+ }
+ else {
+ $this.addClass('deactivate');
+ $this.find(inputSelector).attr('disabled', 'disabled');
+ }
+ },
+ toggleState: function (skipOnChange) {
+ var $input = $(this).find(':checkbox');
+ $input.prop('checked', !$input.is(':checked')).trigger('change', skipOnChange);
+ },
+ toggleRadioState: function (skipOnChange) {
+ var $radioinput = $(this).find(':radio');
+ $radioinput.not(':checked').prop('checked', !$radioinput.is(':checked')).trigger('change', skipOnChange);
+ },
+ toggleRadioStateAllowUncheck: function (uncheck, skipOnChange) {
+ var $radioinput = $(this).find(':radio');
+ if (uncheck) {
+ $radioinput.not(':checked').trigger('change', skipOnChange);
+ }
+ else {
+ $radioinput.not(':checked').prop('checked', !$radioinput.is(':checked')).trigger('change', skipOnChange);
+ }
+ },
+ setState: function (value, skipOnChange) {
+ $(this).find(inputSelector).prop('checked', value).trigger('change', skipOnChange);
+ },
+ setOnLabel: function (value) {
+ var $switchLeft = $(this).find(".switch-left");
+ $switchLeft.html(value);
+ },
+ setOffLabel: function (value) {
+ var $switchRight = $(this).find(".switch-right");
+ $switchRight.html(value);
+ },
+ setOnClass: function (value) {
+ var $switchLeft = $(this).find(".switch-left");
+ var color = '';
+ if (value !== undefined) {
+ if ($(this).attr('data-on') !== undefined) {
+ color = "switch-" + $(this).attr('data-on')
+ }
+ $switchLeft.removeClass(color);
+ color = "switch-" + value;
+ $switchLeft.addClass(color);
+ }
+ },
+ setOffClass: function (value) {
+ var $switchRight = $(this).find(".switch-right");
+ var color = '';
+ if (value !== undefined) {
+ if ($(this).attr('data-off') !== undefined) {
+ color = "switch-" + $(this).attr('data-off')
+ }
+ $switchRight.removeClass(color);
+ color = "switch-" + value;
+ $switchRight.addClass(color);
+ }
+ },
+ setAnimated: function (value) {
+ var $element = $(this).find(inputSelector).parent();
+ if (value === undefined) value = false;
+ $element.data('animated', value);
+ $element.attr('data-animated', value);
+
+ if ($element.data('animated') !== false) {
+ $element.addClass("switch-animate");
+ } else {
+ $element.removeClass("switch-animate");
+ }
+ },
+ setSizeClass: function (value) {
+ var $element = $(this);
+ var $switchLeft = $element.find(".switch-left");
+ var $switchRight = $element.find(".switch-right");
+ var $label = $element.find("label");
+ $.each(['switch-mini', 'switch-small', 'switch-large'], function (i, el) {
+ if (el !== value) {
+ $switchLeft.removeClass(el);
+ $switchRight.removeClass(el);
+ $label.removeClass(el);
+ } else {
+ $switchLeft.addClass(el);
+ $switchRight.addClass(el);
+ $label.addClass(el);
+ }
+ });
+ },
+ status: function () {
+ return $(this).find(inputSelector).is(':checked');
+ },
+ destroy: function () {
+ var $element = $(this)
+ , $div = $element.find('div')
+ , $form = $element.closest('form')
+ , $inputbox;
+
+ $div.find(':not(input)').remove();
+
+ $inputbox = $div.children();
+ $inputbox.unwrap().unwrap();
+
+ $inputbox.unbind('change');
+
+ if ($form) {
+ $form.unbind('reset');
+ $form.removeData('bootstrapSwitch');
+ }
+
+ return $inputbox;
+ }
+ };
+
+ if (methods[method])
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ else if (typeof method === 'object' || !method)
+ return methods.init.apply(this, arguments);
+ else
+ $.error('Method ' + method + ' does not exist!');
+ };
+}(jQuery);
+
+(function ($) {
+ $(function () {
+ $('.make-switch')['bootstrapSwitch']();
+ });
+})(jQuery);
\ No newline at end of file
diff --git a/templates/admin/default/assets/less/thelia/bootstrap-switch.less b/templates/admin/default/assets/less/thelia/bootstrap-switch.less
new file mode 100644
index 000000000..84a297f0b
--- /dev/null
+++ b/templates/admin/default/assets/less/thelia/bootstrap-switch.less
@@ -0,0 +1,160 @@
+.has-switch {
+ display: inline-block;
+ cursor: pointer;
+ border-radius: @input-border-radius;
+ border: 1px solid;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ position: relative;
+ text-align: left;
+ overflow: hidden;
+ line-height: 8px;
+ .user-select(none);
+ vertical-align: middle;
+
+ min-width: 100px;
+
+ &.switch-mini {
+ min-width: 72px;
+ }
+ &.switch-mini i.switch-mini-icons {
+ height: 1.20em;
+ line-height: 9px;
+ vertical-align: text-top;
+ text-align: center;
+ transform: scale(0.6);
+ margin-top: -1px;
+ margin-bottom: -1px;
+ }
+ &.switch-small {
+ min-width: 80px;
+ }
+
+ &.switch-large {
+ min-width: 120px;
+ }
+
+ &.deactivate {
+ .opacity(50);
+ cursor: default !important;
+ label, span {
+ cursor: default !important;
+ }
+ }
+ > div {
+ display: inline-block;
+ width: 150%;
+ position: relative;
+ top: 0;
+
+ &.switch-animate {
+ .transition(left 0.5s);
+ }
+ &.switch-off {
+ left: -50%;
+ }
+ &.switch-on {
+ left: 0%;
+ }
+ }
+ input[type=radio],
+ input[type=checkbox] {
+ //debug
+ display: none;
+ //position: absolute;
+ //margin-left: 60%;
+ //z-index: 123;
+ }
+
+ span, label {
+ .box-sizing(border-box);
+
+ cursor: pointer;
+ position: relative;
+ display: inline-block;
+ height: 100%;
+
+ padding-bottom: 4px;
+ padding-top: 4px;
+ font-size: 14px;
+ line-height: 20px;
+
+ &.switch-mini {
+ padding-bottom: 4px;
+ padding-top: 4px;
+ font-size: 10px;
+ line-height: 9px;
+ }
+
+ &.switch-small {
+ padding-bottom: 3px;
+ padding-top: 3px;
+ font-size: 12px;
+ line-height: 18px;
+ }
+
+ &.switch-large {
+ padding-bottom: 9px;
+ padding-top: 9px;
+ font-size: 16px;
+ line-height: normal;
+ }
+ }
+
+ label {
+ text-align: center;
+ margin-top: -1px;
+ margin-bottom: -1px;
+ z-index: 100;
+ width: 34%;
+ border-left: 1px solid @btn-default-border;
+ border-right: 1px solid @btn-default-border;
+
+ .button-variant(@btn-default-color, @btn-default-bg, @btn-default-border);
+
+ i {
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ line-height: 18px;
+ pointer-events: none;
+ }
+ }
+
+ span {
+ text-align: center;
+ z-index: 1;
+ width: 33%;
+
+ &.switch-left {
+ .border-left-radius(@input-border-radius);
+ }
+
+ &.switch-right {
+ .button-variant(@btn-default-color, @btn-default-bg, @btn-default-border);
+ .border-right-radius(@input-border-radius);
+ }
+
+ &.switch-primary, &.switch-left {
+ .button-variant(@btn-primary-color, @btn-primary-bg, @btn-primary-border);
+ }
+
+ &.switch-info {
+ .button-variant(@btn-info-color, @btn-info-bg, @btn-info-border);
+ }
+
+ &.switch-success {
+ .button-variant(@btn-success-color, @btn-success-bg, @btn-success-border);
+ }
+
+ &.switch-warning {
+ .button-variant(@btn-warning-color, @btn-warning-bg, @btn-warning-border);
+ }
+
+ &.switch-danger {
+ .button-variant(@btn-danger-color, @btn-danger-bg, @btn-danger-border);
+ }
+
+ &.switch-default {
+ .button-variant(@btn-default-color, @btn-default-bg, @btn-default-border);
+ }
+ }
+}
\ No newline at end of file
diff --git a/templates/admin/default/assets/less/thelia/thelia.less b/templates/admin/default/assets/less/thelia/thelia.less
index 560f78bc1..3883c7067 100644
--- a/templates/admin/default/assets/less/thelia/thelia.less
+++ b/templates/admin/default/assets/less/thelia/thelia.less
@@ -9,6 +9,7 @@
@import "tables.less";
@import "tablesorter.less";
@import "bootstrap-editable.less";
+@import "bootstrap-switch.less";
// -- Base styling ------------------------------------------------------------
diff --git a/templates/admin/default/assets/less/thelia/variables.less b/templates/admin/default/assets/less/thelia/variables.less
index dec523afc..35bc931b5 100755
--- a/templates/admin/default/assets/less/thelia/variables.less
+++ b/templates/admin/default/assets/less/thelia/variables.less
@@ -44,4 +44,10 @@
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
-@zindex-dropdown: 1005;
\ No newline at end of file
+@zindex-dropdown: 1005;
+
+// Forms
+// -------------------------
+
+
+@input-border-focus: @link-color;
\ No newline at end of file
diff --git a/templates/admin/default/categories.html b/templates/admin/default/categories.html
index fdf2ab093..a3097f722 100755
--- a/templates/admin/default/categories.html
+++ b/templates/admin/default/categories.html
@@ -4,12 +4,6 @@
{block name="check-permissions"}admin.catalog.view{/block}
-{block name="after-admin-css"}
- {stylesheets file='assets/bootstrap-editable/css/bootstrap-editable.css' filters='cssembed'}
-
- {/stylesheets}
-{/block}
-
{block name="main-content"}
@@ -80,7 +74,7 @@
}
-
|
+
{intl l='Actions'} |
@@ -89,7 +83,7 @@
i={$ID} {loop type="image" name="cat_image" source="category" source_id="$ID" limit="1" width="50" height="50" resize_mode="crop" backend_context="1"}
-
+
{/loop}
|
@@ -103,11 +97,15 @@
{loop type="auth" name="can_change" roles="ADMIN" permissions="admin.category.edit"}
-
+
+
+
{/loop}
{elseloop rel="can_change"}
-
+
+
+
{/elseloop}
|
@@ -123,15 +121,17 @@
-
+
+
- {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.category.edit"}
-
- {/loop}
+ {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.category.edit"}
+
+ {/loop}
- {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.category.delete"}
-
- {/loop}
+ {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.category.delete"}
+
+ {/loop}
+
|
{/loop}
@@ -235,7 +235,9 @@
{module_include location='product_list_row'}
-
+
+
+
|
@@ -261,7 +263,7 @@
{elseloop rel="product_list"}
- {intl l="This category doesn't have any products. To add a new product, click the + button above."} |
+ {intl l="This category doesn't have any products. To add a new product, click the + button above."} |
{/elseloop}
@@ -278,75 +280,78 @@
{include file="includes/delete-category-dialog.html"}
{/block}
-{block name="after-javascript-include"}
- {javascripts file='assets/bootstrap-editable/js/bootstrap-editable.js'}
+{block name="javascript-initialization"}
+
+ {javascripts file='assets/js/bootstrap-switch/bootstrap-switch.js'}
{/javascripts}
-{/block}
-{block name="javascript-initialization"}
-
+ {/javascripts}
- {* display the form creation dialog if it contains errors *}
+
+ // Reload the page
+ location.href = url;
+ }
+ });
+
+ });
+
{/block}
\ No newline at end of file
diff --git a/templates/admin/default/currencies.html b/templates/admin/default/currencies.html
index 97fac58c8..29bd582a2 100644
--- a/templates/admin/default/currencies.html
+++ b/templates/admin/default/currencies.html
@@ -28,7 +28,7 @@
{intl l='Currencies'}
{loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.currencies.create"}
-
+
@@ -51,8 +51,8 @@
{admin_sortable_header
current_order=$order
- order='alpha'
- reverse_order='alpha_reverse'
+ order='name'
+ reverse_order='name_reverse'
path='/admin/configuration/currencies'
label="{intl l='Name'}"
}
@@ -114,7 +114,7 @@
| {intl l='Actions'} |
-
+
|
{loop name="currencies" type="currency" backend_context="1" lang=$lang_id order=$order}
@@ -138,7 +138,7 @@
|
{admin_position_block
permission="admin.currencies.edit"
- path="/admin/configuration/currencies"
+ path="/admin/configuration/currencies/update-position"
url_parameter="currency_id"
in_place_edit_class="currencyPositionChange"
position="$POSITION"
@@ -147,7 +147,9 @@
|
-
+
+
+
|
{module_include location='currencies_table_row'}
@@ -186,6 +188,7 @@
+
{module_include location='currencies_bottom'}
@@ -216,18 +219,21 @@
{/form_field}
- {* We do not allow users to create secured currencies from here *}
-
{if $form_error}
{$form_error_message}
{/if}
-
+
{form_field form=$form field='name'}
{/form_field}
-
+
{form_field form=$form field='code'}
{/form_field}
-
+
{form_field form=$form field='symbol'}
-
-
+
+
{/form_field}
-
+
{form_field form=$form field='rate'}
-
-
- {intl l="The rate from Euro (Price in Euro * rate = Price in this currency)"}
+
+
+ {intl l="The rate from Euro (Price in Euro * rate = Price in this currency)"}
{/form_field}
@@ -315,6 +313,10 @@
{block name="javascript-initialization"}
+ {javascripts file='assets/js/bootstrap-switch/bootstrap-switch.js'}
+
+ {/javascripts}
+
{javascripts file='assets/js/bootstrap-editable/bootstrap-editable.js'}
{/javascripts}
@@ -338,7 +340,7 @@
{* Always reset create dialog on close *}
$('#add_currency_dialog').on('hidden',function() {
-
+
// Hide error currency
$('#add_currency_dialog_error').remove();
@@ -359,7 +361,7 @@
placement : 'left',
success : function(response, newValue) {
// The URL template
- var url = "{url path='/admin/configuration/currencies/updatePosition' currency_id='__ID__' position='__POS__'}";
+ var url = "{url path='/admin/configuration/currencies/update-position' currency_id='__ID__' position='__POS__'}";
// Perform subtitutions
url = url.replace('__ID__', $(this).data('id'))
@@ -372,7 +374,7 @@
{* Change default status *}
- $('.change-default').click(function(ev) {
+ $('.change-default').change(function(ev) {
var url = "{url path='/admin/configuration/currencies/set-default' currency_id='__ID__'}";
// Perform ID subtitutions
diff --git a/templates/admin/default/currency-edit.html b/templates/admin/default/currency-edit.html
index 9add46f0a..6c85d604a 100644
--- a/templates/admin/default/currency-edit.html
+++ b/templates/admin/default/currency-edit.html
@@ -28,10 +28,10 @@