rails_stackview 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -4
  3. data/lib/rails_stackview/version.rb +1 -1
  4. data/vendor/assets/README.md +16 -0
  5. data/vendor/assets/images/stackview/bookEnd-next.png +0 -0
  6. data/vendor/assets/images/stackview/bookEnd-prev.png +0 -0
  7. data/vendor/assets/images/stackview/gloss.png +0 -0
  8. data/vendor/assets/images/stackview/highGloss.png +0 -0
  9. data/vendor/assets/images/stackview/icon-globe.png +0 -0
  10. data/vendor/assets/images/stackview/icon-note.png +0 -0
  11. data/vendor/assets/images/stackview/nav.png +0 -0
  12. data/vendor/assets/images/stackview/placeholder.gif +0 -0
  13. data/vendor/assets/images/stackview/ribbonTab.png +0 -0
  14. data/vendor/assets/images/stackview/serials-edge.png +0 -0
  15. data/vendor/assets/images/stackview/serials.png +0 -0
  16. data/vendor/assets/images/stackview/superGloss.png +0 -0
  17. data/vendor/assets/javascripts/jquery.stackview.js +21 -0
  18. data/vendor/assets/javascripts/stackview/jquery.easing.1.3.js +205 -0
  19. data/vendor/assets/javascripts/stackview/jquery.stackview.base.js +561 -0
  20. data/vendor/assets/javascripts/stackview/jquery.stackview.infinite.js +46 -0
  21. data/vendor/assets/javascripts/stackview/jquery.stackview.ministack.js +33 -0
  22. data/vendor/assets/javascripts/stackview/jquery.stackview.navigation.js +71 -0
  23. data/vendor/assets/javascripts/stackview/jquery.stackview.stackcache.js +74 -0
  24. data/vendor/assets/javascripts/stackview/jquery.stackview.templates.js +31 -0
  25. data/vendor/assets/javascripts/stackview/microtemplating.js +40 -0
  26. data/vendor/assets/javascripts/stackview/types/book.js +184 -0
  27. data/vendor/assets/javascripts/stackview/types/my_plain.js +183 -0
  28. data/vendor/assets/javascripts/stackview/types/serial.js +40 -0
  29. data/vendor/assets/javascripts/stackview/types/soundrecording.js +42 -0
  30. data/vendor/assets/javascripts/stackview/types/videofilm.js +56 -0
  31. data/vendor/assets/javascripts/stackview/types/webpage.js +42 -0
  32. data/vendor/assets/stackview.sha +1 -0
  33. data/vendor/assets/stylesheets/stackview/_book.scss +66 -0
  34. data/vendor/assets/stylesheets/stackview/_heatmap.scss +154 -0
  35. data/vendor/assets/stylesheets/stackview/_ministack.scss +43 -0
  36. data/vendor/assets/stylesheets/stackview/_mixins.scss +100 -0
  37. data/vendor/assets/stylesheets/stackview/_navigation.scss +52 -0
  38. data/vendor/assets/stylesheets/stackview/_plain.scss +71 -0
  39. data/vendor/assets/stylesheets/stackview/_serial.scss +50 -0
  40. data/vendor/assets/stylesheets/stackview/_soundrecording.scss +83 -0
  41. data/vendor/assets/stylesheets/stackview/_videofilm.scss +74 -0
  42. data/vendor/assets/stylesheets/stackview/_webpage.scss +82 -0
  43. data/vendor/assets/stylesheets/stackview/jquery.stackview.scss +171 -0
  44. metadata +41 -1
@@ -0,0 +1,46 @@
1
+ /*
2
+ Stack View infinite scroll module:
3
+
4
+ This module uses the scroll position of a stack to determine when
5
+ to fire the base methods of next_page and prev_page.
6
+ */
7
+ (function($, undefined) {
8
+ var $d = $(document),
9
+ infinite;
10
+
11
+ /* Extend defaults */
12
+ $.extend(StackView.defaults, {
13
+ infiniteScrollDistance: 100
14
+ });
15
+
16
+ infinite = function(event) {
17
+ var $stack = $(event.target),
18
+ stack = $stack.data('stackviewObject'),
19
+ opts = stack.options,
20
+ $itemList, $items, opts, lastItemTop, triggerPoint, scrollCheck;
21
+
22
+ $itemList = $stack.find(opts.selectors.item_list);
23
+ $items = $stack.find(opts.selectors.item);
24
+
25
+ lastItemTop = $items.length ? $items.last().position().top : 0;
26
+ lastItemTop += $itemList.scrollTop();
27
+ triggerPoint = lastItemTop - $stack.height() - opts.infiniteScrollDistance;
28
+
29
+ scrollCheck = function() {
30
+ if (opts.search_type === 'loc_sort_order' &&
31
+ $itemList.scrollTop() <= opts.infiniteScrollDistance) {
32
+ $itemList.unbind('scroll.stackview');
33
+ $stack.stackView('prev_page');
34
+ }
35
+ else if ($itemList.scrollTop() >= triggerPoint) {
36
+ $itemList.unbind('scroll.stackview');
37
+ $stack.stackView('next_page');
38
+ }
39
+ };
40
+
41
+ $itemList.bind('scroll.stackview', scrollCheck);
42
+ scrollCheck();
43
+ };
44
+
45
+ $d.delegate('.stackview', 'stackview.pageload', infinite);
46
+ })(jQuery);
@@ -0,0 +1,33 @@
1
+ (function($, undefined) {
2
+ var $d = $(document),
3
+ StackView = window.StackView;
4
+
5
+ $.extend(true, StackView.defaults, {
6
+ classes: {
7
+ ministack: 'stackview-mini'
8
+ },
9
+
10
+ ministack: {
11
+ breakpoint: 220,
12
+ max_height_percentage: 100,
13
+ min_height_percentage: 80,
14
+ page_multiple: .08
15
+ }
16
+ });
17
+
18
+ $d.delegate('.stackview', 'stackview.init', function(event) {
19
+ var $stack = $(event.target),
20
+ stack = $stack.data('stackviewObject');
21
+
22
+ if ($stack.width() <= stack.options.ministack.breakpoint) {
23
+ $stack.addClass(stack.options.classes.ministack);
24
+ $.each([
25
+ 'max_height_percentage',
26
+ 'min_height_percentage',
27
+ 'page_multiple'
28
+ ], function(i, el) {
29
+ stack.options.book[el] = stack.options.ministack[el];
30
+ });
31
+ }
32
+ });
33
+ })(jQuery);
@@ -0,0 +1,71 @@
1
+ /*
2
+ Stack View navigation module
3
+
4
+ Adds clickable navigation to scroll through the stack, as well as
5
+ a # of items indicator.
6
+ */
7
+ (function($, undefined) {
8
+ var $d = $(document),
9
+ StackView = window.StackView;
10
+
11
+ $.extend(true, StackView.defaults, {
12
+ transitionDuration: 500,
13
+ transitionEasing: 'easeOutQuad',
14
+ navigationPercent: 80,
15
+ selectors: {
16
+ downstream: '.downstream',
17
+ upstream: '.upstream',
18
+ num_items: '.num-found span'
19
+ }
20
+ });
21
+
22
+ $d.delegate('.stackview', 'stackview.init', function(event) {
23
+ var $stack = $(event.target),
24
+ stack = $stack.data('stackviewObject'),
25
+ $items = $stack.find(stack.options.selectors.item_list),
26
+ delta = $stack.height() * stack.options.navigationPercent / 100;
27
+
28
+ stack.num_found_delta = 0;
29
+ $stack.prepend(tmpl(StackView.templates.navigation, {
30
+ empty: stack.options.search_type === 'loc_sort_order'
31
+ }));
32
+
33
+ $stack
34
+ .delegate(stack.options.selectors.downstream, 'click', function() {
35
+ $items.animate({
36
+ scrollTop: '+=' + delta
37
+ }, stack.options.transitionDuration, stack.options.transitionEasing);
38
+ return false;
39
+ })
40
+ .delegate(stack.options.selectors.upstream, 'click', function() {
41
+ $items.animate({
42
+ scrollTop: '-=' + delta
43
+ }, stack.options.transitionDuration, stack.options.transitionEasing);
44
+ return false;
45
+ });
46
+
47
+ }).delegate('.stackview', 'stackview.pageload', function(event, data) {
48
+ var $stack = $(event.target),
49
+ stack = $stack.data('stackviewObject'),
50
+ num_found = data.num_found ? parseInt(data.num_found, 10) : data.length,
51
+ num;
52
+
53
+ stack.num_found = num_found;
54
+ num = num_found + stack.num_found_delta;
55
+ $stack.find(stack.options.selectors.num_items).text(num);
56
+
57
+ }).delegate(
58
+ '.stackview',
59
+ 'stackview.itemadded stackview.itemremoved',
60
+ function(event) {
61
+ var $stack = $(event.target),
62
+ stack = $stack.data('stackviewObject'),
63
+ $items = $stack.find(stack.options.selectors.item),
64
+ num;
65
+
66
+ stack.num_found_delta += (event.namespace === 'itemadded' ? 1 : -1);
67
+ num = stack.num_found + stack.num_found_delta;
68
+ $stack.find(stack.options.selectors.num_items).text(num);
69
+ }
70
+ );
71
+ })(jQuery);
@@ -0,0 +1,74 @@
1
+ window.stackCache = (function(window, undefined){
2
+
3
+ var cache = {},
4
+
5
+ // "Borrowed" from Modernizr
6
+ use_localStorage = window.JSON && (function(){
7
+ try {
8
+ return ( 'localStorage' in window ) && window.localStorage !== null;
9
+ } catch(e) {
10
+ return false;
11
+ }
12
+ })();
13
+
14
+ // Expose these methods.
15
+ return {
16
+ set: set,
17
+ get: get,
18
+ remove: remove
19
+ };
20
+
21
+ // Set a key-value pair with optional TTL.
22
+ function set( key, value, ttl ) {
23
+ var expires = ttl && new Date( +new Date() + ttl * 1000 ),
24
+ obj = {
25
+ expires: +expires,
26
+ value: value
27
+ };
28
+
29
+ if ( use_localStorage ) {
30
+ try {
31
+ localStorage[ key ] = JSON.stringify( obj );
32
+ } catch(e) {
33
+ return e;
34
+ }
35
+ } else {
36
+ cache[ key ] = obj;
37
+ }
38
+ };
39
+
40
+ // Get a value if it exists and hasn't expired.
41
+ function get( key ) {
42
+ var obj,
43
+ val;
44
+
45
+ if ( use_localStorage ) {
46
+ obj = localStorage[ key ];
47
+ if ( obj ) {
48
+ obj = JSON.parse( obj );
49
+ }
50
+ } else {
51
+ obj = cache[ key ];
52
+ }
53
+
54
+ if ( obj ) {
55
+ if ( obj.expires && obj.expires < +new Date() ) {
56
+ remove( key );
57
+ } else {
58
+ val = obj.value;
59
+ }
60
+ }
61
+
62
+ return val;
63
+ };
64
+
65
+ // Remove a key-value pair.
66
+ function remove( key ) {
67
+ if ( use_localStorage ) {
68
+ localStorage.removeItem( key );
69
+ } else {
70
+ delete cache[ key ];
71
+ }
72
+ };
73
+
74
+ })(window);
@@ -0,0 +1,31 @@
1
+ (function(undefined) {
2
+ StackView.templates = {
3
+ scaffold: '\
4
+ <div class="ribbon"><%= ribbon %></div>\
5
+ <ul class="stack-items" />',
6
+
7
+ navigation: '\
8
+ <div class="stack-navigation<%= empty ? " empty" : ""%>">\
9
+ <div class="upstream">Up</div>\
10
+ <div class="num-found">\
11
+ <span></span><br />items\
12
+ </div>\
13
+ <div class="downstream">Down</div>\
14
+ </div>',
15
+
16
+ book: '\
17
+ <li class="stack-item stack-book heat<%= heat %>" style="width:<%= book_height %>; height:<%= book_thickness %>;">\
18
+ <a href="<%= link %>" target="_newtab">\
19
+ <span class="spine-text">\
20
+ <span class="spine-title"><%= title %></span>\
21
+ <span class="spine-author"><%= author %></span>\
22
+ </span>\
23
+ <span class="spine-year"><%= year %></span>\
24
+ <span class="stack-pages" />\
25
+ <span class="stack-cover" />\
26
+ </a>\
27
+ </li>',
28
+
29
+ placeholder: '<li class="stackview-placeholder"></li>'
30
+ }
31
+ })();
@@ -0,0 +1,40 @@
1
+ /*!
2
+ Simple JavaScript Templating originally by John Resig:
3
+ http://ejohn.org/blog/javascript-micro-templating/
4
+ Modified by Rick Strahl:
5
+ http://west-wind.com/weblog/posts/2008/Oct/13/Client-Templating-with-jQuery
6
+ MIT Licensed
7
+ */
8
+ (function() {
9
+ var cache = {};
10
+
11
+ this.tmpl = function tmpl(str, data) {
12
+ // Figure out if we're getting a template, or if we need to
13
+ // load the template - and be sure to cache the result.
14
+ var fn = !/\W/.test(str) ?
15
+ cache[str] = cache[str] || tmpl(document.getElementById(str).innerHTML) :
16
+
17
+ // Generate a reusable function that will serve as a template
18
+ // generator (and which will be cached).
19
+ new Function("obj",
20
+ "var p=[],print=function(){p.push.apply(p,arguments);};" +
21
+
22
+ // Introduce the data as local variables using with(){}
23
+ "with(obj){p.push('" +
24
+
25
+ // Convert the template into pure JavaScript
26
+ str
27
+ .replace(/[\r\t\n]/g, " ")
28
+ .replace(/'(?=[^%]*%>)/g,"\t")
29
+ .split("'").join("\\'")
30
+ .split("\t").join("'")
31
+ .replace(/^[\r\t\n ]+/, '')
32
+ .replace(/<%=(.+?)%>/g, "',$1,'")
33
+ .split("<%").join("');")
34
+ .split("%>").join("p.push('")
35
+ + "');}return p.join('');");
36
+
37
+ // Provide some basic currying to the user
38
+ return data ? fn(data) : fn;
39
+ };
40
+ })();
@@ -0,0 +1,184 @@
1
+ (function($, window, undefined) {
2
+ /*
3
+ Extend StackView defaults to include options for this item type.
4
+
5
+ max_height_percentage
6
+ Books with the maximum height will render as this percentage
7
+ width in the stack.
8
+
9
+ max_height
10
+ The maximum height in centimeters that an item will render as,
11
+ regardless of the true height of the item.
12
+
13
+ max_pages
14
+ The maximum number of pages that a book will render as,
15
+ regardless of the true number of pages.
16
+
17
+ min_height_percentage
18
+ Books with the minimum height will render as this percentage
19
+ width in the stack.
20
+
21
+ min_height
22
+ The minimum height in centimeters that an item will render as,
23
+ regardless of the true height of the item.
24
+
25
+ min_pages
26
+ The minimum number of pages that a book will render as,
27
+ regardless of the true number of pages.
28
+
29
+ page_multiple
30
+ A number that when multiplied by the number of pages in a book
31
+ gives us the total pixel height to be rendered.
32
+
33
+ selectors.book
34
+ Item selector specific to the book type.
35
+ */
36
+ $.extend(true, window.StackView.defaults, {
37
+ book: {
38
+ max_height_percentage: 100,
39
+ max_height: 39,
40
+ max_pages: 540,
41
+ min_height_percentage: 59,
42
+ min_height: 20,
43
+ min_pages: 200,
44
+ page_multiple: 0.20
45
+ },
46
+
47
+ selectors: {
48
+ book: '.stack-book'
49
+ }
50
+ });
51
+
52
+ /*
53
+ #translate(number, number, number, number, number) - Private
54
+
55
+ Takes a value (the first argument) and two ranges of numbers. Translates
56
+ this value from the first range to the second range. E.g.:
57
+
58
+ translate(0, 0, 10, 50, 100) returns 50.
59
+ translate(10, 0, 10, 50, 100) returns 100.
60
+ translate(5, 0, 10, 50, 100) returns 75.
61
+
62
+ http://stackoverflow.com/questions/1969240/mapping-a-range-of-values-to-another
63
+ */
64
+ var translate = function(value, start_min, start_max, end_min, end_max) {
65
+ var start_range = start_max - start_min,
66
+ end_range = end_max - end_min,
67
+ scale = (value - start_min) / (start_range);
68
+
69
+ return end_min + scale * end_range;
70
+ };
71
+
72
+ /*
73
+ #get_height(StackView, object) - Private
74
+
75
+ Takes a StackView options object and a book object. Returns a
76
+ normalized book height percentage, taking into account the minimum
77
+ height, maximum height, height multiple, and translating them onto
78
+ the percentage range specified in the stack options.
79
+ */
80
+ var get_height = function(options, book) {
81
+ var height = parseInt(book.measurement_height_numeric, 10),
82
+ min = options.book.min_height,
83
+ max = options.book.max_height;
84
+
85
+ if (isNaN(height)) {
86
+ height = min;
87
+ }
88
+ height = Math.min(Math.max(height, min), max);
89
+ height = translate(
90
+ height,
91
+ options.book.min_height,
92
+ options.book.max_height,
93
+ options.book.min_height_percentage,
94
+ options.book.max_height_percentage
95
+ );
96
+ return height + '%';
97
+ };
98
+
99
+ /*
100
+ #get_thickness(StackView, object) - Private
101
+
102
+ Takes a StackView instance and a book object. Returns a normalized
103
+ book thickness using the number of book pages, taking into account
104
+ the minimum pages, maximum pages, and pages multiple.
105
+ */
106
+ var get_thickness = function(options, book) {
107
+ var thickness = parseInt(book.measurement_page_numeric, 10),
108
+ min = options.book.min_pages,
109
+ max = options.book.max_pages,
110
+ multiple = options.book.page_multiple;
111
+
112
+ if (isNaN(thickness)) {
113
+ thickness = min;
114
+ }
115
+ thickness = Math.min(Math.max(thickness, min), max) * multiple;
116
+ return thickness + 'px';
117
+ };
118
+
119
+ /*
120
+ #normalize_link(object) - Private
121
+
122
+ Takes an item and returns the item's link, taking into account
123
+ workarounds that may come from inconsistent data structure.
124
+ */
125
+ var normalize_link = function(item) {
126
+ //workaround for link construction from LibraryCloud
127
+ return item.title_link_friendly ?
128
+ '../shelflife/book/' + item.title_link_friendly + '/' + item.id :
129
+ item.link;
130
+ };
131
+
132
+ /*
133
+ #get_author(object) - Private
134
+
135
+ Takes an item and returns the item's author, taking the first
136
+ author if an array of authors is defined.
137
+ */
138
+ var get_author = function(item) {
139
+ var author = item.creator && item.creator.length ? item.creator[0] : '';
140
+
141
+ if(/^([^,]*)/.test(author)) {
142
+ author = author.match(/^[^,]*/);
143
+ }
144
+
145
+ return author;
146
+ };
147
+
148
+
149
+ /*
150
+ Book type definition.
151
+ */
152
+ window.StackView.register_type({
153
+ name: 'book',
154
+
155
+ match: function(item) {
156
+ return (item.format && item.format === 'book') || !item.format;
157
+ },
158
+
159
+ adapter: function(item, options) {
160
+ return {
161
+ heat: window.StackView.utils.get_heat(item.shelfrank),
162
+ book_height: get_height(options, item),
163
+ book_thickness: get_thickness(options, item),
164
+ link: normalize_link(item),
165
+ title: item.title,
166
+ author: get_author(item),
167
+ year: item.pub_date
168
+ };
169
+ },
170
+
171
+ template: '\
172
+ <li class="stack-item stack-book heat<%= heat %>" style="width:<%= book_height %>; height:<%= book_thickness %>;">\
173
+ <a href="<%= link %>" target="_blank">\
174
+ <span class="spine-text">\
175
+ <span class="spine-title"><%= title %></span>\
176
+ <span class="spine-author"><%= author %></span>\
177
+ </span>\
178
+ <span class="spine-year"><%= year %></span>\
179
+ <span class="stack-pages" />\
180
+ <span class="stack-cover" />\
181
+ </a>\
182
+ </li>'
183
+ });
184
+ })(jQuery, window);