bootstrap-x-editable-rails 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# X-editable
|
1
|
+
# X-editable for Rails [](http://badge.fury.io/rb/bootstrap-x-editable-rails)
|
2
2
|
|
3
3
|
[X-editable](https://github.com/vitalets/x-editable) is an in-place editing plugin with support for Twitter Bootstrap, jQuery UI or pure jQuery.
|
4
4
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! X-editable - v1.4.
|
1
|
+
/*! X-editable - v1.4.4
|
2
2
|
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
|
3
3
|
* http://github.com/vitalets/x-editable
|
4
4
|
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
|
@@ -13,7 +13,8 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
13
13
|
@uses textarea
|
14
14
|
**/
|
15
15
|
(function ($) {
|
16
|
-
|
16
|
+
"use strict";
|
17
|
+
|
17
18
|
var EditableForm = function (div, options) {
|
18
19
|
this.options = $.extend({}, $.fn.editableform.defaults, options);
|
19
20
|
this.$div = $(div); //div, containing form. Not form tag. Not editable-element.
|
@@ -37,7 +38,11 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
37
38
|
this.$form = $($.fn.editableform.template);
|
38
39
|
},
|
39
40
|
initButtons: function() {
|
40
|
-
this.$form.find('.editable-buttons')
|
41
|
+
var $btn = this.$form.find('.editable-buttons');
|
42
|
+
$btn.append($.fn.editableform.buttons);
|
43
|
+
if(this.options.showbuttons === 'bottom') {
|
44
|
+
$btn.addClass('editable-buttons-bottom');
|
45
|
+
}
|
41
46
|
},
|
42
47
|
/**
|
43
48
|
Renders editableform
|
@@ -257,8 +262,15 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
257
262
|
this.$div.triggerHandler('save', {newValue: newValue, response: response});
|
258
263
|
}, this))
|
259
264
|
.fail($.proxy(function(xhr) {
|
260
|
-
|
261
|
-
this.
|
265
|
+
var msg;
|
266
|
+
if(typeof this.options.error === 'function') {
|
267
|
+
msg = this.options.error.call(this.options.scope, xhr, newValue);
|
268
|
+
} else {
|
269
|
+
msg = typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!';
|
270
|
+
}
|
271
|
+
|
272
|
+
this.error(msg);
|
273
|
+
this.showForm();
|
262
274
|
}, this));
|
263
275
|
},
|
264
276
|
|
@@ -270,7 +282,7 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
270
282
|
this.options.pk = $.fn.editableutils.tryParseJson(this.options.pk, true);
|
271
283
|
|
272
284
|
var pk = (typeof this.options.pk === 'function') ? this.options.pk.call(this.options.scope) : this.options.pk,
|
273
|
-
send = !!(typeof this.options.url === 'function' || (this.options.url && ((this.options.send === 'always') || (this.options.send === 'auto' && pk)))),
|
285
|
+
send = !!(typeof this.options.url === 'function' || (this.options.url && ((this.options.send === 'always') || (this.options.send === 'auto' && pk !== null && pk !== undefined)))),
|
274
286
|
params;
|
275
287
|
|
276
288
|
if (send) { //send to server
|
@@ -478,7 +490,7 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
478
490
|
validate: null,
|
479
491
|
/**
|
480
492
|
Success callback. Called when value successfully sent on server and **response status = 200**.
|
481
|
-
|
493
|
+
Usefull to work with json response. For example, if your backend response can be <code>{success: true}</code>
|
482
494
|
or <code>{success: false, msg: "server error"}</code> you can check it inside this callback.
|
483
495
|
If it returns **string** - means error occured and string is shown as error message.
|
484
496
|
If it returns **object like** <code>{newValue: <something>}</code> - it overwrites value, submitted by user.
|
@@ -494,6 +506,25 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
494
506
|
**/
|
495
507
|
success: null,
|
496
508
|
/**
|
509
|
+
Error callback. Called when request failed (response status != 200).
|
510
|
+
Usefull when you want to parse error response and display a custom message.
|
511
|
+
Must return **string** - the message to be displayed in the error block.
|
512
|
+
|
513
|
+
@property error
|
514
|
+
@type function
|
515
|
+
@default null
|
516
|
+
@since 1.4.4
|
517
|
+
@example
|
518
|
+
error: function(response, newValue) {
|
519
|
+
if(response.status === 500) {
|
520
|
+
return 'Service unavailable. Please try later.';
|
521
|
+
} else {
|
522
|
+
return response.responseText;
|
523
|
+
}
|
524
|
+
}
|
525
|
+
**/
|
526
|
+
error: null,
|
527
|
+
/**
|
497
528
|
Additional options for submit ajax request.
|
498
529
|
List of values: http://api.jquery.com/jQuery.ajax
|
499
530
|
|
@@ -509,11 +540,11 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
509
540
|
**/
|
510
541
|
ajaxOptions: null,
|
511
542
|
/**
|
512
|
-
|
543
|
+
Where to show buttons: left(true)|bottom|false
|
513
544
|
Form without buttons is auto-submitted.
|
514
545
|
|
515
546
|
@property showbuttons
|
516
|
-
@type boolean
|
547
|
+
@type boolean|string
|
517
548
|
@default true
|
518
549
|
@since 1.1.1
|
519
550
|
**/
|
@@ -537,7 +568,7 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
537
568
|
@default false
|
538
569
|
@since 1.2.0
|
539
570
|
**/
|
540
|
-
savenochange: false
|
571
|
+
savenochange: false
|
541
572
|
};
|
542
573
|
|
543
574
|
/*
|
@@ -564,10 +595,13 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
564
595
|
//error class attached to editable-error-block
|
565
596
|
$.fn.editableform.errorBlockClass = 'editable-error';
|
566
597
|
}(window.jQuery));
|
598
|
+
|
567
599
|
/**
|
568
600
|
* EditableForm utilites
|
569
601
|
*/
|
570
602
|
(function ($) {
|
603
|
+
"use strict";
|
604
|
+
|
571
605
|
//utils
|
572
606
|
$.fn.editableutils = {
|
573
607
|
/**
|
@@ -761,6 +795,11 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
|
|
761
795
|
type = 'combodate';
|
762
796
|
}
|
763
797
|
}
|
798
|
+
|
799
|
+
//`datetime` should be datetimefield in 'inline' mode
|
800
|
+
if(type === 'datetime' && options.mode === 'inline') {
|
801
|
+
type = 'datetimefield';
|
802
|
+
}
|
764
803
|
|
765
804
|
//change wysihtml5 to textarea for jquery UI and plain versions
|
766
805
|
if(type === 'wysihtml5' && !$.fn.editabletypes[type]) {
|
@@ -792,6 +831,7 @@ Applied as jQuery method.
|
|
792
831
|
@uses editableform
|
793
832
|
**/
|
794
833
|
(function ($) {
|
834
|
+
"use strict";
|
795
835
|
|
796
836
|
var Popup = function (element, options) {
|
797
837
|
this.init(element, options);
|
@@ -805,6 +845,7 @@ Applied as jQuery method.
|
|
805
845
|
Popup.prototype = {
|
806
846
|
containerName: null, //tbd in child class
|
807
847
|
innerCss: null, //tbd in child class
|
848
|
+
containerClass: 'editable-container editable-popup', //css class applied to container element
|
808
849
|
init: function(element, options) {
|
809
850
|
this.$element = $(element);
|
810
851
|
//since 1.4.1 container do not use data-* directly as they already merged into options.
|
@@ -837,9 +878,23 @@ Applied as jQuery method.
|
|
837
878
|
var $target = $(e.target), i,
|
838
879
|
exclude_classes = ['.editable-container',
|
839
880
|
'.ui-datepicker-header',
|
881
|
+
'.datepicker', //in inline mode datepicker is rendered into body
|
840
882
|
'.modal-backdrop',
|
841
883
|
'.bootstrap-wysihtml5-insert-image-modal',
|
842
|
-
'.bootstrap-wysihtml5-insert-link-modal'
|
884
|
+
'.bootstrap-wysihtml5-insert-link-modal'
|
885
|
+
];
|
886
|
+
|
887
|
+
//check if element is detached. It occurs when clicking in bootstrap datepicker
|
888
|
+
if (!$.contains(document.documentElement, e.target)) {
|
889
|
+
return;
|
890
|
+
}
|
891
|
+
|
892
|
+
//for some reason FF 20 generates extra event (click) in select2 widget with e.target = document
|
893
|
+
//we need to filter it via construction below. See https://github.com/vitalets/x-editable/issues/199
|
894
|
+
//Possibly related to http://stackoverflow.com/questions/10119793/why-does-firefox-react-differently-from-webkit-and-ie-to-click-event-on-selec
|
895
|
+
if($target.is(document)) {
|
896
|
+
return;
|
897
|
+
}
|
843
898
|
|
844
899
|
//if click inside one of exclude classes --> no nothing
|
845
900
|
for(i=0; i<exclude_classes.length; i++) {
|
@@ -860,6 +915,11 @@ Applied as jQuery method.
|
|
860
915
|
splitOptions: function() {
|
861
916
|
this.containerOptions = {};
|
862
917
|
this.formOptions = {};
|
918
|
+
|
919
|
+
if(!$.fn[this.containerName]) {
|
920
|
+
throw new Error(this.containerName + ' not found. Have you included corresponding js file?');
|
921
|
+
}
|
922
|
+
|
863
923
|
var cDef = $.fn[this.containerName].defaults;
|
864
924
|
//keys defined in container defaults go to container, others go to form
|
865
925
|
for(var k in this.options) {
|
@@ -884,6 +944,7 @@ Applied as jQuery method.
|
|
884
944
|
return this.$element.data(this.containerDataName || this.containerName);
|
885
945
|
},
|
886
946
|
|
947
|
+
/* call native method of underlying container, e.g. this.$element.popover('method') */
|
887
948
|
call: function() {
|
888
949
|
this.$element[this.containerName].apply(this.$element, arguments);
|
889
950
|
},
|
@@ -904,17 +965,21 @@ Applied as jQuery method.
|
|
904
965
|
resize: $.proxy(this.setPosition, this), //this allows to re-position container when form size is changed
|
905
966
|
rendered: $.proxy(function(){
|
906
967
|
/**
|
907
|
-
Fired when container is shown and form is rendered (for select will wait for loading dropdown options)
|
968
|
+
Fired when container is shown and form is rendered (for select will wait for loading dropdown options).
|
969
|
+
**Note:** Bootstrap popover has own `shown` event that now cannot be separated from x-editable's one.
|
970
|
+
The workaround is to check `arguments.length` that is always `2` for x-editable.
|
908
971
|
|
909
972
|
@event shown
|
910
973
|
@param {Object} event event object
|
911
974
|
@example
|
912
|
-
$('#username').on('shown', function() {
|
913
|
-
var editable = $(this).data('editable');
|
975
|
+
$('#username').on('shown', function(e, editable) {
|
914
976
|
editable.input.$input.val('overwriting value of input..');
|
915
977
|
});
|
916
978
|
**/
|
917
|
-
|
979
|
+
/*
|
980
|
+
TODO: added second param mainly to distinguish from bootstrap's shown event. It's a hotfix that will be solved in future versions via namespaced events.
|
981
|
+
*/
|
982
|
+
this.$element.triggerHandler('shown', this);
|
918
983
|
}, this)
|
919
984
|
})
|
920
985
|
.editableform('render');
|
@@ -935,7 +1000,7 @@ Applied as jQuery method.
|
|
935
1000
|
|
936
1001
|
//show container itself
|
937
1002
|
this.innerShow();
|
938
|
-
this.tip().addClass(
|
1003
|
+
this.tip().addClass(this.containerClass);
|
939
1004
|
|
940
1005
|
/*
|
941
1006
|
Currently, form is re-rendered on every show.
|
@@ -980,11 +1045,13 @@ Applied as jQuery method.
|
|
980
1045
|
this.innerHide();
|
981
1046
|
|
982
1047
|
/**
|
983
|
-
Fired when container was hidden. It occurs on both save or cancel.
|
1048
|
+
Fired when container was hidden. It occurs on both save or cancel.
|
1049
|
+
**Note:** Bootstrap popover has own `hidden` event that now cannot be separated from x-editable's one.
|
1050
|
+
The workaround is to check `arguments.length` that is always `2` for x-editable.
|
984
1051
|
|
985
1052
|
@event hidden
|
986
1053
|
@param {object} event event object
|
987
|
-
@param {string} reason Reason caused hiding. Can be <code>save|cancel|onblur|nochange|
|
1054
|
+
@param {string} reason Reason caused hiding. Can be <code>save|cancel|onblur|nochange|manual</code>
|
988
1055
|
@example
|
989
1056
|
$('#username').on('hidden', function(e, reason) {
|
990
1057
|
if(reason === 'save' || reason === 'cancel') {
|
@@ -993,7 +1060,7 @@ Applied as jQuery method.
|
|
993
1060
|
}
|
994
1061
|
});
|
995
1062
|
**/
|
996
|
-
this.$element.triggerHandler('hidden', reason);
|
1063
|
+
this.$element.triggerHandler('hidden', reason || 'manual');
|
997
1064
|
},
|
998
1065
|
|
999
1066
|
/* internal show method. To be overwritten in child classes */
|
@@ -1246,16 +1313,18 @@ Applied as jQuery method.
|
|
1246
1313
|
* ---------------------
|
1247
1314
|
*/
|
1248
1315
|
(function ($) {
|
1316
|
+
"use strict";
|
1249
1317
|
|
1250
1318
|
//copy prototype from EditableContainer
|
1251
1319
|
//extend methods
|
1252
1320
|
$.extend($.fn.editableContainer.Inline.prototype, $.fn.editableContainer.Popup.prototype, {
|
1253
1321
|
containerName: 'editableform',
|
1254
1322
|
innerCss: '.editable-inline',
|
1323
|
+
containerClass: 'editable-container editable-inline', //css class applied to container element
|
1255
1324
|
|
1256
1325
|
initContainer: function(){
|
1257
1326
|
//container is <span> element
|
1258
|
-
this.$tip = $('<span></span>')
|
1327
|
+
this.$tip = $('<span></span>');
|
1259
1328
|
|
1260
1329
|
//convert anim to miliseconds (int)
|
1261
1330
|
if(!this.options.anim) {
|
@@ -1300,6 +1369,7 @@ Makes editable any HTML element on the page. Applied as jQuery method.
|
|
1300
1369
|
@uses editableContainer
|
1301
1370
|
**/
|
1302
1371
|
(function ($) {
|
1372
|
+
"use strict";
|
1303
1373
|
|
1304
1374
|
var Editable = function (element, options) {
|
1305
1375
|
this.$element = $(element);
|
@@ -1394,7 +1464,8 @@ Makes editable any HTML element on the page. Applied as jQuery method.
|
|
1394
1464
|
this.enable();
|
1395
1465
|
}
|
1396
1466
|
/**
|
1397
|
-
Fired when element was initialized by editable method.
|
1467
|
+
Fired when element was initialized by `$().editable()` method.
|
1468
|
+
Please note that you should setup `init` handler **before** applying `editable`.
|
1398
1469
|
|
1399
1470
|
@event init
|
1400
1471
|
@param {Object} event event object
|
@@ -1404,6 +1475,7 @@ Makes editable any HTML element on the page. Applied as jQuery method.
|
|
1404
1475
|
$('#username').on('init', function(e, editable) {
|
1405
1476
|
alert('initialized ' + editable.options.name);
|
1406
1477
|
});
|
1478
|
+
$('#username').editable();
|
1407
1479
|
**/
|
1408
1480
|
this.$element.triggerHandler('init', this);
|
1409
1481
|
}, this));
|
@@ -1710,6 +1782,8 @@ Makes editable any HTML element on the page. Applied as jQuery method.
|
|
1710
1782
|
@method destroy()
|
1711
1783
|
**/
|
1712
1784
|
destroy: function() {
|
1785
|
+
this.disable();
|
1786
|
+
|
1713
1787
|
if(this.container) {
|
1714
1788
|
this.container.destroy();
|
1715
1789
|
}
|
@@ -1721,8 +1795,7 @@ Makes editable any HTML element on the page. Applied as jQuery method.
|
|
1721
1795
|
|
1722
1796
|
this.$element.off("save.internal");
|
1723
1797
|
|
1724
|
-
this.$element.removeClass('editable');
|
1725
|
-
this.$element.removeClass('editable-open');
|
1798
|
+
this.$element.removeClass('editable editable-open editable-disabled');
|
1726
1799
|
this.$element.removeData('editable');
|
1727
1800
|
}
|
1728
1801
|
};
|
@@ -2029,7 +2102,8 @@ To create your own input you can inherit from this class.
|
|
2029
2102
|
@class abstractinput
|
2030
2103
|
**/
|
2031
2104
|
(function ($) {
|
2032
|
-
|
2105
|
+
"use strict";
|
2106
|
+
|
2033
2107
|
//types
|
2034
2108
|
$.fn.editabletypes = {};
|
2035
2109
|
|
@@ -2212,7 +2286,10 @@ To create your own input you can inherit from this class.
|
|
2212
2286
|
inputclass: 'input-medium',
|
2213
2287
|
//scope for external methods (e.g. source defined as function)
|
2214
2288
|
//for internal use only
|
2215
|
-
scope: null
|
2289
|
+
scope: null,
|
2290
|
+
|
2291
|
+
//need to re-declare showbuttons here to get it's value from common config (passed only options existing in defaults)
|
2292
|
+
showbuttons: true
|
2216
2293
|
};
|
2217
2294
|
|
2218
2295
|
$.extend($.fn.editabletypes, {abstractinput: AbstractInput});
|
@@ -2226,7 +2303,8 @@ List - abstract class for inputs that have source option loaded from js array or
|
|
2226
2303
|
@extends abstractinput
|
2227
2304
|
**/
|
2228
2305
|
(function ($) {
|
2229
|
-
|
2306
|
+
"use strict";
|
2307
|
+
|
2230
2308
|
var List = function (options) {
|
2231
2309
|
|
2232
2310
|
};
|
@@ -2555,6 +2633,8 @@ $(function(){
|
|
2555
2633
|
</script>
|
2556
2634
|
**/
|
2557
2635
|
(function ($) {
|
2636
|
+
"use strict";
|
2637
|
+
|
2558
2638
|
var Text = function (options) {
|
2559
2639
|
this.init('text', options, Text.defaults);
|
2560
2640
|
};
|
@@ -2604,18 +2684,17 @@ $(function(){
|
|
2604
2684
|
},
|
2605
2685
|
|
2606
2686
|
postrender: function() {
|
2687
|
+
/*
|
2688
|
+
//now `clear` is positioned via css
|
2607
2689
|
if(this.$clear) {
|
2608
2690
|
//can position clear button only here, when form is shown and height can be calculated
|
2609
|
-
var h = this.$input.outerHeight() || 20,
|
2691
|
+
// var h = this.$input.outerHeight(true) || 20,
|
2692
|
+
var h = this.$clear.parent().height(),
|
2610
2693
|
delta = (h - this.$clear.height()) / 2;
|
2611
|
-
|
2612
|
-
//workaround for plain-popup
|
2613
|
-
if(delta < 3) {
|
2614
|
-
delta = 3;
|
2615
|
-
}
|
2616
2694
|
|
2617
|
-
this.$clear.css({bottom: delta, right: delta});
|
2618
|
-
}
|
2695
|
+
//this.$clear.css({bottom: delta, right: delta});
|
2696
|
+
}
|
2697
|
+
*/
|
2619
2698
|
},
|
2620
2699
|
|
2621
2700
|
//show / hide clear button
|
@@ -2690,7 +2769,8 @@ $(function(){
|
|
2690
2769
|
</script>
|
2691
2770
|
**/
|
2692
2771
|
(function ($) {
|
2693
|
-
|
2772
|
+
"use strict";
|
2773
|
+
|
2694
2774
|
var Textarea = function (options) {
|
2695
2775
|
this.init('textarea', options, Textarea.defaults);
|
2696
2776
|
};
|
@@ -2802,7 +2882,8 @@ $(function(){
|
|
2802
2882
|
</script>
|
2803
2883
|
**/
|
2804
2884
|
(function ($) {
|
2805
|
-
|
2885
|
+
"use strict";
|
2886
|
+
|
2806
2887
|
var Select = function (options) {
|
2807
2888
|
this.init('select', options, Select.defaults);
|
2808
2889
|
};
|
@@ -2891,7 +2972,8 @@ $(function(){
|
|
2891
2972
|
</script>
|
2892
2973
|
**/
|
2893
2974
|
(function ($) {
|
2894
|
-
|
2975
|
+
"use strict";
|
2976
|
+
|
2895
2977
|
var Checklist = function (options) {
|
2896
2978
|
this.init('checklist', options, Checklist.defaults);
|
2897
2979
|
};
|
@@ -2934,6 +3016,8 @@ $(function(){
|
|
2934
3016
|
value = str.split(reg);
|
2935
3017
|
} else if($.isArray(str)) {
|
2936
3018
|
value = str;
|
3019
|
+
} else {
|
3020
|
+
value = [str];
|
2937
3021
|
}
|
2938
3022
|
return value;
|
2939
3023
|
},
|
@@ -3059,6 +3143,8 @@ $(function(){
|
|
3059
3143
|
Password
|
3060
3144
|
*/
|
3061
3145
|
(function ($) {
|
3146
|
+
"use strict";
|
3147
|
+
|
3062
3148
|
var Password = function (options) {
|
3063
3149
|
this.init('password', options, Password.defaults);
|
3064
3150
|
};
|
@@ -3088,6 +3174,8 @@ Password
|
|
3088
3174
|
Email
|
3089
3175
|
*/
|
3090
3176
|
(function ($) {
|
3177
|
+
"use strict";
|
3178
|
+
|
3091
3179
|
var Email = function (options) {
|
3092
3180
|
this.init('email', options, Email.defaults);
|
3093
3181
|
};
|
@@ -3103,6 +3191,8 @@ Email
|
|
3103
3191
|
Url
|
3104
3192
|
*/
|
3105
3193
|
(function ($) {
|
3194
|
+
"use strict";
|
3195
|
+
|
3106
3196
|
var Url = function (options) {
|
3107
3197
|
this.init('url', options, Url.defaults);
|
3108
3198
|
};
|
@@ -3118,6 +3208,8 @@ Url
|
|
3118
3208
|
Tel
|
3119
3209
|
*/
|
3120
3210
|
(function ($) {
|
3211
|
+
"use strict";
|
3212
|
+
|
3121
3213
|
var Tel = function (options) {
|
3122
3214
|
this.init('tel', options, Tel.defaults);
|
3123
3215
|
};
|
@@ -3133,6 +3225,8 @@ Tel
|
|
3133
3225
|
Number
|
3134
3226
|
*/
|
3135
3227
|
(function ($) {
|
3228
|
+
"use strict";
|
3229
|
+
|
3136
3230
|
var NumberInput = function (options) {
|
3137
3231
|
this.init('number', options, NumberInput.defaults);
|
3138
3232
|
};
|
@@ -3143,7 +3237,21 @@ Number
|
|
3143
3237
|
this.setAttr('min');
|
3144
3238
|
this.setAttr('max');
|
3145
3239
|
this.setAttr('step');
|
3146
|
-
}
|
3240
|
+
},
|
3241
|
+
postrender: function() {
|
3242
|
+
if(this.$clear) {
|
3243
|
+
//increase right ffset for up/down arrows
|
3244
|
+
this.$clear.css({right: 24});
|
3245
|
+
/*
|
3246
|
+
//can position clear button only here, when form is shown and height can be calculated
|
3247
|
+
var h = this.$input.outerHeight(true) || 20,
|
3248
|
+
delta = (h - this.$clear.height()) / 2;
|
3249
|
+
|
3250
|
+
//add 12px to offset right for up/down arrows
|
3251
|
+
this.$clear.css({top: delta, right: delta + 16});
|
3252
|
+
*/
|
3253
|
+
}
|
3254
|
+
}
|
3147
3255
|
});
|
3148
3256
|
NumberInput.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {
|
3149
3257
|
tpl: '<input type="number">',
|
@@ -3160,6 +3268,8 @@ Number
|
|
3160
3268
|
Range (inherit from number)
|
3161
3269
|
*/
|
3162
3270
|
(function ($) {
|
3271
|
+
"use strict";
|
3272
|
+
|
3163
3273
|
var Range = function (options) {
|
3164
3274
|
this.init('range', options, Range.defaults);
|
3165
3275
|
};
|
@@ -3195,6 +3305,10 @@ You should manually include select2 distributive:
|
|
3195
3305
|
<link href="select2/select2.css" rel="stylesheet" type="text/css"></link>
|
3196
3306
|
<script src="select2/select2.js"></script>
|
3197
3307
|
|
3308
|
+
For make it **Bootstrap-styled** you can use css from [here](https://github.com/t0m/select2-bootstrap-css):
|
3309
|
+
|
3310
|
+
<link href="select2-bootstrap.css" rel="stylesheet" type="text/css"></link>
|
3311
|
+
|
3198
3312
|
**Note:** currently `ajax` source for select2 is not supported, as it's not possible to load it in closed select2 state.
|
3199
3313
|
The solution is to load source manually and assign statically.
|
3200
3314
|
|
@@ -3220,7 +3334,8 @@ $(function(){
|
|
3220
3334
|
</script>
|
3221
3335
|
**/
|
3222
3336
|
(function ($) {
|
3223
|
-
|
3337
|
+
"use strict";
|
3338
|
+
|
3224
3339
|
var Constructor = function (options) {
|
3225
3340
|
this.init('select2', options, Constructor.defaults);
|
3226
3341
|
|
@@ -3422,8 +3537,9 @@ $(function(){
|
|
3422
3537
|
$.fn.editabletypes.select2 = Constructor;
|
3423
3538
|
|
3424
3539
|
}(window.jQuery));
|
3540
|
+
|
3425
3541
|
/**
|
3426
|
-
* Combodate - 1.0.
|
3542
|
+
* Combodate - 1.0.3
|
3427
3543
|
* Dropdown date and time picker.
|
3428
3544
|
* Converts text input into dropdowns to pick day, month, year, hour, minute and second.
|
3429
3545
|
* Uses momentjs as datetime library http://momentjs.com.
|
@@ -3530,7 +3646,7 @@ $(function(){
|
|
3530
3646
|
relTime;
|
3531
3647
|
|
3532
3648
|
if(this.options.firstItem === 'name') {
|
3533
|
-
//need both to
|
3649
|
+
//need both to support moment ver < 2 and >= 2
|
3534
3650
|
relTime = moment.relativeTime || moment.langData()._relativeTime;
|
3535
3651
|
var header = typeof relTime[key] === 'function' ? relTime[key](1, true, key, false) : relTime[key];
|
3536
3652
|
//take last entry (see momentjs lang files structure)
|
@@ -3595,13 +3711,16 @@ $(function(){
|
|
3595
3711
|
fill year
|
3596
3712
|
*/
|
3597
3713
|
fillYear: function() {
|
3598
|
-
var items =
|
3714
|
+
var items = [], name, i,
|
3599
3715
|
longNames = this.options.template.indexOf('YYYY') !== -1;
|
3600
|
-
|
3716
|
+
|
3601
3717
|
for(i=this.options.maxYear; i>=this.options.minYear; i--) {
|
3602
3718
|
name = longNames ? i : (i+'').substring(2);
|
3603
|
-
items.push([i, name]);
|
3604
|
-
}
|
3719
|
+
items[this.options.yearDescending ? 'push' : 'unshift']([i, name]);
|
3720
|
+
}
|
3721
|
+
|
3722
|
+
items = this.initItems('y').concat(items);
|
3723
|
+
|
3605
3724
|
return items;
|
3606
3725
|
},
|
3607
3726
|
|
@@ -3723,6 +3842,22 @@ $(function(){
|
|
3723
3842
|
that = this,
|
3724
3843
|
values = {};
|
3725
3844
|
|
3845
|
+
//function to find nearest value in select options
|
3846
|
+
function getNearest($select, value) {
|
3847
|
+
var delta = {};
|
3848
|
+
$select.children('option').each(function(i, opt){
|
3849
|
+
var optValue = $(opt).attr('value'),
|
3850
|
+
distance;
|
3851
|
+
|
3852
|
+
if(optValue === '') return;
|
3853
|
+
distance = Math.abs(optValue - value);
|
3854
|
+
if(typeof delta.distance === 'undefined' || distance < delta.distance) {
|
3855
|
+
delta = {value: optValue, distance: distance};
|
3856
|
+
}
|
3857
|
+
});
|
3858
|
+
return delta.value;
|
3859
|
+
}
|
3860
|
+
|
3726
3861
|
if(dt.isValid()) {
|
3727
3862
|
//read values from date object
|
3728
3863
|
$.each(this.map, function(k, v) {
|
@@ -3742,7 +3877,17 @@ $(function(){
|
|
3742
3877
|
}
|
3743
3878
|
|
3744
3879
|
$.each(values, function(k, v) {
|
3880
|
+
//call val() for each existing combo, e.g. this.$hour.val()
|
3745
3881
|
if(that['$'+k]) {
|
3882
|
+
|
3883
|
+
if(k === 'minute' && that.options.minuteStep > 1 && that.options.roundTime) {
|
3884
|
+
v = getNearest(that['$'+k], v);
|
3885
|
+
}
|
3886
|
+
|
3887
|
+
if(k === 'second' && that.options.secondStep > 1 && that.options.roundTime) {
|
3888
|
+
v = getNearest(that['$'+k], v);
|
3889
|
+
}
|
3890
|
+
|
3746
3891
|
that['$'+k].val(v);
|
3747
3892
|
}
|
3748
3893
|
});
|
@@ -3817,10 +3962,12 @@ $(function(){
|
|
3817
3962
|
value: null,
|
3818
3963
|
minYear: 1970,
|
3819
3964
|
maxYear: 2015,
|
3965
|
+
yearDescending: true,
|
3820
3966
|
minuteStep: 5,
|
3821
3967
|
secondStep: 1,
|
3822
3968
|
firstItem: 'empty', //'name', 'empty', 'none'
|
3823
|
-
errorClass: null
|
3969
|
+
errorClass: null,
|
3970
|
+
roundTime: true //whether to round minutes and seconds if step > 1
|
3824
3971
|
};
|
3825
3972
|
|
3826
3973
|
}(window.jQuery));
|
@@ -3865,7 +4012,8 @@ $(function(){
|
|
3865
4012
|
/*global moment*/
|
3866
4013
|
|
3867
4014
|
(function ($) {
|
3868
|
-
|
4015
|
+
"use strict";
|
4016
|
+
|
3869
4017
|
var Constructor = function (options) {
|
3870
4018
|
this.init('combodate', options, Constructor.defaults);
|
3871
4019
|
|
@@ -4017,8 +4165,9 @@ $(function(){
|
|
4017
4165
|
Editableform based on Twitter Bootstrap
|
4018
4166
|
*/
|
4019
4167
|
(function ($) {
|
4168
|
+
"use strict";
|
4020
4169
|
|
4021
|
-
|
4170
|
+
$.extend($.fn.editableform.Constructor.prototype, {
|
4022
4171
|
initTemplate: function() {
|
4023
4172
|
this.$form = $($.fn.editableform.template);
|
4024
4173
|
this.$form.find('.editable-error-block').addClass('help-block');
|
@@ -4040,12 +4189,13 @@ Editableform based on Twitter Bootstrap
|
|
4040
4189
|
* requires bootstrap-popover.js
|
4041
4190
|
*/
|
4042
4191
|
(function ($) {
|
4192
|
+
"use strict";
|
4043
4193
|
|
4044
4194
|
//extend methods
|
4045
4195
|
$.extend($.fn.editableContainer.Popup.prototype, {
|
4046
4196
|
containerName: 'popover',
|
4047
4197
|
//for compatibility with bootstrap <= 2.2.1 (content inserted into <p> instead of directly .popover-content)
|
4048
|
-
innerCss: $($.fn.popover.defaults.template).find('p').length ? '.popover-content p' : '.popover-content',
|
4198
|
+
innerCss: $.fn.popover && $($.fn.popover.defaults.template).find('p').length ? '.popover-content p' : '.popover-content',
|
4049
4199
|
|
4050
4200
|
initContainer: function(){
|
4051
4201
|
$.extend(this.containerOptions, {
|
@@ -4174,7 +4324,8 @@ $(function(){
|
|
4174
4324
|
</script>
|
4175
4325
|
**/
|
4176
4326
|
(function ($) {
|
4177
|
-
|
4327
|
+
"use strict";
|
4328
|
+
|
4178
4329
|
var Date = function (options) {
|
4179
4330
|
this.init('date', options, Date.defaults);
|
4180
4331
|
this.initPicker(options, Date.defaults);
|
@@ -4258,6 +4409,9 @@ $(function(){
|
|
4258
4409
|
clear: function() {
|
4259
4410
|
this.$input.data('datepicker').date = null;
|
4260
4411
|
this.$input.find('.active').removeClass('active');
|
4412
|
+
if(!this.options.showbuttons) {
|
4413
|
+
this.$input.closest('form').submit();
|
4414
|
+
}
|
4261
4415
|
},
|
4262
4416
|
|
4263
4417
|
autosubmit: function() {
|
@@ -4357,7 +4511,8 @@ Automatically shown in inline mode.
|
|
4357
4511
|
@since 1.4.0
|
4358
4512
|
**/
|
4359
4513
|
(function ($) {
|
4360
|
-
|
4514
|
+
"use strict";
|
4515
|
+
|
4361
4516
|
var DateField = function (options) {
|
4362
4517
|
this.init('datefield', options, DateField.defaults);
|
4363
4518
|
this.initPicker(options, DateField.defaults);
|
@@ -4468,13 +4623,11 @@ Automatically shown in inline mode.
|
|
4468
4623
|
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||dates[this.language].format||'mm/dd/yyyy');
|
4469
4624
|
this.isInline = false;
|
4470
4625
|
this.isInput = this.element.is('input');
|
4471
|
-
this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
|
4626
|
+
this.component = this.element.is('.date') ? this.element.find('.add-on, .btn') : false;
|
4472
4627
|
this.hasInput = this.component && this.element.find('input').length;
|
4473
4628
|
if(this.component && this.component.length === 0)
|
4474
4629
|
this.component = false;
|
4475
4630
|
|
4476
|
-
this._attachEvents();
|
4477
|
-
|
4478
4631
|
this.forceParse = true;
|
4479
4632
|
if ('forceParse' in options) {
|
4480
4633
|
this.forceParse = options.forceParse;
|
@@ -4482,16 +4635,12 @@ Automatically shown in inline mode.
|
|
4482
4635
|
this.forceParse = this.element.data('date-force-parse');
|
4483
4636
|
}
|
4484
4637
|
|
4485
|
-
|
4486
|
-
this.
|
4487
|
-
|
4488
|
-
.on({
|
4489
|
-
click: $.proxy(this.click, this),
|
4490
|
-
mousedown: $.proxy(this.mousedown, this)
|
4491
|
-
});
|
4638
|
+
this.picker = $(DPGlobal.template);
|
4639
|
+
this._buildEvents();
|
4640
|
+
this._attachEvents();
|
4492
4641
|
|
4493
4642
|
if(this.isInline) {
|
4494
|
-
this.picker.addClass('datepicker-inline');
|
4643
|
+
this.picker.addClass('datepicker-inline').appendTo(this.element);
|
4495
4644
|
} else {
|
4496
4645
|
this.picker.addClass('datepicker-dropdown dropdown-menu');
|
4497
4646
|
}
|
@@ -4500,12 +4649,6 @@ Automatically shown in inline mode.
|
|
4500
4649
|
this.picker.find('.prev i, .next i')
|
4501
4650
|
.toggleClass('icon-arrow-left icon-arrow-right');
|
4502
4651
|
}
|
4503
|
-
$(document).on('mousedown', function (e) {
|
4504
|
-
// Clicked outside the datepicker, hide it
|
4505
|
-
if ($(e.target).closest('.datepicker.datepicker-inline, .datepicker.datepicker-dropdown').length === 0) {
|
4506
|
-
that.hide();
|
4507
|
-
}
|
4508
|
-
});
|
4509
4652
|
|
4510
4653
|
this.autoclose = false;
|
4511
4654
|
if ('autoclose' in options) {
|
@@ -4565,6 +4708,8 @@ Automatically shown in inline mode.
|
|
4565
4708
|
return parseInt(val) + 1;
|
4566
4709
|
});
|
4567
4710
|
|
4711
|
+
this._allow_update = false;
|
4712
|
+
|
4568
4713
|
this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||dates[this.language].weekStart||0) % 7);
|
4569
4714
|
this.weekEnd = ((this.weekStart + 6) % 7);
|
4570
4715
|
this.startDate = -Infinity;
|
@@ -4575,6 +4720,9 @@ Automatically shown in inline mode.
|
|
4575
4720
|
this.setDaysOfWeekDisabled(options.daysOfWeekDisabled||this.element.data('date-days-of-week-disabled'));
|
4576
4721
|
this.fillDow();
|
4577
4722
|
this.fillMonths();
|
4723
|
+
|
4724
|
+
this._allow_update = true;
|
4725
|
+
|
4578
4726
|
this.update();
|
4579
4727
|
this.showMode();
|
4580
4728
|
|
@@ -4587,8 +4735,22 @@ Automatically shown in inline mode.
|
|
4587
4735
|
constructor: Datepicker,
|
4588
4736
|
|
4589
4737
|
_events: [],
|
4590
|
-
|
4591
|
-
|
4738
|
+
_secondaryEvents: [],
|
4739
|
+
_applyEvents: function(evs){
|
4740
|
+
for (var i=0, el, ev; i<evs.length; i++){
|
4741
|
+
el = evs[i][0];
|
4742
|
+
ev = evs[i][1];
|
4743
|
+
el.on(ev);
|
4744
|
+
}
|
4745
|
+
},
|
4746
|
+
_unapplyEvents: function(evs){
|
4747
|
+
for (var i=0, el, ev; i<evs.length; i++){
|
4748
|
+
el = evs[i][0];
|
4749
|
+
ev = evs[i][1];
|
4750
|
+
el.off(ev);
|
4751
|
+
}
|
4752
|
+
},
|
4753
|
+
_buildEvents: function(){
|
4592
4754
|
if (this.isInput) { // single input
|
4593
4755
|
this._events = [
|
4594
4756
|
[this.element, {
|
@@ -4611,9 +4773,9 @@ Automatically shown in inline mode.
|
|
4611
4773
|
}]
|
4612
4774
|
];
|
4613
4775
|
}
|
4614
|
-
|
4615
|
-
|
4616
|
-
|
4776
|
+
else if (this.element.is('div')) { // inline datepicker
|
4777
|
+
this.isInline = true;
|
4778
|
+
}
|
4617
4779
|
else {
|
4618
4780
|
this._events = [
|
4619
4781
|
[this.element, {
|
@@ -4621,29 +4783,47 @@ Automatically shown in inline mode.
|
|
4621
4783
|
}]
|
4622
4784
|
];
|
4623
4785
|
}
|
4624
|
-
|
4625
|
-
|
4626
|
-
|
4627
|
-
|
4628
|
-
|
4786
|
+
|
4787
|
+
this._secondaryEvents = [
|
4788
|
+
[this.picker, {
|
4789
|
+
click: $.proxy(this.click, this)
|
4790
|
+
}],
|
4791
|
+
[$(window), {
|
4792
|
+
resize: $.proxy(this.place, this)
|
4793
|
+
}],
|
4794
|
+
[$(document), {
|
4795
|
+
mousedown: $.proxy(function (e) {
|
4796
|
+
// Clicked outside the datepicker, hide it
|
4797
|
+
if ($(e.target).closest('.datepicker.datepicker-inline, .datepicker.datepicker-dropdown').length === 0) {
|
4798
|
+
this.hide();
|
4799
|
+
}
|
4800
|
+
}, this)
|
4801
|
+
}]
|
4802
|
+
];
|
4803
|
+
},
|
4804
|
+
_attachEvents: function(){
|
4805
|
+
this._detachEvents();
|
4806
|
+
this._applyEvents(this._events);
|
4629
4807
|
},
|
4630
4808
|
_detachEvents: function(){
|
4631
|
-
|
4632
|
-
|
4633
|
-
|
4634
|
-
|
4635
|
-
|
4636
|
-
|
4809
|
+
this._unapplyEvents(this._events);
|
4810
|
+
},
|
4811
|
+
_attachSecondaryEvents: function(){
|
4812
|
+
this._detachSecondaryEvents();
|
4813
|
+
this._applyEvents(this._secondaryEvents);
|
4814
|
+
},
|
4815
|
+
_detachSecondaryEvents: function(){
|
4816
|
+
this._unapplyEvents(this._secondaryEvents);
|
4637
4817
|
},
|
4638
4818
|
|
4639
4819
|
show: function(e) {
|
4820
|
+
if (!this.isInline)
|
4821
|
+
this.picker.appendTo('body');
|
4640
4822
|
this.picker.show();
|
4641
4823
|
this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
|
4642
|
-
this.update();
|
4643
4824
|
this.place();
|
4644
|
-
|
4645
|
-
if (e
|
4646
|
-
e.stopPropagation();
|
4825
|
+
this._attachSecondaryEvents();
|
4826
|
+
if (e) {
|
4647
4827
|
e.preventDefault();
|
4648
4828
|
}
|
4649
4829
|
this.element.trigger({
|
@@ -4655,13 +4835,10 @@ Automatically shown in inline mode.
|
|
4655
4835
|
hide: function(e){
|
4656
4836
|
if(this.isInline) return;
|
4657
4837
|
if (!this.picker.is(':visible')) return;
|
4658
|
-
this.picker.hide();
|
4659
|
-
|
4838
|
+
this.picker.hide().detach();
|
4839
|
+
this._detachSecondaryEvents();
|
4660
4840
|
this.viewMode = this.startViewMode;
|
4661
4841
|
this.showMode();
|
4662
|
-
if (!this.isInput) {
|
4663
|
-
$(document).off('mousedown', this.hide);
|
4664
|
-
}
|
4665
4842
|
|
4666
4843
|
if (
|
4667
4844
|
this.forceParse &&
|
@@ -4678,9 +4855,14 @@ Automatically shown in inline mode.
|
|
4678
4855
|
},
|
4679
4856
|
|
4680
4857
|
remove: function() {
|
4858
|
+
this.hide();
|
4681
4859
|
this._detachEvents();
|
4860
|
+
this._detachSecondaryEvents();
|
4682
4861
|
this.picker.remove();
|
4683
4862
|
delete this.element.data().datepicker;
|
4863
|
+
if (!this.isInput) {
|
4864
|
+
delete this.element.data().date;
|
4865
|
+
}
|
4684
4866
|
},
|
4685
4867
|
|
4686
4868
|
getDate: function() {
|
@@ -4754,7 +4936,7 @@ Automatically shown in inline mode.
|
|
4754
4936
|
var zIndex = parseInt(this.element.parents().filter(function() {
|
4755
4937
|
return $(this).css('z-index') != 'auto';
|
4756
4938
|
}).first().css('z-index'))+10;
|
4757
|
-
var offset = this.component ? this.component.offset() : this.element.offset();
|
4939
|
+
var offset = this.component ? this.component.parent().offset() : this.element.offset();
|
4758
4940
|
var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(true);
|
4759
4941
|
this.picker.css({
|
4760
4942
|
top: offset.top + height,
|
@@ -4763,7 +4945,10 @@ Automatically shown in inline mode.
|
|
4763
4945
|
});
|
4764
4946
|
},
|
4765
4947
|
|
4948
|
+
_allow_update: true,
|
4766
4949
|
update: function(){
|
4950
|
+
if (!this._allow_update) return;
|
4951
|
+
|
4767
4952
|
var date, fromArgs = false;
|
4768
4953
|
if(arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) {
|
4769
4954
|
date = arguments[0];
|
@@ -4918,6 +5103,8 @@ Automatically shown in inline mode.
|
|
4918
5103
|
},
|
4919
5104
|
|
4920
5105
|
updateNavArrows: function() {
|
5106
|
+
if (!this._allow_update) return;
|
5107
|
+
|
4921
5108
|
var d = new Date(this.viewDate),
|
4922
5109
|
year = d.getUTCFullYear(),
|
4923
5110
|
month = d.getUTCMonth();
|
@@ -4951,7 +5138,6 @@ Automatically shown in inline mode.
|
|
4951
5138
|
},
|
4952
5139
|
|
4953
5140
|
click: function(e) {
|
4954
|
-
e.stopPropagation();
|
4955
5141
|
e.preventDefault();
|
4956
5142
|
var target = $(e.target).closest('span, td, th');
|
4957
5143
|
if (target.length == 1) {
|
@@ -5441,6 +5627,300 @@ Automatically shown in inline mode.
|
|
5441
5627
|
|
5442
5628
|
}( window.jQuery );
|
5443
5629
|
|
5630
|
+
/**
|
5631
|
+
Bootstrap-datetimepicker.
|
5632
|
+
Based on [smalot bootstrap-datetimepicker plugin](https://github.com/smalot/bootstrap-datetimepicker).
|
5633
|
+
Before usage you should manually include dependent js and css:
|
5634
|
+
|
5635
|
+
<link href="css/datetimepicker.css" rel="stylesheet" type="text/css"></link>
|
5636
|
+
<script src="js/bootstrap-datetimepicker.js"></script>
|
5637
|
+
|
5638
|
+
For **i18n** you should include js file from here: https://github.com/smalot/bootstrap-datetimepicker/tree/master/js/locales
|
5639
|
+
and set `language` option.
|
5640
|
+
|
5641
|
+
@class datetime
|
5642
|
+
@extends abstractinput
|
5643
|
+
@final
|
5644
|
+
@since 1.4.4
|
5645
|
+
@example
|
5646
|
+
<a href="#" id="last_seen" data-type="datetime" data-pk="1" data-url="/post" title="Select date & time">15/03/2013 12:45</a>
|
5647
|
+
<script>
|
5648
|
+
$(function(){
|
5649
|
+
$('#last_seen').editable({
|
5650
|
+
format: 'yyyy-mm-dd hh:ii',
|
5651
|
+
viewformat: 'dd/mm/yyyy hh:ii',
|
5652
|
+
datetimepicker: {
|
5653
|
+
weekStart: 1
|
5654
|
+
}
|
5655
|
+
}
|
5656
|
+
});
|
5657
|
+
});
|
5658
|
+
</script>
|
5659
|
+
**/
|
5660
|
+
(function ($) {
|
5661
|
+
"use strict";
|
5662
|
+
|
5663
|
+
var DateTime = function (options) {
|
5664
|
+
this.init('datetime', options, DateTime.defaults);
|
5665
|
+
this.initPicker(options, DateTime.defaults);
|
5666
|
+
};
|
5667
|
+
|
5668
|
+
$.fn.editableutils.inherit(DateTime, $.fn.editabletypes.abstractinput);
|
5669
|
+
|
5670
|
+
$.extend(DateTime.prototype, {
|
5671
|
+
initPicker: function(options, defaults) {
|
5672
|
+
//'format' is set directly from settings or data-* attributes
|
5673
|
+
|
5674
|
+
//by default viewformat equals to format
|
5675
|
+
if(!this.options.viewformat) {
|
5676
|
+
this.options.viewformat = this.options.format;
|
5677
|
+
}
|
5678
|
+
|
5679
|
+
//overriding datetimepicker config (as by default jQuery extend() is not recursive)
|
5680
|
+
//since 1.4 datetimepicker internally uses viewformat instead of format. Format is for submit only
|
5681
|
+
this.options.datetimepicker = $.extend({}, defaults.datetimepicker, options.datetimepicker, {
|
5682
|
+
format: this.options.viewformat
|
5683
|
+
});
|
5684
|
+
|
5685
|
+
//language
|
5686
|
+
this.options.datetimepicker.language = this.options.datetimepicker.language || 'en';
|
5687
|
+
|
5688
|
+
//store DPglobal
|
5689
|
+
this.dpg = $.fn.datetimepicker.DPGlobal;
|
5690
|
+
|
5691
|
+
//store parsed formats
|
5692
|
+
this.parsedFormat = this.dpg.parseFormat(this.options.format, this.options.formatType);
|
5693
|
+
this.parsedViewFormat = this.dpg.parseFormat(this.options.viewformat, this.options.formatType);
|
5694
|
+
|
5695
|
+
//
|
5696
|
+
this.options.datetimepicker.startView = this.options.startView;
|
5697
|
+
this.options.datetimepicker.minView = this.options.minView;
|
5698
|
+
this.options.datetimepicker.maxView = this.options.maxView;
|
5699
|
+
},
|
5700
|
+
|
5701
|
+
render: function () {
|
5702
|
+
this.$input.datetimepicker(this.options.datetimepicker);
|
5703
|
+
|
5704
|
+
//"clear" link
|
5705
|
+
if(this.options.clear) {
|
5706
|
+
this.$clear = $('<a href="#"></a>').html(this.options.clear).click($.proxy(function(e){
|
5707
|
+
e.preventDefault();
|
5708
|
+
e.stopPropagation();
|
5709
|
+
this.clear();
|
5710
|
+
}, this));
|
5711
|
+
|
5712
|
+
this.$tpl.parent().append($('<div class="editable-clear">').append(this.$clear));
|
5713
|
+
}
|
5714
|
+
},
|
5715
|
+
|
5716
|
+
value2html: function(value, element) {
|
5717
|
+
//formatDate works with UTCDate!
|
5718
|
+
var text = value ? this.dpg.formatDate(this.toUTC(value), this.parsedViewFormat, this.options.datetimepicker.language, this.options.formatType) : '';
|
5719
|
+
if(element) {
|
5720
|
+
DateTime.superclass.value2html(text, element);
|
5721
|
+
} else {
|
5722
|
+
return text;
|
5723
|
+
}
|
5724
|
+
},
|
5725
|
+
|
5726
|
+
html2value: function(html) {
|
5727
|
+
//parseDate return utc date!
|
5728
|
+
var value = html ? this.dpg.parseDate(html, this.parsedViewFormat, this.options.datetimepicker.language, this.options.formatType) : null;
|
5729
|
+
return value ? this.fromUTC(value) : null;
|
5730
|
+
},
|
5731
|
+
|
5732
|
+
value2str: function(value) {
|
5733
|
+
//formatDate works with UTCDate!
|
5734
|
+
return value ? this.dpg.formatDate(this.toUTC(value), this.parsedFormat, this.options.datetimepicker.language, this.options.formatType) : '';
|
5735
|
+
},
|
5736
|
+
|
5737
|
+
str2value: function(str) {
|
5738
|
+
//parseDate return utc date!
|
5739
|
+
var value = str ? this.dpg.parseDate(str, this.parsedFormat, this.options.datetimepicker.language, this.options.formatType) : null;
|
5740
|
+
return value ? this.fromUTC(value) : null;
|
5741
|
+
},
|
5742
|
+
|
5743
|
+
value2submit: function(value) {
|
5744
|
+
return this.value2str(value);
|
5745
|
+
},
|
5746
|
+
|
5747
|
+
value2input: function(value) {
|
5748
|
+
if(value) {
|
5749
|
+
this.$input.data('datetimepicker').setDate(value);
|
5750
|
+
}
|
5751
|
+
},
|
5752
|
+
|
5753
|
+
input2value: function() {
|
5754
|
+
//date may be cleared, in that case getDate() triggers error
|
5755
|
+
var dt = this.$input.data('datetimepicker');
|
5756
|
+
return dt.date ? dt.getDate() : null;
|
5757
|
+
},
|
5758
|
+
|
5759
|
+
activate: function() {
|
5760
|
+
},
|
5761
|
+
|
5762
|
+
clear: function() {
|
5763
|
+
this.$input.data('datetimepicker').date = null;
|
5764
|
+
this.$input.find('.active').removeClass('active');
|
5765
|
+
if(!this.options.showbuttons) {
|
5766
|
+
this.$input.closest('form').submit();
|
5767
|
+
}
|
5768
|
+
},
|
5769
|
+
|
5770
|
+
autosubmit: function() {
|
5771
|
+
this.$input.on('mouseup', '.minute', function(e){
|
5772
|
+
var $form = $(this).closest('form');
|
5773
|
+
setTimeout(function() {
|
5774
|
+
$form.submit();
|
5775
|
+
}, 200);
|
5776
|
+
});
|
5777
|
+
},
|
5778
|
+
|
5779
|
+
//convert date from local to utc
|
5780
|
+
toUTC: function(value) {
|
5781
|
+
return value ? new Date(value.valueOf() - value.getTimezoneOffset() * 60000) : value;
|
5782
|
+
},
|
5783
|
+
|
5784
|
+
//convert date from utc to local
|
5785
|
+
fromUTC: function(value) {
|
5786
|
+
return value ? new Date(value.valueOf() + value.getTimezoneOffset() * 60000) : value;
|
5787
|
+
}
|
5788
|
+
|
5789
|
+
});
|
5790
|
+
|
5791
|
+
DateTime.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
|
5792
|
+
/**
|
5793
|
+
@property tpl
|
5794
|
+
@default <div></div>
|
5795
|
+
**/
|
5796
|
+
tpl:'<div class="editable-date well"></div>',
|
5797
|
+
/**
|
5798
|
+
@property inputclass
|
5799
|
+
@default null
|
5800
|
+
**/
|
5801
|
+
inputclass: null,
|
5802
|
+
/**
|
5803
|
+
Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br>
|
5804
|
+
Possible tokens are: <code>d, dd, m, mm, yy, yyyy, h, i</code>
|
5805
|
+
|
5806
|
+
@property format
|
5807
|
+
@type string
|
5808
|
+
@default yyyy-mm-dd hh:ii
|
5809
|
+
**/
|
5810
|
+
format:'yyyy-mm-dd hh:ii',
|
5811
|
+
formatType:'standard',
|
5812
|
+
/**
|
5813
|
+
Format used for displaying date. Also applied when converting date from element's text on init.
|
5814
|
+
If not specified equals to <code>format</code>
|
5815
|
+
|
5816
|
+
@property viewformat
|
5817
|
+
@type string
|
5818
|
+
@default null
|
5819
|
+
**/
|
5820
|
+
viewformat: null,
|
5821
|
+
/**
|
5822
|
+
Configuration of datetimepicker.
|
5823
|
+
Full list of options: https://github.com/smalot/bootstrap-datetimepicker
|
5824
|
+
|
5825
|
+
@property datetimepicker
|
5826
|
+
@type object
|
5827
|
+
@default { }
|
5828
|
+
**/
|
5829
|
+
datetimepicker:{
|
5830
|
+
todayHighlight: false,
|
5831
|
+
autoclose: false
|
5832
|
+
},
|
5833
|
+
/**
|
5834
|
+
Text shown as clear date button.
|
5835
|
+
If <code>false</code> clear button will not be rendered.
|
5836
|
+
|
5837
|
+
@property clear
|
5838
|
+
@type boolean|string
|
5839
|
+
@default 'x clear'
|
5840
|
+
**/
|
5841
|
+
clear: '× clear'
|
5842
|
+
});
|
5843
|
+
|
5844
|
+
$.fn.editabletypes.datetime = DateTime;
|
5845
|
+
|
5846
|
+
}(window.jQuery));
|
5847
|
+
/**
|
5848
|
+
Bootstrap datetimefield input - datetime input for inline mode.
|
5849
|
+
Shows normal <input type="text"> and binds popup datetimepicker.
|
5850
|
+
Automatically shown in inline mode.
|
5851
|
+
|
5852
|
+
@class datetimefield
|
5853
|
+
@extends datetime
|
5854
|
+
|
5855
|
+
**/
|
5856
|
+
(function ($) {
|
5857
|
+
"use strict";
|
5858
|
+
|
5859
|
+
var DateTimeField = function (options) {
|
5860
|
+
this.init('datetimefield', options, DateTimeField.defaults);
|
5861
|
+
this.initPicker(options, DateTimeField.defaults);
|
5862
|
+
};
|
5863
|
+
|
5864
|
+
$.fn.editableutils.inherit(DateTimeField, $.fn.editabletypes.datetime);
|
5865
|
+
|
5866
|
+
$.extend(DateTimeField.prototype, {
|
5867
|
+
render: function () {
|
5868
|
+
this.$input = this.$tpl.find('input');
|
5869
|
+
this.setClass();
|
5870
|
+
this.setAttr('placeholder');
|
5871
|
+
|
5872
|
+
this.$tpl.datetimepicker(this.options.datetimepicker);
|
5873
|
+
|
5874
|
+
//need to disable original event handlers
|
5875
|
+
this.$input.off('focus keydown');
|
5876
|
+
|
5877
|
+
//update value of datepicker
|
5878
|
+
this.$input.keyup($.proxy(function(){
|
5879
|
+
this.$tpl.removeData('date');
|
5880
|
+
this.$tpl.datetimepicker('update');
|
5881
|
+
}, this));
|
5882
|
+
|
5883
|
+
},
|
5884
|
+
|
5885
|
+
value2input: function(value) {
|
5886
|
+
this.$input.val(this.value2html(value));
|
5887
|
+
this.$tpl.datetimepicker('update');
|
5888
|
+
},
|
5889
|
+
|
5890
|
+
input2value: function() {
|
5891
|
+
return this.html2value(this.$input.val());
|
5892
|
+
},
|
5893
|
+
|
5894
|
+
activate: function() {
|
5895
|
+
$.fn.editabletypes.text.prototype.activate.call(this);
|
5896
|
+
},
|
5897
|
+
|
5898
|
+
autosubmit: function() {
|
5899
|
+
//reset autosubmit to empty
|
5900
|
+
}
|
5901
|
+
});
|
5902
|
+
|
5903
|
+
DateTimeField.defaults = $.extend({}, $.fn.editabletypes.datetime.defaults, {
|
5904
|
+
/**
|
5905
|
+
@property tpl
|
5906
|
+
**/
|
5907
|
+
tpl:'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>',
|
5908
|
+
/**
|
5909
|
+
@property inputclass
|
5910
|
+
@default 'input-medium'
|
5911
|
+
**/
|
5912
|
+
inputclass: 'input-medium',
|
5913
|
+
|
5914
|
+
/* datetimepicker config */
|
5915
|
+
datetimepicker:{
|
5916
|
+
todayHighlight: false,
|
5917
|
+
autoclose: true
|
5918
|
+
}
|
5919
|
+
});
|
5920
|
+
|
5921
|
+
$.fn.editabletypes.datetimefield = DateTimeField;
|
5922
|
+
|
5923
|
+
}(window.jQuery));
|
5444
5924
|
/**
|
5445
5925
|
Typeahead input (bootstrap only). Based on Twitter Bootstrap [typeahead](http://twitter.github.com/bootstrap/javascript.html#typeahead).
|
5446
5926
|
Depending on `source` format typeahead operates in two modes:
|
@@ -5473,7 +5953,8 @@ $(function(){
|
|
5473
5953
|
</script>
|
5474
5954
|
**/
|
5475
5955
|
(function ($) {
|
5476
|
-
|
5956
|
+
"use strict";
|
5957
|
+
|
5477
5958
|
var Constructor = function (options) {
|
5478
5959
|
this.init('typeahead', options, Constructor.defaults);
|
5479
5960
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! X-editable - v1.4.
|
1
|
+
/*! X-editable - v1.4.4
|
2
2
|
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
|
3
3
|
* http://github.com/vitalets/x-editable
|
4
4
|
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
|
@@ -22,7 +22,11 @@
|
|
22
22
|
*display: inline;
|
23
23
|
}
|
24
24
|
|
25
|
-
|
25
|
+
.editable-buttons.editable-buttons-bottom {
|
26
|
+
display: block;
|
27
|
+
margin-top: 7px;
|
28
|
+
margin-left: 0;
|
29
|
+
}
|
26
30
|
|
27
31
|
.editable-input {
|
28
32
|
vertical-align: top;
|
@@ -71,12 +75,20 @@
|
|
71
75
|
color: red;
|
72
76
|
}
|
73
77
|
|
78
|
+
/* ---- For specific types ---- */
|
79
|
+
|
74
80
|
.editableform .editable-date {
|
75
81
|
padding: 0;
|
76
82
|
margin: 0;
|
77
83
|
float: left;
|
78
84
|
}
|
79
85
|
|
86
|
+
/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */
|
87
|
+
.editable-inline .add-on .icon-th {
|
88
|
+
margin-top: 3px;
|
89
|
+
margin-left: 1px;
|
90
|
+
}
|
91
|
+
|
80
92
|
|
81
93
|
/* checklist vertical alignment */
|
82
94
|
.editable-checklist label input[type="checkbox"],
|
@@ -112,18 +124,21 @@
|
|
112
124
|
position: absolute;
|
113
125
|
opacity: 0.6;
|
114
126
|
z-index: 100;
|
115
|
-
|
127
|
+
|
128
|
+
top: 50%;
|
129
|
+
right: 6px;
|
130
|
+
margin-top: -6px;
|
131
|
+
|
116
132
|
}
|
117
133
|
|
118
134
|
.editable-clear-x:hover {
|
119
135
|
opacity: 1;
|
120
136
|
}
|
121
|
-
.editable-container {
|
137
|
+
.editable-container.editable-popup {
|
122
138
|
max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
|
123
139
|
}
|
124
140
|
|
125
141
|
.editable-container.popover {
|
126
|
-
/* width: 300px;*/ /* debug */
|
127
142
|
width: auto; /* without this rule popover does not stretch */
|
128
143
|
}
|
129
144
|
|
@@ -154,10 +169,10 @@ a.editable-click.editable-disabled:hover {
|
|
154
169
|
border-bottom: none;
|
155
170
|
}
|
156
171
|
|
157
|
-
.editable-empty, .editable-empty:hover{
|
172
|
+
.editable-empty, .editable-empty:hover, .editable-empty:focus{
|
158
173
|
font-style: italic;
|
159
174
|
color: #DD1144;
|
160
|
-
border-bottom: none;
|
175
|
+
/* border-bottom: none; */
|
161
176
|
text-decoration: none;
|
162
177
|
}
|
163
178
|
|
@@ -188,7 +203,6 @@ a.editable-click.editable-disabled:hover {
|
|
188
203
|
*/
|
189
204
|
.datepicker {
|
190
205
|
padding: 4px;
|
191
|
-
margin-top: 1px;
|
192
206
|
-webkit-border-radius: 4px;
|
193
207
|
-moz-border-radius: 4px;
|
194
208
|
border-radius: 4px;
|
@@ -291,6 +305,7 @@ a.editable-click.editable-disabled:hover {
|
|
291
305
|
border-color: #fdf59a #fdf59a #fbed50;
|
292
306
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
293
307
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
308
|
+
color: #000 !important;
|
294
309
|
}
|
295
310
|
.datepicker table tr td.today:hover,
|
296
311
|
.datepicker table tr td.today:hover:hover,
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootstrap-x-editable-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|