populate-me 0.12.0 → 0.13.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2770ba89bcfa96ad56baafdf141c67891317044051f44b117a8e6b438f7c432
4
- data.tar.gz: f076278f23d91e5c59c141b39698c34a9083c5861ba01f41a3692d587bc0b73b
3
+ metadata.gz: 514291d44eb8b068db7c98d742dc8395a5a2821255ac31ba054522823f6c55d9
4
+ data.tar.gz: 5a5c76cec480ed1c057ee70d33a38f21f1bd536c3ca5eabfdbbf2bf1d14c4b3c
5
5
  SHA512:
6
- metadata.gz: f952a4160015147d54bab9a504f189613521e33342561e95ae33710cb2c3929a9a9512a96d6b0ed2812571a3faa7c972f3b550556884e44c9c0cd7df19922ed0
7
- data.tar.gz: cd10b6ec3d88432f6255803150c6c1b129b0ffab6a6736d92243238976cfbf295413ea5a1cd9251029edfd798cdead3ac98fcbf51cd3f415a0011702ada41c5b
6
+ metadata.gz: 72e7c460a58523cf8cd9a1e9dadba107f5bfa810ec552b93af0fe113d4bf98f0941cb168ac4323291ab5fee478c1d018ceaa017c2f4bf5ea3460ce6d0b4a4130
7
+ data.tar.gz: 41cf0a2e8705a2b184e3c840b001424cd4d69f00a447da72b89d2339ee0390a24b76c07e886b48127594ed73ad762e43560497097aa672dbc89ff2d7c9af2141
@@ -184,16 +184,20 @@ form {
184
184
  margin-bottom: 1em;
185
185
  }
186
186
 
187
- input[type=text], input[type=email],
187
+ input[type=text], input[type=email], input[type=search],
188
188
  textarea {
189
189
  border: 0px;
190
190
  color: #839496;
191
- background: #ffffff;
191
+ background-color: #ffffff;
192
192
  width: 400px;
193
193
  padding: 0.5em;
194
194
  font-size: 1em;
195
+ outline: 0;
196
+ }
197
+ input[type=text].search-items {
198
+ border-radius: 1em;
195
199
  }
196
- input[type=text]:focus, input[type=email]:focus,
200
+ input[type=text]:focus, input[type=email]:focus, input[type=email]:focus,
197
201
  textarea:focus {
198
202
  /* color: #002b36; */
199
203
  }
@@ -45,14 +45,18 @@
45
45
  root.busy = false;
46
46
  root.on('push.columnav', function(e,data,cb) {
47
47
  var $data = $("<li class='"+settings.column_class+"'>"+data+"</li>");
48
- root.append($data);
49
- new_column($data, root);
50
- var cb_object = {event:e,column:$data,container:root,settings:settings};
51
- root.animate({scrollLeft: root.width()},function(){
48
+ async function push_callback_stack() {
49
+ await root.append($data);
50
+ await new_column($data, root);
51
+ var cb_object = {event:e,column:$data,container:root,settings:settings};
52
+ await settings.on_push(cb_object);
53
+ if (typeof cb == 'function') await cb(cb_object);
52
54
  root.busy = false;
53
- settings.on_push(cb_object);
54
- if (typeof cb == 'function') cb(cb_object);
55
- });
55
+ root.find('> li:last-child').get(0).scrollIntoView({
56
+ behavior: 'smooth', inline: 'start'
57
+ });
58
+ }
59
+ push_callback_stack();
56
60
  });
57
61
  root.on('getandpush.columnav', function(e,url,cb) {
58
62
  $.get(url, function(data) {
@@ -63,7 +67,7 @@
63
67
  });
64
68
  });
65
69
  root.on('pop.columnav', function(e,removable,cb) {
66
- removable = removable || root.children().last();
70
+ removable = removable || root.find('> li:last-child');
67
71
  removable.css({visibility:'hidden'})
68
72
  .animate({width:0},function(){
69
73
  // Trick to make sure it runs only once
@@ -94,12 +94,24 @@ PopulateMe.make_sortable = function(selector,context) {
94
94
  });
95
95
  };
96
96
 
97
+ // Copy and restore column search.
98
+ // Used when saving pops the columns.
99
+ PopulateMe.copy_column_search = function(column) {
100
+ return column.find('.search-items').val();
101
+ };
102
+ PopulateMe.restore_column_search = function(column, value) {
103
+ if (value !== '' && column.data('qs')) {
104
+ column.find('.search-items').val(value);
105
+ column.data('qs').search(value);
106
+ }
107
+ };
108
+
97
109
  // Scroll to an element, possibly in a specific column.
98
110
  PopulateMe.scroll_to = function(el, column) {
99
111
  if (!column) {
100
112
  column = el.closest('.column');
101
113
  }
102
- column.animate({scrollTop: el.position().top});
114
+ el.get(0).scrollIntoView({ behavior: 'smooth'});
103
115
  };
104
116
 
105
117
  // Mark errors for report after form validation.
@@ -162,33 +174,54 @@ PopulateMe.jsValidationsPassed = function(context) {
162
174
  // in case you have things to put in your custom javascript.
163
175
  PopulateMe.init_column = function(c) {
164
176
 
177
+ var documents = $('.documents', c);
178
+
165
179
  // Sort list item
166
- PopulateMe.make_sortable('.documents',c).bind('sortupdate', function(e, ui) {
167
- var list = $(ui.item).closest('.documents');
168
- var ids = list.children().map(function() {
169
- return $(this).data().id;
170
- }).get();
171
- $.ajax({
172
- url: list.data().sortUrl,
173
- type: 'put',
174
- data: {
175
- action: 'sort',
176
- field: list.data().sortField,
177
- ids: ids
178
- }
180
+ if (documents.data('sort-field') !== '') {
181
+ PopulateMe.make_sortable(documents).bind('sortupdate', function(e, ui) {
182
+ var list = $(ui.item).closest('.documents');
183
+ var ids = list.children().map(function() {
184
+ return $(this).data().id;
185
+ }).get();
186
+ $.ajax({
187
+ url: list.data().sortUrl,
188
+ type: 'put',
189
+ data: {
190
+ action: 'sort',
191
+ field: list.data().sortField,
192
+ ids: ids
193
+ }
194
+ });
195
+ /*
196
+ ui.item contains the current dragged element.
197
+ ui.item.index() contains the new index of the dragged element
198
+ ui.oldindex contains the old index of the dragged element
199
+ ui.startparent contains the element that the dragged item comes from
200
+ ui.endparent contains the element that the dragged item was added to
201
+ */
179
202
  });
180
- /*
181
- ui.item contains the current dragged element.
182
- ui.item.index() contains the new index of the dragged element
183
- ui.oldindex contains the old index of the dragged element
184
- ui.startparent contains the element that the dragged item comes from
185
- ui.endparent contains the element that the dragged item was added to
186
- */
187
- });
203
+ }
188
204
 
189
205
  // Sort nested documents
190
206
  PopulateMe.make_sortable('.nested-documents',c);
191
207
 
208
+ $('.search-items', c).each(function() {
209
+ var field = $(this)
210
+ var qs = field.quicksearch($('.admin-list-item', c), {
211
+ selector: '.item-title',
212
+ onAfter: function() {
213
+ if (documents.is('.ui-sortable')) {
214
+ if (field.val() == '') {
215
+ documents.sortable('enable');
216
+ } else {
217
+ documents.sortable('disable');
218
+ }
219
+ }
220
+ }
221
+ });
222
+ c.data('qs', qs);
223
+ });
224
+
192
225
  // Init textareas
193
226
  $('textarea',c).trigger('input');
194
227
 
@@ -285,11 +318,14 @@ $(function() {
285
318
  contentType: false,
286
319
  success: function(res) {
287
320
  if (res.success==true) {
288
- var reloader = PopulateMe.finder.find('> li:nth-last-child(3) .selected')
321
+ var reloader = PopulateMe.finder.find('> li:nth-last-child(3) .selected');
289
322
  if (reloader.size()>0) {
323
+ var reloadee = PopulateMe.finder.find('> li:nth-last-child(2)');
324
+ var current_search = PopulateMe.copy_column_search(reloadee);
290
325
  reloader.trigger('click.columnav',[function(cb_object) {
291
- var target = $('[data-id='+res.data.id+']', cb_object.column);
326
+ var target = $('[data-id='+res.data._id+']', cb_object.column);
292
327
  if (target.size()>0) {
328
+ PopulateMe.restore_column_search(cb_object.column, current_search);
293
329
  PopulateMe.scroll_to(target, cb_object.column);
294
330
  }
295
331
  }]);
@@ -0,0 +1 @@
1
+ (function($,window,document,undefined){$.fn.quicksearch=function(target,opt){var timeout,cache,rowcache,jq_results,val="",e=this,options=$.extend({delay:100,selector:null,stripeRows:null,loader:null,noResults:"",matchedResultsCount:0,bind:"keyup",onBefore:function(){return},onAfter:function(){return},show:function(){this.style.display=""},hide:function(){this.style.display="none"},prepareQuery:function(val){return val.toLowerCase().split(" ")},testQuery:function(query,txt,_row){for(var i=0;i<query.length;i+=1){if(txt.indexOf(query[i])===-1){return false}}return true}},opt);this.go=function(){var i=0,numMatchedRows=0,noresults=true,query=options.prepareQuery(val),val_empty=val.replace(" ","").length===0;for(var i=0,len=rowcache.length;i<len;i++){if(val_empty||options.testQuery(query,cache[i],rowcache[i])){options.show.apply(rowcache[i]);noresults=false;numMatchedRows++}else{options.hide.apply(rowcache[i])}}if(noresults){this.results(false)}else{this.results(true);this.stripe()}this.matchedResultsCount=numMatchedRows;this.loader(false);options.onAfter();return this};this.search=function(submittedVal){val=submittedVal;e.trigger()};this.currentMatchedResults=function(){return this.matchedResultsCount};this.stripe=function(){if(typeof options.stripeRows==="object"&&options.stripeRows!==null){var joined=options.stripeRows.join(" ");var stripeRows_length=options.stripeRows.length;jq_results.not(":hidden").each(function(i){$(this).removeClass(joined).addClass(options.stripeRows[i%stripeRows_length])})}return this};this.strip_html=function(input){var output=input.replace(new RegExp("<[^<]+>","g"),"");output=$.trim(output.toLowerCase());return output};this.results=function(bool){if(typeof options.noResults==="string"&&options.noResults!==""){if(bool){$(options.noResults).hide()}else{$(options.noResults).show()}}return this};this.loader=function(bool){if(typeof options.loader==="string"&&options.loader!==""){bool?$(options.loader).show():$(options.loader).hide()}return this};this.cache=function(){jq_results=$(target);if(typeof options.noResults==="string"&&options.noResults!==""){jq_results=jq_results.not(options.noResults)}var t=typeof options.selector==="string"?jq_results.find(options.selector):$(target).not(options.noResults);cache=t.map(function(){return e.strip_html(this.innerHTML)});rowcache=jq_results.map(function(){return this});val=val||this.val()||"";return this.go()};this.trigger=function(){this.loader(true);options.onBefore();window.clearTimeout(timeout);timeout=window.setTimeout(function(){e.go()},options.delay);return this};this.cache();this.results(true);this.stripe();this.loader(false);return this.each(function(){$(this).on(options.bind,function(){val=$(this).val();e.trigger()})})}})(jQuery,this,document);
@@ -46,6 +46,9 @@
46
46
  {{/is_polymorphic}}
47
47
  <a href="<%= request.script_name %>/form/{{dasherized_class_name}}{{#new_data}}?{{new_data}}{{/new_data}}" class='column-push new-document-btn' title='Create'>+</a>
48
48
  </p>
49
+ <form class='form-search-items'>
50
+ <input type='text' class='search-items' placeholder='Search'>
51
+ </form>
49
52
  <ol class='documents {{#grid_view}}grid{{/grid_view}}' data-sort-field='{{sort_field}}' data-sort-url='<%= request.script_name %>/api/{{dasherized_class_name}}'>
50
53
  {{#items}}{{#custom_partial_or_default}}template_document{{/custom_partial_or_default}}{{/items}}
51
54
  </ol>
@@ -57,7 +60,7 @@
57
60
  <button type='button' class='admin-delete' title='Delete' value='<%= request.script_name %>/api/{{admin_url}}'>&times;</button>
58
61
  </header>
59
62
  <a href="<%= request.script_name %>/form/{{admin_url}}" class='column-push' title='Edit'>
60
- {{title}}
63
+ <span class='item-title'>{{title}}</span>
61
64
  {{#image_url}}
62
65
  <br />
63
66
  <img src='{{image_url}}{{cache_buster}}' alt='{{title}}' width='300' />
@@ -176,6 +179,7 @@
176
179
  <script src="<%= request.script_name %>/__assets__/js/columnav.js" type="text/javascript" charset="utf-8"></script>
177
180
  <%# <script src="<%= request.script_name %1>/__assets__/js/sortable.js" type="text/javascript" charset="utf-8"></script> %>
178
181
  <script src="<%= request.script_name %>/__assets__/js/asmselect.js" type="text/javascript" charset="utf-8"></script>
182
+ <script src="<%= request.script_name %>/__assets__/js/quicksearch.js" type="text/javascript" charset="utf-8"></script>
179
183
  <script type="text/javascript">
180
184
  window.admin_path = "<%= request.script_name %>";
181
185
  window.index_path = "<%= settings.index_path %>";
@@ -124,6 +124,7 @@ module PopulateMe
124
124
  end
125
125
  new_data = Rack::Utils.build_nested_query(data: o[:params][:filter])
126
126
  end
127
+ items = self.admin_find(query: query)
127
128
  {
128
129
  template: 'template_list',
129
130
  grid_view: self.settings[:grid_view]==true,
@@ -135,7 +136,7 @@ module PopulateMe
135
136
  sort_field: self.sort_field_for(o),
136
137
  # 'command_plus'=> !self.populate_config[:no_plus],
137
138
  # 'command_search'=> !self.populate_config[:no_search],
138
- items: self.admin_find(query: query).map do |d|
139
+ items: items.map do |d|
139
140
  d.to_admin_list_item(o)
140
141
  end
141
142
  }
@@ -1,4 +1,4 @@
1
1
  module PopulateMe
2
- VERSION = '0.12.0'
2
+ VERSION = '0.13.0'
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: populate-me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mickael Riga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-21 00:00:00.000000000 Z
11
+ date: 2020-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: web-utils
@@ -216,6 +216,7 @@ files:
216
216
  - lib/populate_me/admin/__assets__/js/jquery-ui.min.js
217
217
  - lib/populate_me/admin/__assets__/js/main.js
218
218
  - lib/populate_me/admin/__assets__/js/mustache.js
219
+ - lib/populate_me/admin/__assets__/js/quicksearch.js
219
220
  - lib/populate_me/admin/__assets__/js/sortable.js
220
221
  - lib/populate_me/admin/views/help.erb
221
222
  - lib/populate_me/admin/views/page.erb