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 +4 -4
- data/FAQ +28 -0
- data/TODO +3 -0
- data/ext/Makefile +1 -1
- data/ext/bytea/faceting_bytea.control +1 -1
- data/ext/signature/faceting.control +1 -1
- data/ext/varbit/faceting_varbit.control +1 -1
- data/lib/assets/javascripts/rep.faceting/context.js +24 -9
- data/lib/assets/javascripts/rep.faceting/facet.js +3 -0
- data/lib/assets/javascripts/rep.widgets/model.js +2 -1
- data/lib/assets/javascripts/rep.widgets/widget.js +15 -2
- data/lib/repertoire-faceting/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d3aadcd08762f8d0eb82f1b0a0a91f5866836f2
|
4
|
+
data.tar.gz: 3261f97f7058932bd1e0a1a424b2c869903b8c8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
@@ -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 =
|
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
|
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 =
|
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
|
|
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.
|
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-
|
11
|
+
date: 2014-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|