repertoire-faceting 0.7.0 → 0.7.2

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
  SHA1:
3
- metadata.gz: 0c71410502e44435a35e7cf549dda9c78c20419e
4
- data.tar.gz: b3f634a720ca6a81836543c9c8dca09a8e108826
3
+ metadata.gz: 5d3aadcd08762f8d0eb82f1b0a0a91f5866836f2
4
+ data.tar.gz: 3261f97f7058932bd1e0a1a424b2c869903b8c8f
5
5
  SHA512:
6
- metadata.gz: 36b6cf33096262214ed207969c97065c81c2712ed05aed8d944a36689b44ff4ad70ac19549c6a95867fc71f68c98d0d64fadbe8df3f1f1287912442173ed30ca
7
- data.tar.gz: 50358733e4533681470cfef9f93b12337f639e8c9056e068db302fd4ddbb5b0ab550597188707efff7db5fc47b416f40a47b4197594cfe3aee05ff9b7e54879c
6
+ metadata.gz: 1a6e1019f798bc2356afab1e5a2eec80b8dd289591a27095da38e296f86ea5c771008fb367be4869bab1ef2c1c2d009052c5a5c1cab55c93a4811dc35da1f705
7
+ data.tar.gz: d897d8d5aa4ba04e747d46b81a2fb1dc05451991f6c0222a8cdae1fefa1269cea2b8575c4b90b690c1543fbea5e014b18746d8fb0ed9bb3664b4bd7c9228a721
data/FAQ CHANGED
@@ -45,6 +45,34 @@
45
45
  == About the ajax faceting widgets
46
46
 
47
47
 
48
+ *Q* How to access the faceting API from a client on a different origin.
49
+
50
+ *A* This is easily done. Configure your rails project to accept CORS ajax GET requests, then configure the API server
51
+ name in repertoire.defaults.path_prefix :
52
+
53
+ $().ready(function() {
54
+ repertoire.defaults = { path_prefix: '<YOUR API SERVER>' };
55
+ ...
56
+
57
+ For future reference, here is how to enable CORS for rails. In your GEMFILE:
58
+
59
+ gem 'rack-cors', :require => 'rack/cors'
60
+
61
+ In your config.rb:
62
+
63
+ require 'rack/cors'
64
+ use Rack::Cors do
65
+
66
+ # allow get requests from all origins
67
+ allow do
68
+ origins '*'
69
+ resource '*',
70
+ :headers => :any,
71
+ :methods => [:get, :options]
72
+ end
73
+ end
74
+
75
+
48
76
  *Q* Rails is sending JSON data in a format that my javascript widgets don't understand.
49
77
 
50
78
  *A* Put the following line in config/application.rb:
data/TODO CHANGED
@@ -16,6 +16,9 @@ DESIRED FEATURES / IMPROVEMENTS.
16
16
 
17
17
  TODO
18
18
 
19
+ -- add info on CORS to FAQ DONE
20
+ -- ensure pushState respects repertoire.defaults.path_prefix DONE
21
+
19
22
  -- gemcutter release of new faceting gem
20
23
  -- revise example app to bundle gem DONE
21
24
  -- redeploy to bytea / varbit targets DONE
data/ext/Makefile CHANGED
@@ -8,7 +8,7 @@
8
8
  #
9
9
  #-------------------------------------------------------------------------
10
10
 
11
- API_VERSION = 0.7.0
11
+ API_VERSION = 0.7.2
12
12
 
13
13
  MODULES = signature/signature
14
14
  EXTENSION = signature/faceting \
@@ -2,5 +2,5 @@
2
2
 
3
3
  comment = 'API for faceted indexing and queries (based on plv8 + bytea bitmaps)'
4
4
  requires = 'plv8, plpgsql'
5
- default_version = '0.7.0'
5
+ default_version = '0.7.2'
6
6
  schema = 'facet'
@@ -2,5 +2,5 @@
2
2
 
3
3
  comment = 'API for faceted indexing and queries (based on custom C bitmap type)'
4
4
  requires = plpgsql
5
- default_version = '0.7.0'
5
+ default_version = '0.7.2'
6
6
  schema = 'facet'
@@ -3,5 +3,5 @@
3
3
  comment = 'API for faceted indexing and queries (based on builtin VARBIT bit strings)'
4
4
  requires = plpgsql
5
5
  superuser = false
6
- default_version = '0.7.0'
6
+ default_version = '0.7.2'
7
7
  schema = 'facet'
@@ -64,6 +64,16 @@ repertoire.facet_context = function(context_name, state_fn, options) {
64
64
  };
65
65
  };
66
66
 
67
+ //
68
+ // Register a facet in this context.
69
+ //
70
+ // Necessary so context knows which parameters to read from the
71
+ // search path on initial page load
72
+ //
73
+ self.register = function(facet) {
74
+ filter[facet] = filter[facet] || [];
75
+ }
76
+
67
77
  //
68
78
  // Calculate facet value counts from webservice
69
79
  //
@@ -90,14 +100,14 @@ repertoire.facet_context = function(context_name, state_fn, options) {
90
100
  // Convenience function for constructing faceting urls
91
101
  //
92
102
  self.facet_url = function(action, facet, ext, params) {
93
- var paths = [context_name, action]
103
+ var paths = [context_name, action];
94
104
  if (facet)
95
- paths.push(facet)
105
+ paths.push(facet);
96
106
  var url = self.default_url(paths, ext),
97
- search = '?' + self.to_query_string(params);
107
+ search = self.to_query_string(params);
98
108
 
99
- if (search != '?')
100
- return url + search
109
+ if (search)
110
+ return url + '?' + search;
101
111
  else
102
112
  return url;
103
113
  };
@@ -138,12 +148,17 @@ repertoire.facet_context = function(context_name, state_fn, options) {
138
148
  // (including any additional state defined by client app)
139
149
  //
140
150
  self.url = function() {
141
- var url = self.default_url([context_name]),
151
+ var prefix = options.url || '',
152
+ parts = [context_name];
153
+
154
+ parts.unshift(prefix);
155
+
156
+ var url = parts.join('/'),
142
157
  params = self.params(),
143
- search = '?' + self.to_query_string(params);
158
+ search = self.to_query_string(params);
144
159
 
145
- if (search != '?')
146
- return url + search;
160
+ if (search)
161
+ return url + '?' + search;
147
162
  else
148
163
  return url;
149
164
  }
@@ -117,6 +117,9 @@ repertoire.facet = function($facet, options) {
117
117
  self.is_selected = function(values, item) {
118
118
  return ($.inArray(item, values) > -1);
119
119
  };
120
+
121
+ // register this facet with the context
122
+ self.context().register(self.facet_name());
120
123
 
121
124
  // end of faceting widget factory method
122
125
  return self;
@@ -69,6 +69,7 @@ repertoire.model = function(options) {
69
69
  var spinnerClass = options.spinner || 'loading';
70
70
  if ($elem)
71
71
  $elem.addClass(spinnerClass);
72
+
72
73
  $.ajax({
73
74
  async: async,
74
75
  url: url,
@@ -97,7 +98,7 @@ repertoire.model = function(options) {
97
98
  var parts = default_parts.slice();
98
99
 
99
100
  parts.unshift(path_prefix);
100
- url = options.url || parts.join('/')
101
+ url = options.url || parts.join('/');
101
102
 
102
103
  if (ext)
103
104
  url += '.' + ext;
@@ -45,7 +45,7 @@ repertoire.widget = function(selector, options) {
45
45
  // register any custom handlers
46
46
  if (options.handlers !== undefined)
47
47
  register_handlers(options.handlers);
48
-
48
+
49
49
  // load once at beginning
50
50
  self.refresh();
51
51
  }
@@ -55,14 +55,27 @@ repertoire.widget = function(selector, options) {
55
55
  //
56
56
  // Integrates state and markup injectors
57
57
  //
58
+ // TODO. ajaxStamp and callbackStamp are used to accept only the most
59
+ // recent ajax sync for this widget. Better solution would be to wait
60
+ // until document.ready() has finished before initializing and refreshing
61
+ // any widgets; or use xhr.abort().
62
+ //
63
+ var ajaxStamp;
58
64
  self.refresh = function() {
59
- var callback;
65
+ var callback,
66
+ callbackStamp;
60
67
 
61
68
  // pass to custom state processor
62
69
  if (options.state !== undefined)
63
70
  options.state(self);
71
+
72
+ // adjust timestamp to most recent ajax call
73
+ ajaxStamp = callbackStamp = Date.now();
64
74
 
65
75
  callback = function() {
76
+ // reject if this is an old ajax request
77
+ if (callbackStamp < ajaxStamp) return;
78
+
66
79
  // render the widget
67
80
  var markup = self.render.apply(self, arguments);
68
81
 
@@ -1,5 +1,5 @@
1
1
  module Repertoire
2
2
  module Faceting #:nodoc:
3
- VERSION = "0.7.0"
3
+ VERSION = "0.7.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repertoire-faceting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher York
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-26 00:00:00.000000000 Z
11
+ date: 2014-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails