diff --git a/src/editable-form/editable-form-utils.js b/src/editable-form/editable-form-utils.js index cb16236..9ccc7ad 100644 --- a/src/editable-form/editable-form-utils.js +++ b/src/editable-form/editable-form-utils.js @@ -155,13 +155,25 @@ var TypeConstructor, typeOptions, input, type = options.type; - if(type === 'date' && options.mode === 'inline') { - if($.fn.editabletypes.datefield) { - type = 'datefield'; - } else if($.fn.editabletypes.dateuifield) { - type = 'dateuifield'; - } - } + //`date` is some kind of virtual type that is transformed to one of exact types + //depending on mode and core lib + if(type === 'date') { + //inline + if(options.mode === 'inline') { + if($.fn.editabletypes.datefield) { + type = 'datefield'; + } else if($.fn.editabletypes.dateuifield) { + type = 'dateuifield'; + } + //popup + } else { + if($.fn.editabletypes.date) { + type = 'date'; + } else if($.fn.editabletypes.dateui) { + type = 'dateui'; + } + } + } //create input of specified type. Input will be used for converting value, not in form if(typeof $.fn.editabletypes[type] === 'function') { diff --git a/src/editable-form/editable-form.js b/src/editable-form/editable-form.js index b52e71c..c97c58d 100644 --- a/src/editable-form/editable-form.js +++ b/src/editable-form/editable-form.js @@ -60,7 +60,7 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc. @param {Object} event event object **/ this.$div.triggerHandler('rendering'); - + //render input $.when(this.input.render()) .then($.proxy(function () { diff --git a/src/inputs/abstract.js b/src/inputs/abstract.js index 3370ddb..a258001 100644 --- a/src/inputs/abstract.js +++ b/src/inputs/abstract.js @@ -76,7 +76,7 @@ To create your own input you can inherit from this class. }, /** - Converts string received from server into value. + Converts string received from server into value. Usually from `data-value` attribute. @method str2value(str) @param {string} str @@ -87,7 +87,7 @@ To create your own input you can inherit from this class. }, /** - Converts value for submitting to server + Converts value for submitting to server. Result can be string or object. @method value2submit(value) @param {mixed} value diff --git a/src/inputs/date/datefield.js b/src/inputs/date/datefield.js index 55737d7..dc9c8d6 100644 --- a/src/inputs/date/datefield.js +++ b/src/inputs/date/datefield.js @@ -38,16 +38,8 @@ Automatically shown in inline mode. }, - value2str: function(value) { - return value ? this.dpg.formatDate(value, this.parsedViewFormat, this.options.datepicker.language) : ''; - }, - - value2submit: function(value) { - return value ? this.dpg.formatDate(value, this.parsedFormat, this.options.datepicker.language) : null; - }, - value2input: function(value) { - this.$field.val(this.value2str(value)); + this.$field.val(value ? this.dpg.formatDate(value, this.parsedViewFormat, this.options.datepicker.language) : ''); this.$input.datepicker('update'); }, @@ -70,7 +62,7 @@ Automatically shown in inline mode. DateField.defaults = $.extend({}, $.fn.editabletypes.date.defaults, { /** @property tpl - @default <input type="text"> + @default **/ tpl:'<div class="input-append date"><input class="input-small" type="text"/><span class="add-on"><i class="icon-th"></i></span></div>', /** @@ -79,13 +71,14 @@ Automatically shown in inline mode. **/ inputclass: '', + /* datepicker config */ datepicker: { weekStart: 0, startView: 0, - autoclose: true, - keyboardNavigation: false + autoclose: true }, - + + /* disable clear link */ clear: false }); diff --git a/src/inputs/dateui/dateui.js b/src/inputs/dateui/dateui.js index 49e7b34..dc3f31f 100644 --- a/src/inputs/dateui/dateui.js +++ b/src/inputs/dateui/dateui.js @@ -26,30 +26,29 @@ $(function(){ var DateUI = function (options) { this.init('dateui', options, DateUI.defaults); - - //set popular options directly from settings or data-* attributes - var directOptions = $.fn.editableutils.sliceObj(this.options, ['format']); - - //overriding datepicker config (as by default jQuery extend() is not recursive) - this.options.datepicker = $.extend({}, DateUI.defaults.datepicker, directOptions, options.datepicker); - - //by default viewformat equals to format - if(!this.options.viewformat) { - this.options.viewformat = this.options.datepicker.format; - } - - //correct formats: replace yyyy with yy - this.options.viewformat = this.options.viewformat.replace('yyyy', 'yy'); - this.options.datepicker.format = this.options.datepicker.format.replace('yyyy', 'yy'); - - //copy format to dateFormat (dateFormat option required for ui datepicker). - //This allows common option 'format' for all datepickers - this.options.datepicker.dateFormat = this.options.datepicker.format; + this.initPicker(options, DateUI.defaults); }; $.fn.editableutils.inherit(DateUI, $.fn.editabletypes.abstractinput); $.extend(DateUI.prototype, { + initPicker: function(options, defaults) { + //by default viewformat equals to format + if(!this.options.viewformat) { + this.options.viewformat = this.options.format; + } + + //correct formats: replace yyyy with yy (for compatibility with bootstrap datepicker) + this.options.viewformat = this.options.viewformat.replace('yyyy', 'yy'); + this.options.format = this.options.format.replace('yyyy', 'yy'); + + //overriding datepicker config (as by default jQuery extend() is not recursive) + //since 1.4 datepicker internally uses viewformat instead of format. Format is for submit only + this.options.datepicker = $.extend({}, defaults.datepicker, options.datepicker, { + dateFormat: this.options.viewformat + }); + }, + render: function () { DateUI.superclass.render.call(this); this.$input.datepicker(this.options.datepicker); @@ -83,7 +82,7 @@ $(function(){ }, value2str: function(value) { - return $.datepicker.formatDate(this.options.datepicker.dateFormat, value); + return $.datepicker.formatDate(this.options.format, value); }, str2value: function(str) { @@ -94,13 +93,13 @@ $(function(){ //if string does not match format, UI datepicker throws exception var d; try { - d = $.datepicker.parseDate(this.options.datepicker.dateFormat, str); + d = $.datepicker.parseDate(this.options.format, str); } catch(e) {} return d; }, - value2submit: function(value) { + value2submit: function(value) { return this.value2str(value); }, @@ -189,6 +188,5 @@ $(function(){ }); $.fn.editabletypes.dateui = DateUI; - $.fn.editabletypes.date = DateUI; }(window.jQuery)); diff --git a/src/inputs/dateui/dateuifield.js b/src/inputs/dateui/dateuifield.js new file mode 100644 index 0000000..a8b9cc9 --- /dev/null +++ b/src/inputs/dateui/dateuifield.js @@ -0,0 +1,80 @@ +/** +jQuery UI datefield input - modification for inline mode. +Shows normal <input type="text"> and binds popup datepicker. +Automatically shown in inline mode. +**/ +(function ($) { + + var DateUIField = function (options) { + this.init('dateuifield', options, DateUIField.defaults); + this.initPicker(options, DateUIField.defaults); + }; + + $.fn.editableutils.inherit(DateUIField, $.fn.editabletypes.dateui); + + $.extend(DateUIField.prototype, { + render: function () { + $.fn.editabletypes.dateui.superclass.render.call(this); + this.$field = this.$input.find('input'); + this.$field.datepicker(this.options.datepicker); + + /* + if(this.options.clear) { + this.$clear = $('<a href="#"></a>').html(this.options.clear).click($.proxy(function(e){ + e.preventDefault(); + e.stopPropagation(); + this.clear(); + }, this)); + } + */ + }, + + value2input: function(value) { + this.$field.val($.datepicker.formatDate(this.options.viewformat, value)); + }, + + input2value: function() { + return this.html2value(this.$field.val()); + }, + + activate: function() { + if(this.$field.is(':visible')) { + this.$field.focus(); + $.fn.editableutils.setCursorPosition(this.$field.get(0), this.$field.val().length); + } + }, + + autosubmit: function() { + //reset autosubmit to empty + } + }); + + DateUIField.defaults = $.extend({}, $.fn.editabletypes.dateui.defaults, { + /** + @property tpl + @default <input type="text"> + **/ + tpl: '<div><input type="text" /></div>', + /** + @property inputclass + @default '' + **/ + inputclass: '', + + /* datepicker config */ + datepicker: { + showOn: "button", + buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif", + buttonImageOnly: true, + firstDay: 0, + changeYear: true, + changeMonth: true + }, + + /* disable clear link */ + clear: false + }); + + $.fn.editabletypes.dateuifield = DateUIField; + +}(window.jQuery)); \ No newline at end of file diff --git a/test/loader.js b/test/loader.js index c2b37be..bc4d32f 100644 --- a/test/loader.js +++ b/test/loader.js @@ -95,6 +95,7 @@ define(function () { 'jqueryui/js/jquery-ui-1.9.1.custom' ], 'inputs/dateui/dateui': ['inputs/abstract'], + 'inputs/dateui/dateuifield': ['inputs/dateui/dateui'], //plain //'inputs/dateui/dateui': ['inputs/abstract', 'inputs/date/bootstrap-datepicker/js/bootstrap-datepicker'], @@ -136,7 +137,7 @@ define(function () { shim['element/editable-element'].deps.push('containers/editable-popover'); } else if(f === 'jqueryui') { //jqueryui - shim['editable-form/editable-form'].deps.push('inputs/dateui/dateui'); + shim['editable-form/editable-form'].deps.push('inputs/dateui/dateuifield'); shim['element/editable-element'].deps.push('editable-form/editable-form-jqueryui'); shim['element/editable-element'].deps.push('containers/editable-tooltip'); } else {