on_the_spot 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40b5d965c2d82d3af5910189c680a7b78ac758b4faddbcbac8724a173420b1bb
4
- data.tar.gz: 9cb9cd5073ed51a6561b5878fda09b764a4c13f55dc7f568da2f7daed09dbc51
3
+ metadata.gz: 90cbf6521a31499df8dd05c1afa968a5032b33a6f87501d357ee235c058efc51
4
+ data.tar.gz: 1a39af6e2f4a77851649fb7ee2a38ca8969b1eb3245544bbbd1f104ae5aaea65
5
5
  SHA512:
6
- metadata.gz: '0396ab103978dd4f521c3fb477449a686fbef65e3488855b3f7f379e3f29fb73427b88e69ac9c38c2ced75c619faa09d404cfbd5bb0e0a2194d991ca8030af20'
7
- data.tar.gz: 07eb52d9787e8ec4860cb62b6636ee3f2b967ca5b032e6efd42c3939c12dfd4df8f5f8f2925f7c30324d3819ecbc46afcd8d7ba594cbb22373afba620e0fa065
6
+ metadata.gz: 41e9055ca232c6d9e7a97d5c3bf0f129af1c6f6b359560900cfd87ddaa9c11c6934995dfc1fc9310dc94195aac61695e07273e51339ab7954b23bf44665a9186
7
+ data.tar.gz: 379a3bb4cf943e9bedcc366364d2b749161e5349286d5b3910380c953f3db69dcb3d5b7416599101c2a661c04ff65a1ec8eec9a64950dbf803137071edf24a25
data/Gemfile CHANGED
@@ -3,7 +3,8 @@ source "http://rubygems.org"
3
3
 
4
4
  group :test do
5
5
  gem "rake"
6
- gem "jeweler"
6
+ # gem "jeweler"
7
+ gem "jeweler", git: 'git@github.com:technicalpickles/jeweler'
7
8
  gem "json_pure"
8
9
  gem "rspec", ">= 2.6.0"
9
10
  gem "rails", "~> 4.2.0"
@@ -27,6 +27,21 @@ Run the installation task:
27
27
 
28
28
  This will copy the default translation files, and for rails 3.0 it will also copy the needed assets (javascript files).
29
29
 
30
+ ### Rails 6
31
+
32
+ Add the componanion package
33
+
34
+ yarn add @nathanvda/on_the_spot
35
+
36
+ and then in your `app/javascripts/packs/application.js` you should add
37
+
38
+ require("jquery")
39
+ require("jquery-jeditable")
40
+ require("@nathanvda/on_the_spot")
41
+
42
+
43
+
44
+
30
45
  ### Rails 3.1+/4/5
31
46
 
32
47
  Add the following to application.js so it compiles to the asset_pipeline
@@ -128,6 +143,8 @@ The `on_the_spot_edit` also accepts options:
128
143
  * `:cancel_text` : the text for the cancel-button
129
144
  * `:display_text`: if you want to overrule the displayed text, especially useful when using your own `:url` or `:loadurl`
130
145
  * `:tooltip` : the tooltip-text
146
+ * `:form_css`: the css class for the form
147
+ * `:input_css`: the css class for the input itself
131
148
  * `:rows`: for textarea, the number of rows, defaults to 5
132
149
  * `:columns`: for textarea, the number of columns, defaults to 40
133
150
  * `:data`: for select, the lookup-data, should be in an array of id-value pairs. E.g. `[[1, 'ok'], [2, 'not ok'], [3, 'not decided']]`.
@@ -142,7 +159,21 @@ The `on_the_spot_edit` also accepts options:
142
159
  * `:onblur`: accepts `cancel`, `submit` or `ignore` changes the behavior of the onblur handler accordingly
143
160
 
144
161
 
145
- For the texts: if a text is not specified, the default is taken from the `on_the_spot.en.yml` (or your current language).
162
+ For the texts and css classes: if a text is not specified, the default is taken from the `on_the_spot.en.yml` (or your current language).
163
+
164
+ E.g. in the translations file `on_the_spot.en.yml` you could do the following to get the inline editor look good when using bootstrap:
165
+
166
+ ```
167
+ en:
168
+ on_the_spot:
169
+ ok: <button class="btn btn-primary btn-sm">Ok</button>
170
+ cancel: <button class="btn btn-sm">Cancel</button>
171
+ tooltip: Click to edit ...
172
+ access_not_allowed: Access is not allowed
173
+ form_css: 'form form-inline'
174
+ input_css: 'form-control'
175
+ ```
176
+
146
177
 
147
178
  ## Styling
148
179
 
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require "rspec/core/rake_task"
4
+ require 'erb'
5
+ require 'JSON'
4
6
 
5
7
  begin
6
8
  require 'jeweler'
@@ -23,6 +25,51 @@ rescue LoadError
23
25
  end
24
26
 
25
27
 
28
+ require 'bundler/gem_tasks'
29
+
30
+ spec = Bundler.load_gemspec('./on_the_spot.gemspec')
31
+
32
+
33
+ npm_src_dir = './npm'
34
+ npm_dest_dir = './dist'
35
+ CLOBBER.include 'dist'
36
+
37
+ assets_dir = './app/assets/'
38
+
39
+ npm_files = {
40
+ File.join(npm_dest_dir, 'on_the_spot_code.js') => File.join(assets_dir, 'javascripts', 'on_the_spot_code.js'),
41
+ File.join(npm_dest_dir, 'on_the_spot.css') => File.join(assets_dir, 'stylesheets', 'on_the_spot.css'),
42
+ File.join(npm_dest_dir, 'README.md') => File.join(npm_src_dir, 'README.md'),
43
+ File.join(npm_dest_dir, 'LICENSE') => './LICENSE'
44
+ }
45
+
46
+ namespace :npm do
47
+ npm_files.each do |dest, src|
48
+ file dest => src do
49
+ cp src, dest
50
+ end
51
+ end
52
+
53
+ task :'package-json' do
54
+ template = ERB.new(File.read(File.join(npm_src_dir, 'package.json.erb')))
55
+ content = template.result_with_hash(spec: spec)
56
+ File.write(File.join(npm_dest_dir, 'package.json'),
57
+ JSON.pretty_generate(JSON.parse(content)))
58
+ end
59
+
60
+ desc "Build nathanvda-on_the_spot-#{spec.version}.tgz into the pkg directory"
61
+ task build: (%i[package-json] + npm_files.keys) do
62
+ system("cd #{npm_dest_dir} && npm pack && mv ./nathanvda-on_the_spot-#{spec.version}.tgz ../pkg/")
63
+ end
64
+
65
+ desc "Build and push nathanvda-on_the_spot-#{spec.version}.tgz to https://npmjs.org"
66
+ task release: %i[build] do
67
+ system("npm publish ./pkg/nathanvda-on_the_spot-#{spec.version}.tgz --access public")
68
+ end
69
+ end
70
+
71
+
72
+
26
73
  RSpec::Core::RakeTask.new(:spec)
27
74
 
28
75
  task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.3
1
+ 1.1.4
@@ -1,26 +1,54 @@
1
- /**********************************************************************
2
- * Custom input types for the jquery.jeditable plugin
3
- * By Richard Davies <Richard__at__richarddavies.us>, 2009
4
- * By Peter Savichev (proton) <psavichev@gmail.com>, 2011
5
- *********************************************************************/
1
+ /**
2
+ * @file checkbox plugin for jquery-jeditable
3
+ * @author Mika Tuupola, Nicolas CARPi
4
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
5
+ * @licence MIT (see LICENCE file)
6
+ * @name PluginCheckbox
7
+ */
8
+ 'use strict';
9
+ (function ($) {
10
+ $.editable.addInputType('checkbox', {
11
+ element : function(settings, original) {
12
+ var input = $('<input type="checkbox">');
13
+ $(this).append(input);
6
14
 
7
- // Create a custom input type for checkboxes
8
- $.editable.addInputType("checkbox", {
9
- element : function(settings, original) {
10
- var input = $('<input type="checkbox">');
11
- $(this).append(input);
15
+ $(input).bind('click', function() {
16
+ if ($(input).val() === 'on') {
17
+ $(input).val('off');
18
+ $(input).removeAttr('checked');
19
+ } else {
20
+ $(input).val('on');
21
+ $(input).attr('checked', 'checked');
22
+ }
23
+ });
12
24
 
13
- $(input).change(function() {
14
- var value = $(input).is(":checked") ? 1 : 0;
25
+ return(input);
26
+ },
27
+
28
+ content : function(string, settings, original) {
29
+
30
+ var checked = (string === 'yes') ? 'on' : 'off';
31
+ var input = $(':input:first', this);
32
+
33
+ if (checked === 'on') {
34
+ $(input).attr('checked', checked);
35
+ } else {
36
+ $(input).removeAttr('checked');
37
+ }
38
+
39
+ var value = $(input).is(':checked') ? 'on' : 'off';
15
40
  $(input).val(value);
16
- });
17
- return(input);
18
- },
19
- content : function(string, settings, original) {
20
- var checked = (string == "true") ? 1 : 0;
21
- var input = $(':input:first', this);
22
- if(checked) $(input).attr("checked", "checked");
23
- else $(input).removeAttr("checked");
24
- $(input).val(checked);
25
- }
26
- });
41
+ },
42
+
43
+ submit: function (settings, original) {
44
+ var value;
45
+ var input = $(':input:first', this);
46
+ if (input.is(':checked')) {
47
+ value = '1';
48
+ } else {
49
+ value = '0';
50
+ }
51
+ $('input', this).val(value);
52
+ }
53
+ });
54
+ })(jQuery);
@@ -17,6 +17,7 @@
17
17
  * @param {Number} [options.cols] - Number of columns if using textarea
18
18
  * @param {String} [options.cssclass] - CSS class to apply to input form; use 'inherit' to copy from parent
19
19
  * @param {String} [options.inputcssclass] - CSS class to apply to input. 'inherit' to copy from parent
20
+ * @param {Function} [options.intercept] - Intercept the returned data so you have a chance to process it before returning it in the page
20
21
  * @param {String|Function} [options.data] - Content loaded in the form
21
22
  * @param {String} [options.event='click'] - jQuery event such as 'click' of 'dblclick'. See https://api.jquery.com/category/events/
22
23
  * @param {String} [options.formid] - Give an id to the form that is produced
@@ -46,6 +47,7 @@
46
47
  * @param {Boolean} [options.select] - When true text is selected
47
48
  * @param {Function} [options.showfn]- Function that can animate the element when switching to edit mode
48
49
  * @param {String} [options.size] - The size of the text field
50
+ * @param {String} [options.sortselectoptions] - Sort the options of a select form
49
51
  * @param {Number} [options.step] - Step size for number type
50
52
  * @param {String} [options.style] - Style to apply to input form; 'inherit' to copy from parent
51
53
  * @param {String} [options.submit] - submit button value, empty means no button
@@ -88,7 +90,7 @@
88
90
  }
89
91
  if ('destroy' === target) {
90
92
  $(this)
91
- .unbind($(this).data('event.editable'))
93
+ .off($(this).data('event.editable'))
92
94
  .removeData('disabled.editable')
93
95
  .removeData('event.editable');
94
96
  return;
@@ -135,7 +137,7 @@
135
137
  }
136
138
 
137
139
  // EVENT IS FIRED
138
- $(this).bind(settings.event, function(e) {
140
+ $(this).on(settings.event, function(e) {
139
141
 
140
142
  /* Abort if element is disabled. */
141
143
  if (true === $(this).data('disabled.editable')) {
@@ -143,7 +145,7 @@
143
145
  }
144
146
 
145
147
  // do nothing if user press Tab again, just go to next element, not into edit mode
146
- if (e.keyCode === 9) {
148
+ if (e.which === 9) {
147
149
  return;
148
150
  }
149
151
 
@@ -159,7 +161,7 @@
159
161
 
160
162
  /* execute the before function if any was specified */
161
163
  if (settings.before && jQuery.isFunction(settings.before)) {
162
- settings.before();
164
+ settings.before(e);
163
165
  } else if (settings.before && !jQuery.isFunction(settings.before)) {
164
166
  throw "The 'before' option needs to be provided as a function!";
165
167
  }
@@ -231,7 +233,7 @@
231
233
 
232
234
  // timeout function
233
235
  var t;
234
- var is_submitting = false;
236
+ var isSubmitting = false;
235
237
 
236
238
  if (settings.loadurl) {
237
239
  t = self.setTimeout(function() {
@@ -298,7 +300,7 @@
298
300
  plugin.apply(form, [settings, self]);
299
301
 
300
302
  /* Focus to first visible form element. */
301
- form.find(':input:visible:enabled:first').focus();
303
+ form.find(':input:visible:enabled:first').trigger('focus');
302
304
 
303
305
  /* Highlight input contents when requested. */
304
306
  if (settings.select) {
@@ -306,30 +308,35 @@
306
308
  }
307
309
 
308
310
  /* discard changes if pressing esc */
309
- input.keydown(function(e) {
310
- if (e.keyCode === 27) {
311
+ $(this).on('keydown', function(e) {
312
+ if (e.which === 27) {
311
313
  e.preventDefault();
312
314
  reset.apply(form, [settings, self]);
315
+ /* allow shift+enter to submit form (required for textarea) */
316
+ } else if (e.which == 13 && e.shiftKey){
317
+ e.preventDefault();
318
+ form.trigger('submit');
313
319
  }
314
320
  });
315
321
 
316
322
  /* Discard, submit or nothing with changes when clicking outside. */
317
323
  /* Do nothing is usable when navigating with tab. */
318
324
  if ('cancel' === settings.onblur) {
319
- input.blur(function(e) {
325
+ input.on('blur', function(e) {
320
326
  /* Prevent canceling if submit was clicked. */
321
327
  t = self.setTimeout(function() {
322
328
  reset.apply(form, [settings, self]);
323
329
  }, 500);
324
330
  });
325
331
  } else if ('submit' === settings.onblur) {
326
- input.blur(function(e) {
332
+ input.on('blur', function(e) {
327
333
  /* Prevent double submit if submit was clicked. */
328
- console.log("BLUR submitting");
329
- form.submit();
334
+ t = self.setTimeout(function() {
335
+ form.trigger('submit');
336
+ }, 200);
330
337
  });
331
338
  } else if ($.isFunction(settings.onblur)) {
332
- input.blur(function(e) {
339
+ input.on('blur', function(e) {
333
340
  // reset the form if the onblur function returns false
334
341
  if (false === settings.onblur.apply(self, [input.val(), settings, form])) {
335
342
  reset.apply(form, [settings, self]);
@@ -337,18 +344,17 @@
337
344
  });
338
345
  }
339
346
 
340
- form.submit(function(e) {
341
- console.log("Form.submit");
347
+ form.on('submit', function(e) {
342
348
 
343
349
  /* Do no submit. */
344
350
  e.preventDefault();
345
351
  e.stopPropagation();
346
352
 
347
- if (is_submitting) {
348
- console.log("...we are already submitting .. stop!");
353
+ if (isSubmitting) {
354
+ // we are already submitting! Stop right here.
349
355
  return false;
350
356
  } else {
351
- is_submitting = true;
357
+ isSubmitting = true;
352
358
  }
353
359
 
354
360
  if (t) {
@@ -357,27 +363,32 @@
357
363
 
358
364
  /* Call before submit hook. */
359
365
  /* If it returns false abort submitting. */
360
- if (false !== onsubmit.apply(form, [settings, self])) {
366
+ isSubmitting = false !== onsubmit.apply(form, [settings, self]);
367
+ if (isSubmitting) {
361
368
  /* Custom inputs call before submit hook. */
362
369
  /* If it returns false abort submitting. */
363
- if (false !== submit.apply(form, [settings, self])) {
370
+ isSubmitting = false !== submit.apply(form, [settings, self]);
371
+ if (isSubmitting) {
364
372
 
365
373
  /* Check if given target is function */
366
374
  if ($.isFunction(settings.target)) {
367
375
  /* Callback function to handle the target reponse */
368
- var responseHandler = function(value) {
369
- $(self).html(value);
370
- self.editing = false;
371
- callback.apply(self, [self.innerHTML, settings]);
372
- if (!$.trim($(self).html())) {
373
- $(self).html(settings.placeholder);
376
+ var responseHandler = function(value, complete) {
377
+ isSubmitting = false;
378
+ if (false !== complete) {
379
+ $(self).html(value);
380
+ self.editing = false;
381
+ callback.apply(self, [self.innerText, settings]);
382
+ if (!$.trim($(self).html())) {
383
+ $(self).html(settings.placeholder);
384
+ }
374
385
  }
375
386
  };
376
387
  /* Call the user target function */
377
388
  var userTarget = settings.target.apply(self, [input.val(), settings, responseHandler]);
378
389
  /* Handle the target function return for compatibility */
379
390
  if (false !== userTarget && undefined !== userTarget) {
380
- responseHandler(userTarget);
391
+ responseHandler(userTarget, userTarget);
381
392
  }
382
393
 
383
394
  } else {
@@ -403,6 +414,9 @@
403
414
  /* Defaults for ajaxoptions. */
404
415
  var ajaxoptions = {
405
416
  type : 'POST',
417
+ complete: function (xhr, status) {
418
+ isSubmitting = false;
419
+ },
406
420
  data : submitdata,
407
421
  dataType: 'html',
408
422
  url : settings.target,
@@ -446,7 +460,7 @@
446
460
  if (self.editing) {
447
461
  /* Before reset hook, if it returns false abort reseting. */
448
462
  if (false !== onreset.apply(form, [settings, self])) {
449
- $(self).html(self.revert);
463
+ $(self).text(self.revert);
450
464
  self.editing = false;
451
465
  if (!$.trim($(self).html())) {
452
466
  $(self).html(settings.placeholder);
@@ -462,7 +476,7 @@
462
476
  // DESTROY
463
477
  self.destroy = function(form) {
464
478
  $(self)
465
- .unbind($(self).data('event.editable'))
479
+ .off($(self).data('event.editable'))
466
480
  .removeData('disabled.editable')
467
481
  .removeData('event.editable');
468
482
 
@@ -504,7 +518,6 @@
504
518
 
505
519
  // SETTIMEOUT
506
520
  self.setTimeout = function(callback, time) {
507
- console.log("SELF :: setTimeout");
508
521
  var timeouts = $(self).data('timeouts');
509
522
  var t = setTimeout(function() {
510
523
  callback();
@@ -550,12 +563,9 @@
550
563
  if (settings.submit) {
551
564
  /* If given html string use that. */
552
565
  if (settings.submit.match(/>$/)) {
553
- submit = $(settings.submit).click(function(e) {
554
- e.stopPropagation();
555
- e.preventDefault();
566
+ submit = $(settings.submit).on('click', function() {
556
567
  if (submit.attr('type') !== 'submit') {
557
- console.log("submit button clicked ... ");
558
- form.submit();
568
+ form.trigger('submit');
559
569
  }
560
570
  });
561
571
  /* Otherwise use button with given string as text. */
@@ -583,7 +593,7 @@
583
593
  }
584
594
  $(this).append(cancel);
585
595
 
586
- $(cancel).click(function(event) {
596
+ $(cancel).on('click', function(event) {
587
597
  var reset;
588
598
  if ($.isFunction($.editable.types[settings.type].reset)) {
589
599
  reset = $.editable.types[settings.type].reset;
@@ -678,16 +688,29 @@
678
688
  // Create tuples for sorting
679
689
  var tuples = [];
680
690
  var key;
681
- for (key in json) {
682
- tuples.push([key, json[key]]); // Store: [key, value]
691
+
692
+ if (Array.isArray(json) && json.every(Array.isArray)) {
693
+ // Process list of tuples
694
+ tuples = json // JSON already contains list of [key, value]
695
+ json = {};
696
+ tuples.forEach(function(e) {
697
+ json[e[0]] = e[1]; // Recreate json object to comply with following code
698
+ });
699
+ } else {
700
+ // Process object
701
+ for (key in json) {
702
+ tuples.push([key, json[key]]); // Store: [key, value]
703
+ }
683
704
  }
684
- // sort it
685
- //tuples.sort(function(a, b) {
686
- // a = a[1];
687
- // b = b[1];
688
- // return a < b ? -1 : (a > b ? 1 : 0);
689
- //});
690
705
 
706
+ if (settings.sortselectoptions) {
707
+ // sort it
708
+ tuples.sort(function (a, b) {
709
+ a = a[1];
710
+ b = b[1];
711
+ return a < b ? -1 : (a > b ? 1 : 0);
712
+ });
713
+ }
691
714
  // now add the options to our select
692
715
  var option;
693
716
  for (var i = 0; i < tuples.length; i++) {
@@ -700,21 +723,21 @@
700
723
 
701
724
  if (key !== 'selected') {
702
725
  option = $('<option />').val(key).append(value);
703
- }
704
726
 
705
- // add the selected prop if it's the same as original or if the key is 'selected'
706
- if (json['selected'] === key || key === $.trim(original.revert)) {
707
- $(option).prop('selected', value);
708
- }
727
+ // add the selected prop if it's the same as original or if the key is 'selected'
728
+ if (json.selected === key || key === $.trim(original.revert)) {
729
+ $(option).prop('selected', 'selected');
730
+ }
709
731
 
710
- $(this).find('select').append(option);
732
+ $(this).find('select').append(option);
733
+ }
711
734
  }
712
735
 
713
736
  // submit on change if no submit button defined
714
737
  if (!settings.submit) {
715
738
  var form = this;
716
739
  $(this).find('select').change(function() {
717
- form.submit();
740
+ form.trigger('submit');
718
741
  });
719
742
  }
720
743
  }
@@ -796,9 +819,10 @@
796
819
  loadtype : 'GET',
797
820
  loadtext : 'Loading...',
798
821
  placeholder: 'Click to edit',
822
+ sortselectoptions: false,
799
823
  loaddata : {},
800
824
  submitdata : {},
801
825
  ajaxoptions: {}
802
826
  };
803
827
 
804
- })(jQuery);
828
+ })(jQuery);
@@ -29,6 +29,8 @@ function initializeOnTheSpot(n){
29
29
  ok_text = el.attr('data-ok') || 'OK',
30
30
  cancel_text = el.attr('data-cancel') || 'Cancel',
31
31
  tooltip_text = el.attr('data-tooltip') || 'Click to edit ...',
32
+ form_css = el.attr('data-form-css'),
33
+ input_css = el.attr('data-input-css'),
32
34
  edit_type = el.attr('data-edittype'),
33
35
  select_data = el.attr('data-select'),
34
36
  rows = el.attr('data-rows'),
@@ -45,6 +47,8 @@ function initializeOnTheSpot(n){
45
47
  placeholder: tooltip_text,
46
48
  cancel: cancel_text,
47
49
  submit: ok_text,
50
+ cssclass: form_css,
51
+ inputcssclass: input_css,
48
52
  select: selected,
49
53
  onerror: function (settings, original, xhr) {
50
54
  original.reset();
@@ -6,7 +6,7 @@ module OnTheSpot
6
6
 
7
7
  #def download_jeditable
8
8
  # # Downloading latest jEditable
9
- # get "http://www.appelsiini.net/download/jquery.jeditable.mini.js", "public/javascripts/jquery.jeditable.mini.js"
9
+ # get "http://www.appelsiini.net/download/jquery.jeditable.js", "public/javascripts/jquery.jeditable.mini.js"
10
10
  #end
11
11
 
12
12
  def copy_javascripts
@@ -14,9 +14,9 @@ module OnTheSpot
14
14
  #puts "The javascripts do not need to be installed since Rails 3.1"
15
15
  else
16
16
  copy_file "../../../../../app/assets/javascripts/on_the_spot_code.js", "public/javascripts/on_the_spot.js"
17
- copy_file "../../../../../app/assets/javascripts/jquery.jeditable.mini.js", "public/javascripts/jquery.jeditable.mini.js"
17
+ copy_file "../../../../../app/assets/javascripts/jquery.jeditable.js", "public/javascripts/jquery.jeditable.js"
18
18
  copy_file "../../../../../app/assets/javascripts/jquery.jeditable.checkbox.js", "public/javascripts/jquery.jeditable.checkbox.js"
19
- copy_file "../../../../../app/assets/css/on_the_spot.css", "public/stylesheets/on_the_spot.css"
19
+ copy_file "../../../../../app/assets/stylesheets/on_the_spot.css", "public/stylesheets/on_the_spot.css"
20
20
  end
21
21
  end
22
22
 
@@ -27,4 +27,4 @@ module OnTheSpot
27
27
 
28
28
  end
29
29
  end
30
- end
30
+ end
@@ -23,6 +23,8 @@ module OnTheSpot
23
23
  options.reverse_merge!(:ok_text => t('on_the_spot.ok'),
24
24
  :cancel_text => t('on_the_spot.cancel'),
25
25
  :tooltip => t('on_the_spot.tooltip'),
26
+ :form_css => t('on_the_spot.form_css'),
27
+ :input_css => t('on_the_spot.input_css'),
26
28
  :rows => 5,
27
29
  :columns => 40,
28
30
  :url => {:action => 'update_attribute_on_the_spot'}
@@ -58,6 +60,8 @@ module OnTheSpot
58
60
  html_options[:'data-onblur'] = options[:onblur] if options[:onblur] && ['cancel','submit', 'ignore'].include?(options[:onblur])
59
61
  html_options[:'data-loadurl'] = options[:loadurl] unless options[:loadurl].nil?
60
62
  html_options[:'data-display-method'] = options[:display_method] unless options[:display_method].nil?
63
+ html_options[:'data-form-css'] = options[:form_css] if options[:form_css].present?
64
+ html_options[:'data-input-css'] = options[:input_css] if options[:input_css].present?
61
65
  if html_options[:'data-display-method'].present? && html_options[:'data-loadurl'].nil?
62
66
  html_options[:'data-loadurl'] = url_for(:action => 'get_attribute_on_the_spot')
63
67
  end
@@ -0,0 +1,6 @@
1
+ # on_the_spot
2
+
3
+ On-the-spot is the companion javascripts code for the
4
+ rails gem [on_the_spot](https://github.com/nathanvda/on_the_spot)
5
+ which offers in-place-editing. This code depends on jQuery.
6
+
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@nathanvda/on_the_spot",
3
+ "version": "<%= spec.version %>",
4
+ "license": "MIT",
5
+
6
+ "description": "Companion package for the on_the_spot Ruby gem.",
7
+ "homepage": "https://github.com/nathanvda/on_the_spot",
8
+ "repository": "https://github.com/nathanvda/on_the_spot",
9
+ "bugs": {
10
+ "url": "https://github.com/nathanvda/on_the_spot/issues"
11
+ },
12
+
13
+ "author": "nathan@dixis.com",
14
+
15
+ "main": "on_the_spot_code.js",
16
+ "files": ["on_the_spot_code.js", "on_the_spot.css", "README", "LICENSE", "package.json"],
17
+
18
+ "dependencies": {
19
+ "jquery": "^3.3.1",
20
+ "jquery-jeditable": "^2.0.16"
21
+ }
22
+ }
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: on_the_spot 1.1.3 ruby lib
5
+ # stub: on_the_spot 1.1.4 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "on_the_spot".freeze
9
- s.version = "1.1.3"
9
+ s.version = "1.1.4"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Nathan Van der Auwera".freeze]
14
- s.date = "2019-10-21"
14
+ s.date = "2020-04-27"
15
15
  s.description = "Unobtrusive in place editing, using jEditable; only works in Rails 3".freeze
16
16
  s.email = "nathan@dixis.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -29,12 +29,11 @@ Gem::Specification.new do |s|
29
29
  "README.markdown",
30
30
  "Rakefile",
31
31
  "VERSION",
32
- "app/assets/css/on_the_spot.css",
33
32
  "app/assets/javascripts/jquery.jeditable.checkbox.js",
34
33
  "app/assets/javascripts/jquery.jeditable.js",
35
- "app/assets/javascripts/jquery.jeditable.mini.js",
36
34
  "app/assets/javascripts/on_the_spot.js",
37
35
  "app/assets/javascripts/on_the_spot_code.js",
36
+ "app/assets/stylesheets/on_the_spot.css",
38
37
  "lib/generators/on_the_spot/install/install_generator.rb",
39
38
  "lib/generators/on_the_spot/install/templates/jquery.jeditable.mini.js",
40
39
  "lib/generators/on_the_spot/install/templates/on_the_spot.en.yml",
@@ -43,6 +42,8 @@ Gem::Specification.new do |s|
43
42
  "lib/on_the_spot.rb",
44
43
  "lib/on_the_spot/controller_extension.rb",
45
44
  "lib/on_the_spot/on_the_spot_helpers.rb",
45
+ "npm/README.md",
46
+ "npm/package.json.erb",
46
47
  "on_the_spot.gemspec",
47
48
  "spec/dummy/Rakefile",
48
49
  "spec/dummy/app/controllers/application_controller.rb",
@@ -84,7 +85,7 @@ Gem::Specification.new do |s|
84
85
  ]
85
86
  s.homepage = "http://github.com/nathanvda/on_the_spot".freeze
86
87
  s.licenses = ["MIT".freeze]
87
- s.rubygems_version = "2.7.10".freeze
88
+ s.rubygems_version = "3.0.8".freeze
88
89
  s.summary = "unobtrusive in place editing".freeze
89
90
 
90
91
  if s.respond_to? :specification_version then
@@ -29,7 +29,7 @@ describe OnTheSpot::Generators::InstallGenerator do
29
29
  expect(test_version).to eq(false)
30
30
  end
31
31
 
32
- ['on_the_spot.js', 'jquery.jeditable.mini.js', 'jquery.jeditable.checkbox.js'].each do |js_file|
32
+ ['on_the_spot.js', 'jquery.jeditable.js', 'jquery.jeditable.checkbox.js'].each do |js_file|
33
33
  it "copies #{js_file} to the correct folder" do
34
34
  assert_file "public/javascripts/#{js_file}"
35
35
  end
@@ -49,7 +49,7 @@ describe OnTheSpot::Generators::InstallGenerator do
49
49
  run_generator
50
50
  end
51
51
 
52
- ['on_the_spot.js', 'jquery.jeditable.mini.js', 'jquery.jeditable.checkbox.js'].each do |js_file|
52
+ ['on_the_spot.js', 'jquery.jeditable.js', 'jquery.jeditable.checkbox.js'].each do |js_file|
53
53
  it "does not copy #{js_file}" do
54
54
  assert_no_file "public/javascripts/#{js_file}"
55
55
  end
@@ -61,4 +61,4 @@ describe OnTheSpot::Generators::InstallGenerator do
61
61
  end
62
62
  end
63
63
 
64
- end
64
+ end
@@ -55,6 +55,8 @@ RSpec.describe "OnTheSpot" do
55
55
  expect(@tester).to receive(:t).with('on_the_spot.ok').and_return("ok")
56
56
  expect(@tester).to receive(:t).with('on_the_spot.cancel').and_return("cancel")
57
57
  expect(@tester).to receive(:t).with('on_the_spot.tooltip').and_return("tooltip")
58
+ expect(@tester).to receive(:t).with('on_the_spot.form_css').and_return(nil)
59
+ expect(@tester).to receive(:t).with('on_the_spot.input_css').and_return(nil)
58
60
  end
59
61
 
60
62
  context "with standard route" do
@@ -168,3 +170,4 @@ RSpec.describe "OnTheSpot" do
168
170
  end
169
171
  end
170
172
  end
173
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: on_the_spot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Van der Auwera
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-21 00:00:00.000000000 Z
11
+ date: 2020-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -70,12 +70,11 @@ files:
70
70
  - README.markdown
71
71
  - Rakefile
72
72
  - VERSION
73
- - app/assets/css/on_the_spot.css
74
73
  - app/assets/javascripts/jquery.jeditable.checkbox.js
75
74
  - app/assets/javascripts/jquery.jeditable.js
76
- - app/assets/javascripts/jquery.jeditable.mini.js
77
75
  - app/assets/javascripts/on_the_spot.js
78
76
  - app/assets/javascripts/on_the_spot_code.js
77
+ - app/assets/stylesheets/on_the_spot.css
79
78
  - lib/generators/on_the_spot/install/install_generator.rb
80
79
  - lib/generators/on_the_spot/install/templates/jquery.jeditable.mini.js
81
80
  - lib/generators/on_the_spot/install/templates/on_the_spot.en.yml
@@ -84,6 +83,8 @@ files:
84
83
  - lib/on_the_spot.rb
85
84
  - lib/on_the_spot/controller_extension.rb
86
85
  - lib/on_the_spot/on_the_spot_helpers.rb
86
+ - npm/README.md
87
+ - npm/package.json.erb
87
88
  - on_the_spot.gemspec
88
89
  - spec/dummy/Rakefile
89
90
  - spec/dummy/app/controllers/application_controller.rb
@@ -141,8 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
142
  - !ruby/object:Gem::Version
142
143
  version: '0'
143
144
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.7.10
145
+ rubygems_version: 3.0.8
146
146
  signing_key:
147
147
  specification_version: 4
148
148
  summary: unobtrusive in place editing
@@ -1,38 +0,0 @@
1
-
2
- (function($){$.fn.editable=function(target,options){if('disable'==target){$(this).data('disabled.editable',true);return;}
3
- if('enable'==target){$(this).data('disabled.editable',false);return;}
4
- if('destroy'==target){$(this).unbind($(this).data('event.editable')).removeData('disabled.editable').removeData('event.editable');return;}
5
- var settings=$.extend({},$.fn.editable.defaults,{target:target},options);var plugin=$.editable.types[settings.type].plugin||function(){};var submit=$.editable.types[settings.type].submit||function(){};var buttons=$.editable.types[settings.type].buttons||$.editable.types['defaults'].buttons;var content=$.editable.types[settings.type].content||$.editable.types['defaults'].content;var element=$.editable.types[settings.type].element||$.editable.types['defaults'].element;var reset=$.editable.types[settings.type].reset||$.editable.types['defaults'].reset;var callback=settings.callback||function(){};var onedit=settings.onedit||function(){};var onsubmit=settings.onsubmit||function(){};var onreset=settings.onreset||function(){};var onerror=settings.onerror||reset;if(settings.tooltip){$(this).attr('title',settings.tooltip);}
6
- settings.autowidth='auto'==settings.width;settings.autoheight='auto'==settings.height;return this.each(function(){var self=this;var savedwidth=$(self).width();var savedheight=$(self).height();$(this).data('event.editable',settings.event);if(!$.trim($(this).html())){$(this).html(settings.placeholder);}
7
- $(this).bind(settings.event,function(e){if(true===$(this).data('disabled.editable')){return;}
8
- if(self.editing){return;}
9
- if(false===onedit.apply(this,[settings,self])){return;}
10
- e.preventDefault();e.stopPropagation();if(settings.tooltip){$(self).removeAttr('title');}
11
- if(0==$(self).width()){settings.width=savedwidth;settings.height=savedheight;}else{if(settings.width!='none'){settings.width=settings.autowidth?$(self).width():settings.width;}
12
- if(settings.height!='none'){settings.height=settings.autoheight?$(self).height():settings.height;}}
13
- if($(this).html().toLowerCase().replace(/(;|")/g,'')==settings.placeholder.toLowerCase().replace(/(;|")/g,'')){$(this).html('');}
14
- self.editing=true;self.revert=$(self).html();$(self).html('');var form=$('<form />');if(settings.cssclass){if('inherit'==settings.cssclass){form.attr('class',$(self).attr('class'));}else{form.attr('class',settings.cssclass);}}
15
- if(settings.style){if('inherit'==settings.style){form.attr('style',$(self).attr('style'));form.css('display',$(self).css('display'));}else{form.attr('style',settings.style);}}
16
- var input=element.apply(form,[settings,self]);var input_content;if(settings.loadurl){var t=setTimeout(function(){input.disabled=true;content.apply(form,[settings.loadtext,settings,self]);},100);var loaddata={};loaddata[settings.id]=self.id;if($.isFunction(settings.loaddata)){$.extend(loaddata,settings.loaddata.apply(self,[self.revert,settings]));}else{$.extend(loaddata,settings.loaddata);}
17
- $.ajax({type:settings.loadtype,url:settings.loadurl,data:loaddata,async:false,success:function(result){window.clearTimeout(t);input_content=result;input.disabled=false;}});}else if(settings.data){input_content=settings.data;if($.isFunction(settings.data)){input_content=settings.data.apply(self,[self.revert,settings]);}}else{input_content=self.revert;}
18
- content.apply(form,[input_content,settings,self]);input.attr('name',settings.name);buttons.apply(form,[settings,self]);$(self).append(form);plugin.apply(form,[settings,self]);$(':input:visible:enabled:first',form).focus();if(settings.select){input.select();}
19
- input.keydown(function(e){if(e.keyCode==27){e.preventDefault();reset.apply(form,[settings,self]);}});var t;if('cancel'==settings.onblur){input.blur(function(e){t=setTimeout(function(){reset.apply(form,[settings,self]);},500);});}else if('submit'==settings.onblur){input.blur(function(e){t=setTimeout(function(){form.submit();},200);});}else if($.isFunction(settings.onblur)){input.blur(function(e){settings.onblur.apply(self,[input.val(),settings]);});}else{input.blur(function(e){});}
20
- form.submit(function(e){if(t){clearTimeout(t);}
21
- e.preventDefault();if(false!==onsubmit.apply(form,[settings,self])){if(false!==submit.apply(form,[settings,self])){if($.isFunction(settings.target)){var str=settings.target.apply(self,[input.val(),settings]);$(self).html(str);self.editing=false;callback.apply(self,[self.innerHTML,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}}else{var submitdata={};submitdata[settings.name]=input.val();submitdata[settings.id]=self.id;if($.isFunction(settings.submitdata)){$.extend(submitdata,settings.submitdata.apply(self,[self.revert,settings]));}else{$.extend(submitdata,settings.submitdata);}
22
- if('PUT'==settings.method){submitdata['_method']='put';}
23
- $(self).html(settings.indicator);var ajaxoptions={type:'POST',data:submitdata,dataType:'html',url:settings.target,success:function(result,status){if(ajaxoptions.dataType=='html'){$(self).html(result);}
24
- self.editing=false;callback.apply(self,[result,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}},error:function(xhr,status,error){onerror.apply(form,[settings,self,xhr]);}};$.extend(ajaxoptions,settings.ajaxoptions);$.ajax(ajaxoptions);}}}
25
- $(self).attr('title',settings.tooltip);return false;});});this.reset=function(form){if(this.editing){if(false!==onreset.apply(form,[settings,self])){$(self).html(self.revert);self.editing=false;if(!$.trim($(self).html())){$(self).html(settings.placeholder);}
26
- if(settings.tooltip){$(self).attr('title',settings.tooltip);}}}};});};$.editable={types:{defaults:{element:function(settings,original){var input=$('<input type="hidden"></input>');$(this).append(input);return(input);},content:function(string,settings,original){$(':input:first',this).val(string);},reset:function(settings,original){original.reset(this);},buttons:function(settings,original){var form=this;if(settings.submit){if(settings.submit.match(/>$/)){var submit=$(settings.submit).click(function(){if(submit.attr("type")!="submit"){form.submit();}});}else{var submit=$('<button type="submit" />');submit.html(settings.submit);}
27
- $(this).append(submit);}
28
- if(settings.cancel){if(settings.cancel.match(/>$/)){var cancel=$(settings.cancel);}else{var cancel=$('<button type="cancel" />');cancel.html(settings.cancel);}
29
- $(this).append(cancel);$(cancel).click(function(event){if($.isFunction($.editable.types[settings.type].reset)){var reset=$.editable.types[settings.type].reset;}else{var reset=$.editable.types['defaults'].reset;}
30
- reset.apply(form,[settings,original]);return false;});}}},text:{element:function(settings,original){var input=$('<input />');if(settings.width!='none'){input.width(settings.width);}
31
- if(settings.height!='none'){input.height(settings.height);}
32
- input.attr('autocomplete','off');$(this).append(input);return(input);}},textarea:{element:function(settings,original){var textarea=$('<textarea />');if(settings.rows){textarea.attr('rows',settings.rows);}else if(settings.height!="none"){textarea.height(settings.height);}
33
- if(settings.cols){textarea.attr('cols',settings.cols);}else if(settings.width!="none"){textarea.width(settings.width);}
34
- $(this).append(textarea);return(textarea);}},select:{element:function(settings,original){var select=$('<select />');$(this).append(select);return(select);},content:function(data,settings,original){if(String==data.constructor){eval('var json = '+data);}else{var json=data;}
35
- for(var key in json){if(!json.hasOwnProperty(key)){continue;}
36
- if('selected'==key){continue;}
37
- var option=$('<option />').val(key).append(json[key]);$('select',this).append(option);}
38
- $('select',this).children().each(function(){if($(this).val()==json['selected']||$(this).text()==$.trim(original.revert)){$(this).attr('selected','selected');}});}}},addInputType:function(name,input){$.editable.types[name]=input;}};$.fn.editable.defaults={name:'value',id:'id',type:'text',width:'auto',height:'auto',event:'click.editable',onblur:'cancel',loadtype:'GET',loadtext:'Loading...',placeholder:'Click to edit',loaddata:{},submitdata:{},ajaxoptions:{}};})(jQuery);