rails_stackview 1.0.0 → 1.0.1

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.
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);