diff --git a/src/containers/editable-container.js b/src/containers/editable-container.js index 439f708..17d4e64 100644 --- a/src/containers/editable-container.js +++ b/src/containers/editable-container.js @@ -141,13 +141,13 @@ Applied as jQuery method. nochange: $.proxy(function(){ this.hide('nochange'); }, this), //click on submit button (value NOT changed) cancel: $.proxy(function(){ this.hide('cancel'); }, this), //click on calcel button show: $.proxy(function() { - if(this.delayedHide) { - this.hide(this.delayedHide.reason); - this.delayedHide = false; - } else { - this.setPosition(); - } - }, this), //re-position container every time form is shown (occurs each time after loading state) + if(this.delayedHide) { + this.hide(this.delayedHide.reason); + this.delayedHide = false; + } else { + this.setPosition(); + } + }, this), //re-position container every time form is shown (occurs each time after loading state) rendering: $.proxy(this.setPosition, this), //this allows to place container correctly when loading shown resize: $.proxy(this.setPosition, this), //this allows to re-position container when form size is changed rendered: $.proxy(function(){ @@ -230,16 +230,16 @@ Applied as jQuery method. //if form is saving value, schedule hide if(this.$form.data('editableform').isSaving) { - this.delayedHide = {reason: reason}; - return; - } else { - this.delayedHide = false; - } - + this.delayedHide = {reason: reason}; + return; + } else { + this.delayedHide = false; + } + this.$element.removeClass('editable-open'); this.innerHide(); - - /** + + /** Fired when container was hidden. It occurs on both save or cancel. **Note:** Bootstrap popover has own `hidden` event that now cannot be separated from x-editable's one. The workaround is to check `arguments.length` that is always `2` for x-editable. @@ -253,20 +253,20 @@ Applied as jQuery method. //auto-open next editable $(this).closest('tr').next().find('.editable').editable('show'); } - }); - **/ + }); + **/ this.$element.triggerHandler('hidden', reason || 'manual'); }, - + /* internal show method. To be overwritten in child classes */ innerShow: function () { }, - + /* internal hide method. To be overwritten in child classes */ innerHide: function () { - - }, + + }, /** Toggles container visibility (show / hide) diff --git a/src/editable-form/editable-form-utils.js b/src/editable-form/editable-form-utils.js index 21e7994..2c9457d 100644 --- a/src/editable-form/editable-form-utils.js +++ b/src/editable-form/editable-form-utils.js @@ -222,16 +222,21 @@ //see http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr supportsTransitions: function () { - var b = document.body || document.documentElement; - var s = b.style; - var p = 'transition'; - if(typeof s[p] == 'string') {return true; } + var b = document.body || document.documentElement, + s = b.style, + p = 'transition', + v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms']; + + if(typeof s[p] === 'string') { + return true; + } // Tests for vendor specific prop - v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms'], p = p.charAt(0).toUpperCase() + p.substr(1); for(var i=0; i<v.length; i++) { - if(typeof s[v[i] + p] == 'string') { return true; } + if(typeof s[v[i] + p] === 'string') { + return true; + } } return false; } diff --git a/src/editable-form/editable-form.js b/src/editable-form/editable-form.js index 7ab89d9..602be5f 100644 --- a/src/editable-form/editable-form.js +++ b/src/editable-form/editable-form.js @@ -224,30 +224,30 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc. //sending data to server $.when(this.save(submitValue)) .done($.proxy(function(response) { - this.isSaving = false; - + this.isSaving = false; + //run success callback var res = typeof this.options.success === 'function' ? this.options.success.call(this.options.scope, response, newValue) : null; - + //if success callback returns false --> keep form open and do not activate input if(res === false) { this.error(false); this.showForm(false); return; - } - + } + //if success callback returns string --> keep form open, show error and activate input if(typeof res === 'string') { this.error(res); this.showForm(); return; - } - + } + //if success callback returns object like {newValue: <something>} --> use that value instead of submitted //it is usefull if you want to chnage value in url-function if(res && typeof res === 'object' && res.hasOwnProperty('newValue')) { newValue = res.newValue; - } + } //clear error message this.error(false); @@ -264,20 +264,20 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc. @example $('#form-div').on('save'), function(e, params){ if(params.newValue === 'username') {...} - }); - **/ + }); + **/ this.$div.triggerHandler('save', {newValue: newValue, submitValue: submitValue, response: response}); }, this)) .fail($.proxy(function(xhr) { - this.isSaving = false; - + this.isSaving = false; + var msg; if(typeof this.options.error === 'function') { msg = this.options.error.call(this.options.scope, xhr, newValue); } else { msg = typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!'; } - + this.error(msg); this.showForm(); }, this)); diff --git a/src/element/editable-element.js b/src/element/editable-element.js index 29d29ca..1879a41 100644 --- a/src/element/editable-element.js +++ b/src/element/editable-element.js @@ -89,7 +89,7 @@ Makes editable any HTML element on the page. Applied as jQuery method. //if display is function it's far more convinient to have autotext = always to render correctly on init //see https://github.com/vitalets/x-editable-yii/issues/34 if(typeof this.options.display === 'function') { - this.options.autotext = 'always' + this.options.autotext = 'always'; } //check conditions for autotext: @@ -277,17 +277,17 @@ Makes editable any HTML element on the page. Applied as jQuery method. */ if(isEmpty !== undefined) { this.isEmpty = isEmpty; - } else { - //detect empty - if($.trim(this.$element.html()) === '') { - this.isEmpty = true; - } else if($.trim(this.$element.text()) !== '') { - this.isEmpty = false; - } else { - //e.g. '<img>' - this.isEmpty = !this.$element.height() || !this.$element.width(); - } - } + } else { + //detect empty + if($.trim(this.$element.html()) === '') { + this.isEmpty = true; + } else if($.trim(this.$element.text()) !== '') { + this.isEmpty = false; + } else { + //e.g. '<img>' + this.isEmpty = !this.$element.height() || !this.$element.width(); + } + } //emptytext shown only for enabled if(!this.options.disabled) { @@ -546,18 +546,18 @@ Makes editable any HTML element on the page. Applied as jQuery method. **/ case 'getValue': if(arguments.length === 2 && arguments[1] === true) { //isSingle = true - result = this.eq(0).data(datakey).value; - } else { - this.each(function () { - var $this = $(this), data = $this.data(datakey); - if (data && data.value !== undefined && data.value !== null) { - result[data.options.name] = data.input.value2submit(data.value); - } - }); - } + result = this.eq(0).data(datakey).value; + } else { + this.each(function () { + var $this = $(this), data = $this.data(datakey); + if (data && data.value !== undefined && data.value !== null) { + result[data.options.name] = data.input.value2submit(data.value); + } + }); + } return result; - /** + /** This method collects values from several editable elements and submit them all to server. Internally it runs client-side validation for all fields and submits only in case of success. See <a href="#newrecord">creating new records</a> for details. diff --git a/src/inputs/abstract.js b/src/inputs/abstract.js index 1314332..547ba10 100644 --- a/src/inputs/abstract.js +++ b/src/inputs/abstract.js @@ -7,23 +7,23 @@ To create your own input you can inherit from this class. **/ (function ($) { "use strict"; - + //types $.fn.editabletypes = {}; - + var AbstractInput = function () { }; AbstractInput.prototype = { /** Initializes input - + @method init() **/ init: function(type, options, defaults) { this.type = type; this.options = $.extend({}, defaults, options); }, - + /* this method called before render to init $tpl that is inserted in DOM */ @@ -37,107 +37,107 @@ To create your own input you can inherit from this class. /** Renders input from tpl. Can return jQuery deferred object. Can be overwritten in child objects - - @method render() - **/ + + @method render() + **/ render: function() { }, /** Sets element's html by value. - - @method value2html(value, element) + + @method value2html(value, element) @param {mixed} value @param {DOMElement} element - **/ + **/ value2html: function(value, element) { $(element).text($.trim(value)); }, - + /** Converts element's html to value - - @method html2value(html) + + @method html2value(html) @param {string} html @returns {mixed} - **/ + **/ html2value: function(html) { return $('<div>').html(html).text(); }, - + /** Converts value to string (for internal compare). For submitting to server used value2submit(). - + @method value2str(value) @param {mixed} value @returns {string} - **/ + **/ value2str: function(value) { return value; }, - + /** Converts string received from server into value. Usually from `data-value` attribute. - - @method str2value(str) + + @method str2value(str) @param {string} str @returns {mixed} - **/ + **/ str2value: function(str) { return str; }, /** Converts value for submitting to server. Result can be string or object. - + @method value2submit(value) @param {mixed} value @returns {mixed} - **/ + **/ value2submit: function(value) { return value; - }, - + }, + /** Sets value of input. - + @method value2input(value) @param {mixed} value - **/ + **/ value2input: function(value) { this.$input.val(value); }, - + /** Returns value of input. Value can be object (e.g. datepicker) - + @method input2value() - **/ + **/ input2value: function() { return this.$input.val(); }, /** Activates input. For text it sets focus. - + @method activate() - **/ + **/ activate: function() { if(this.$input.is(':visible')) { this.$input.focus(); } }, - + /** Creates input. - + @method clear() **/ clear: function() { this.$input.val(null); }, - + /** method to escape html. **/ @@ -147,7 +147,7 @@ To create your own input you can inherit from this class. /** attach handler to automatically submit form when value changed (useful when buttons not shown) - **/ + **/ autosubmit: function() { }, @@ -155,16 +155,16 @@ To create your own input you can inherit from this class. /** Additional actions when destroying element **/ - destroy: function() { - }, - + destroy: function() { + }, + // -------- helper functions -------- setClass: function() { if(this.options.inputclass) { this.$input.addClass(this.options.inputclass); } }, - + setAttr: function(attr) { if (this.options[attr] !== undefined && this.options[attr] !== null) { this.$input.attr(attr, this.options[attr]); diff --git a/src/inputs/date/date.js b/src/inputs/date/date.js index 0960f1b..b558a49 100644 --- a/src/inputs/date/date.js +++ b/src/inputs/date/date.js @@ -82,51 +82,51 @@ $(function(){ Date.superclass.value2html(text, element); }, - html2value: function(html) { - return this.parseDate(html, this.parsedViewFormat); - }, + html2value: function(html) { + return this.parseDate(html, this.parsedViewFormat); + }, - value2str: function(value) { - return value ? this.dpg.formatDate(value, this.parsedFormat, this.options.datepicker.language) : ''; - }, + value2str: function(value) { + return value ? this.dpg.formatDate(value, this.parsedFormat, this.options.datepicker.language) : ''; + }, - str2value: function(str) { - return this.parseDate(str, this.parsedFormat); - }, + str2value: function(str) { + return this.parseDate(str, this.parsedFormat); + }, - value2submit: function(value) { - return this.value2str(value); - }, + value2submit: function(value) { + return this.value2str(value); + }, - value2input: function(value) { - this.$input.bdatepicker('update', value); - }, + value2input: function(value) { + this.$input.bdatepicker('update', value); + }, - input2value: function() { - return this.$input.data('datepicker').date; - }, + input2value: function() { + return this.$input.data('datepicker').date; + }, - activate: function() { - }, + activate: function() { + }, - clear: function() { - this.$input.data('datepicker').date = null; - this.$input.find('.active').removeClass('active'); - if(!this.options.showbuttons) { - this.$input.closest('form').submit(); - } - }, + clear: function() { + this.$input.data('datepicker').date = null; + this.$input.find('.active').removeClass('active'); + if(!this.options.showbuttons) { + this.$input.closest('form').submit(); + } + }, - autosubmit: function() { - this.$input.on('mouseup', '.day', function(e){ - if($(e.currentTarget).is('.old') || $(e.currentTarget).is('.new')) { - return; - } - var $form = $(this).closest('form'); - setTimeout(function() { - $form.submit(); - }, 200); - }); + autosubmit: function() { + this.$input.on('mouseup', '.day', function(e){ + if($(e.currentTarget).is('.old') || $(e.currentTarget).is('.new')) { + return; + } + var $form = $(this).closest('form'); + setTimeout(function() { + $form.submit(); + }, 200); + }); //changedate is not suitable as it triggered when showing datepicker. see #149 /* this.$input.on('changeDate', function(e){ @@ -144,21 +144,21 @@ $(function(){ This function returns null for incorrect date. */ parseDate: function(str, format) { - var date = null, formattedBack; - if(str) { - date = this.dpg.parseDate(str, format, this.options.datepicker.language); - if(typeof str === 'string') { - formattedBack = this.dpg.formatDate(date, format, this.options.datepicker.language); - if(str !== formattedBack) { - date = null; - } - } - } - return date; - } + var date = null, formattedBack; + if(str) { + date = this.dpg.parseDate(str, format, this.options.datepicker.language); + if(typeof str === 'string') { + formattedBack = this.dpg.formatDate(date, format, this.options.datepicker.language); + if(str !== formattedBack) { + date = null; + } + } + } + return date; + } }); - + Date.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { /** @property tpl @@ -168,30 +168,30 @@ $(function(){ /** @property inputclass @default null - **/ + **/ inputclass: null, /** Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br> Possible tokens are: <code>d, dd, m, mm, yy, yyyy</code> - + @property format @type string @default yyyy-mm-dd - **/ + **/ format:'yyyy-mm-dd', /** Format used for displaying date. Also applied when converting date from element's text on init. If not specified equals to <code>format</code> - + @property viewformat @type string @default null - **/ - viewformat: null, + **/ + viewformat: null, /** Configuration of datepicker. Full list of options: http://vitalets.github.com/bootstrap-datepicker - + @property datepicker @type object @default { @@ -210,14 +210,14 @@ $(function(){ /** Text shown as clear date button. If <code>false</code> clear button will not be rendered. - + @property clear @type boolean|string - @default 'x clear' + @default 'x clear' **/ clear: '× clear' - }); + }); $.fn.editabletypes.date = Date; -}(window.jQuery)); \ No newline at end of file +}(window.jQuery)); diff --git a/src/inputs/datetime/datetime.js b/src/inputs/datetime/datetime.js index 03e2494..786fe40 100644 --- a/src/inputs/datetime/datetime.js +++ b/src/inputs/datetime/datetime.js @@ -5,7 +5,7 @@ Before usage you should manually include dependent js and css: <link href="css/datetimepicker.css" rel="stylesheet" type="text/css"></link> <script src="js/bootstrap-datetimepicker.js"></script> - + For **i18n** you should include js file from here: https://github.com/smalot/bootstrap-datetimepicker/tree/master/js/locales and set `language` option. @@ -30,14 +30,14 @@ $(function(){ **/ (function ($) { "use strict"; - + var DateTime = function (options) { this.init('datetime', options, DateTime.defaults); this.initPicker(options, DateTime.defaults); }; $.fn.editableutils.inherit(DateTime, $.fn.editabletypes.abstractinput); - + $.extend(DateTime.prototype, { initPicker: function(options, defaults) { //'format' is set directly from settings or data-* attributes @@ -46,13 +46,13 @@ $(function(){ if(!this.options.viewformat) { this.options.viewformat = this.options.format; } - + //overriding datetimepicker config (as by default jQuery extend() is not recursive) //since 1.4 datetimepicker internally uses viewformat instead of format. Format is for submit only this.options.datetimepicker = $.extend({}, defaults.datetimepicker, options.datetimepicker, { format: this.options.viewformat }); - + //language this.options.datetimepicker.language = this.options.datetimepicker.language || 'en'; @@ -63,10 +63,10 @@ $(function(){ this.parsedFormat = this.dpg.parseFormat(this.options.format, this.options.formatType); this.parsedViewFormat = this.dpg.parseFormat(this.options.viewformat, this.options.formatType); }, - + render: function () { this.$input.datetimepicker(this.options.datetimepicker); - + //adjust container position when viewMode changes //see https://github.com/smalot/bootstrap-datetimepicker/pull/80 this.$input.on('changeMode', function(e) { @@ -75,8 +75,8 @@ $(function(){ setTimeout(function(){ f.triggerHandler('resize'); }, 0); - }); - + }); + //"clear" link if(this.options.clear) { this.$clear = $('<a href="#"></a>').html(this.options.clear).click($.proxy(function(e){ @@ -84,11 +84,11 @@ $(function(){ e.stopPropagation(); this.clear(); }, this)); - + this.$tpl.parent().append($('<div class="editable-clear">').append(this.$clear)); - } + } }, - + value2html: function(value, element) { //formatDate works with UTCDate! var text = value ? this.dpg.formatDate(this.toUTC(value), this.parsedViewFormat, this.options.datetimepicker.language, this.options.formatType) : ''; @@ -96,45 +96,45 @@ $(function(){ DateTime.superclass.value2html(text, element); } else { return text; - } + } }, html2value: function(html) { //parseDate return utc date! var value = this.parseDate(html, this.parsedViewFormat); return value ? this.fromUTC(value) : null; - }, - + }, + value2str: function(value) { //formatDate works with UTCDate! return value ? this.dpg.formatDate(this.toUTC(value), this.parsedFormat, this.options.datetimepicker.language, this.options.formatType) : ''; - }, - + }, + str2value: function(str) { //parseDate return utc date! var value = this.parseDate(str, this.parsedFormat); return value ? this.fromUTC(value) : null; - }, - + }, + value2submit: function(value) { return this.value2str(value); - }, + }, value2input: function(value) { if(value) { this.$input.data('datetimepicker').setDate(value); } }, - + input2value: function() { //date may be cleared, in that case getDate() triggers error var dt = this.$input.data('datetimepicker'); return dt.date ? dt.getDate() : null; - }, - + }, + activate: function() { }, - + clear: function() { this.$input.data('datetimepicker').date = null; this.$input.find('.active').removeClass('active'); @@ -142,7 +142,7 @@ $(function(){ this.$input.closest('form').submit(); } }, - + autosubmit: function() { this.$input.on('mouseup', '.minute', function(e){ var $form = $(this).closest('form'); @@ -151,38 +151,38 @@ $(function(){ }, 200); }); }, - + //convert date from local to utc toUTC: function(value) { return value ? new Date(value.valueOf() - value.getTimezoneOffset() * 60000) : value; }, - + //convert date from utc to local fromUTC: function(value) { return value ? new Date(value.valueOf() + value.getTimezoneOffset() * 60000) : value; }, - + /* For incorrect date bootstrap-datetimepicker returns current date that is not suitable for datetimefield. This function returns null for incorrect date. */ parseDate: function(str, format) { - var date = null, formattedBack; - if(str) { - date = this.dpg.parseDate(str, format, this.options.datetimepicker.language, this.options.formatType); - if(typeof str === 'string') { - formattedBack = this.dpg.formatDate(date, format, this.options.datetimepicker.language, this.options.formatType); - if(str !== formattedBack) { - date = null; - } - } - } - return date; - } + var date = null, formattedBack; + if(str) { + date = this.dpg.parseDate(str, format, this.options.datetimepicker.language, this.options.formatType); + if(typeof str === 'string') { + formattedBack = this.dpg.formatDate(date, format, this.options.datetimepicker.language, this.options.formatType); + if(str !== formattedBack) { + date = null; + } + } + } + return date; + } }); - + DateTime.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { /** @property tpl @@ -192,7 +192,7 @@ $(function(){ /** @property inputclass @default null - **/ + **/ inputclass: null, /** Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br> @@ -211,12 +211,12 @@ $(function(){ @property viewformat @type string @default null - **/ - viewformat: null, + **/ + viewformat: null, /** Configuration of datetimepicker. Full list of options: https://github.com/smalot/bootstrap-datetimepicker - + @property datetimepicker @type object @default { } @@ -228,13 +228,13 @@ $(function(){ /** Text shown as clear date button. If <code>false</code> clear button will not be rendered. - + @property clear @type boolean|string - @default 'x clear' + @default 'x clear' **/ clear: '× clear' - }); + }); $.fn.editabletypes.datetime = DateTime;