padma-assets 0.1.20 → 0.1.21

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
  SHA1:
3
- metadata.gz: c3cb833d4bdf93f1c756d4f78bdd1c5476187f07
4
- data.tar.gz: 302020c4c8675ce2f9fa0aa261b17569aad2d6ce
3
+ metadata.gz: bc745accd74d7cd14737449437a39a85579e2974
4
+ data.tar.gz: 344bd105e4580a50c28c91a9b6e44b7da04faec3
5
5
  SHA512:
6
- metadata.gz: 604187648b2a11abccab05ce803e96054d1ffe3bb07c6f789e50ac70f4993e5afdce794e73e913472d72b89707d71d42e5e68ff32b37d7be2d682b78e0b83cb9
7
- data.tar.gz: 23e99fb1dd784110fd243f38cb7f66682f241cf569c9857dd760ba54813f0e1190926ae3a031ceac69b504d2a465b0485f7dce96e83d6469abd8ab7a8e7beb6b
6
+ metadata.gz: 9af64dc748bba204f7856155fd679b5aed314f9fa9eaea693b2b8a0be4e20a731dd8ea8e2824af6467c8b3201a5372de187a455a8ae94e9f2a4636d45c0a51e1
7
+ data.tar.gz: 6b7e119aba1d76d69d1a511325b675f56f3b7ef968a7a98ab1bcd4502f599cac69c123a2e851ed71138c630788bccfef3949ad2fa95cfe0c95eddacb1aa69d84
@@ -4,6 +4,7 @@ class GeneralAbility
4
4
  def initialize(user)
5
5
  if alpha?(user)
6
6
  can :manage, :mailchimp
7
+ can :manage, :persistent_contact_searches
7
8
  end
8
9
  end
9
10
 
@@ -0,0 +1,41 @@
1
+ # Usage
2
+ #
3
+ # To a container element add css class 'async-render' and attribute data-url with url to be called.
4
+ # this will call url and replace elements content with returned html
5
+ # options are:
6
+ # data-url, data-success-callback
7
+ #
8
+ # With class 'cached-async-render" html will be cached locally to avoid constant requests.
9
+ # options are:
10
+ # data-url , data-cache-key, data-cache-expires-in, data-success-callback
11
+ #
12
+ # Author: Dwayne Macgowan
13
+ $(document).ready ->
14
+
15
+ cache = new Cache(-1, false, new Cache.LocalStorageCacheStorage())
16
+
17
+ $(".cached-async-render").each (i) ->
18
+ e = $(this)
19
+ cache_key = e.data('cache-key') || e.data('url')
20
+ expires_in = e.data('cache-expires-in') || 60 # default cache expiration to 1 min
21
+
22
+ cached_html = cache.getItem(cache_key)
23
+ if cached_html == null
24
+ $.ajax e.data('url'),
25
+ success: (html_response) ->
26
+ cache.setItem(cache_key,html_response,{expirantionSliding: expires_in})
27
+ e.html html_response
28
+ if e.data('success-callback')
29
+ eval e.data('success-callback')
30
+ else
31
+ e.html cached_html
32
+ if e.data('success-callback')
33
+ eval e.data('success-callback')
34
+
35
+ $(".async-render").each (i) ->
36
+ e = $(this)
37
+ $.ajax e.data('url'),
38
+ success: (html_response) ->
39
+ e.html html_response
40
+ if e.data('success-callback')
41
+ eval e.data('success-callback')
@@ -0,0 +1,432 @@
1
+ /*
2
+ MIT LICENSE
3
+ Copyright (c) 2007 Monsur Hossain (http://monsur.hossai.in)
4
+
5
+ Permission is hereby granted, free of charge, to any person
6
+ obtaining a copy of this software and associated documentation
7
+ files (the "Software"), to deal in the Software without
8
+ restriction, including without limitation the rights to use,
9
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the
11
+ Software is furnished to do so, subject to the following
12
+ conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24
+ OTHER DEALINGS IN THE SOFTWARE.
25
+ */
26
+
27
+ // Avoid polluting the global namespace if we're using a module loader
28
+ (function(){
29
+
30
+ /**
31
+ * Creates a new Cache object.
32
+ * @param {number} maxSize The maximum size of the cache (or -1 for no max).
33
+ * @param {boolean} debug Whether to log events to the console.log.
34
+ * @constructor
35
+ */
36
+ function Cache(maxSize, debug, storage) {
37
+ this.maxSize_ = maxSize || -1;
38
+ this.debug_ = debug || false;
39
+ this.storage_ = storage || new Cache.BasicCacheStorage();
40
+
41
+ this.fillFactor_ = .75;
42
+
43
+ this.stats_ = {};
44
+ this.stats_['hits'] = 0;
45
+ this.stats_['misses'] = 0;
46
+ this.log_('Initialized cache with size ' + maxSize);
47
+ }
48
+
49
+ /**
50
+ * An easier way to refer to the priority of a cache item
51
+ * @enum {number}
52
+ */
53
+ Cache.Priority = {
54
+ 'LOW': 1,
55
+ 'NORMAL': 2,
56
+ 'HIGH': 4
57
+ };
58
+
59
+ /**
60
+ * Basic in memory cache storage backend.
61
+ * @constructor
62
+ */
63
+ Cache.BasicCacheStorage = function() {
64
+ this.items_ = {};
65
+ this.count_ = 0;
66
+ }
67
+ Cache.BasicCacheStorage.prototype.get = function(key) {
68
+ return this.items_[key];
69
+ }
70
+ Cache.BasicCacheStorage.prototype.set = function(key, value) {
71
+ if (typeof this.get(key) === "undefined")
72
+ this.count_++;
73
+ this.items_[key] = value;
74
+ }
75
+ Cache.BasicCacheStorage.prototype.size = function(key, value) {
76
+ return this.count_;
77
+ }
78
+ Cache.BasicCacheStorage.prototype.remove = function(key) {
79
+ var item = this.get(key);
80
+ if (typeof item !== "undefined")
81
+ this.count_--;
82
+ delete this.items_[key];
83
+ return item;
84
+ }
85
+ Cache.BasicCacheStorage.prototype.keys = function() {
86
+ var ret = [], p;
87
+ for (p in this.items_) ret.push(p);
88
+ return ret;
89
+ }
90
+
91
+ /**
92
+ * Local Storage based persistant cache storage backend.
93
+ * If a size of -1 is used, it will purge itself when localStorage
94
+ * is filled. This is 5MB on Chrome/Safari.
95
+ * WARNING: The amortized cost of this cache is very low, however,
96
+ * when a the cache fills up all of localStorage, and a purge is required, it can
97
+ * take a few seconds to fetch all the keys and values in storage.
98
+ * Since localStorage doesn't have namespacing, this means that even if this
99
+ * individual cache is small, it can take this time if there are lots of other
100
+ * other keys in localStorage.
101
+ *
102
+ * @param {string} namespace A string to namespace the items in localStorage. Defaults to 'default'.
103
+ * @constructor
104
+ */
105
+ Cache.LocalStorageCacheStorage = function(namespace) {
106
+ this.prefix_ = 'cache-storage.' + (namespace || 'default') + '.';
107
+ // Regexp String Escaping from http://simonwillison.net/2006/Jan/20/escape/#p-6
108
+ var escapedPrefix = this.prefix_.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
109
+ this.regexp_ = new RegExp('^' + escapedPrefix)
110
+ }
111
+ Cache.LocalStorageCacheStorage.prototype.get = function(key) {
112
+ var item = window.localStorage[this.prefix_ + key];
113
+ if (item) return JSON.parse(item);
114
+ return null;
115
+ }
116
+ Cache.LocalStorageCacheStorage.prototype.set = function(key, value) {
117
+ window.localStorage[this.prefix_ + key] = JSON.stringify(value);
118
+ }
119
+ Cache.LocalStorageCacheStorage.prototype.size = function(key, value) {
120
+ return this.keys().length;
121
+ }
122
+ Cache.LocalStorageCacheStorage.prototype.remove = function(key) {
123
+ var item = this.get(key);
124
+ delete window.localStorage[this.prefix_ + key];
125
+ return item;
126
+ }
127
+ Cache.LocalStorageCacheStorage.prototype.keys = function() {
128
+ var ret = [], p;
129
+ for (p in window.localStorage) {
130
+ if (p.match(this.regexp_)) ret.push(p.replace(this.prefix_, ''));
131
+ };
132
+ return ret;
133
+ }
134
+
135
+ /**
136
+ * Retrieves an item from the cache.
137
+ * @param {string} key The key to retrieve.
138
+ * @return {Object} The item, or null if it doesn't exist.
139
+ */
140
+ Cache.prototype.getItem = function(key) {
141
+
142
+ // retrieve the item from the cache
143
+ var item = this.storage_.get(key);
144
+
145
+ if (item != null) {
146
+ if (!this.isExpired_(item)) {
147
+ // if the item is not expired
148
+ // update its last accessed date
149
+ item.lastAccessed = new Date().getTime();
150
+ } else {
151
+ // if the item is expired, remove it from the cache
152
+ this.removeItem(key);
153
+ item = null;
154
+ }
155
+ }
156
+
157
+ // return the item value (if it exists), or null
158
+ var returnVal = item ? item.value : null;
159
+ if (returnVal) {
160
+ this.stats_['hits']++;
161
+ this.log_('Cache HIT for key ' + key)
162
+ } else {
163
+ this.stats_['misses']++;
164
+ this.log_('Cache MISS for key ' + key)
165
+ }
166
+ return returnVal;
167
+ };
168
+
169
+
170
+ Cache._CacheItem = function(k, v, o) {
171
+ if (!k) {
172
+ throw new Error("key cannot be null or empty");
173
+ }
174
+ this.key = k;
175
+ this.value = v;
176
+ o = o || {};
177
+ if (o.expirationAbsolute) {
178
+ o.expirationAbsolute = o.expirationAbsolute.getTime();
179
+ }
180
+ if (!o.priority) {
181
+ o.priority = Cache.Priority.NORMAL;
182
+ }
183
+ this.options = o;
184
+ this.lastAccessed = new Date().getTime();
185
+ };
186
+
187
+
188
+ /**
189
+ * Sets an item in the cache.
190
+ * @param {string} key The key to refer to the item.
191
+ * @param {Object} value The item to cache.
192
+ * @param {Object} options an optional object which controls various caching
193
+ * options:
194
+ * expirationAbsolute: the datetime when the item should expire
195
+ * expirationSliding: an integer representing the seconds since
196
+ * the last cache access after which the item
197
+ * should expire
198
+ * priority: How important it is to leave this item in the cache.
199
+ * You can use the values Cache.Priority.LOW, .NORMAL, or
200
+ * .HIGH, or you can just use an integer. Note that
201
+ * placing a priority on an item does not guarantee
202
+ * it will remain in cache. It can still be purged if
203
+ * an expiration is hit, or if the cache is full.
204
+ * callback: A function that gets called when the item is purged
205
+ * from cache. The key and value of the removed item
206
+ * are passed as parameters to the callback function.
207
+ */
208
+ Cache.prototype.setItem = function(key, value, options) {
209
+
210
+ // add a new cache item to the cache
211
+ if (this.storage_.get(key) != null) {
212
+ this.removeItem(key);
213
+ }
214
+ this.addItem_(new Cache._CacheItem(key, value, options));
215
+ this.log_("Setting key " + key);
216
+
217
+ // if the cache is full, purge it
218
+ if ((this.maxSize_ > 0) && (this.size() > this.maxSize_)) {
219
+ var that = this;
220
+ setTimeout(function() {
221
+ that.purge_.call(that);
222
+ }, 0);
223
+ }
224
+ };
225
+
226
+
227
+ /**
228
+ * Removes all items from the cache.
229
+ */
230
+ Cache.prototype.clear = function() {
231
+ // loop through each item in the cache and remove it
232
+ var keys = this.storage_.keys()
233
+ for (var i = 0; i < keys.length; i++) {
234
+ this.removeItem(keys[i]);
235
+ }
236
+ this.log_('Cache cleared');
237
+ };
238
+
239
+
240
+ /**
241
+ * @return {Object} The hits and misses on the cache.
242
+ */
243
+ Cache.prototype.getStats = function() {
244
+ return this.stats_;
245
+ };
246
+
247
+
248
+ /**
249
+ * @return {string} Returns an HTML string representation of the cache.
250
+ */
251
+ Cache.prototype.toHtmlString = function() {
252
+ var returnStr = this.size() + " item(s) in cache<br /><ul>";
253
+ var keys = this.storage_.keys()
254
+ for (var i = 0; i < keys.length; i++) {
255
+ var item = this.storage_.get(keys[i]);
256
+ returnStr = returnStr + "<li>" + item.key.toString() + " = " +
257
+ item.value.toString() + "</li>";
258
+ }
259
+ returnStr = returnStr + "</ul>";
260
+ return returnStr;
261
+ };
262
+
263
+
264
+ /**
265
+ * Allows it to resize the Cache capacity if needed.
266
+ * @param {integer} newMaxSize the new max amount of stored entries within the Cache
267
+ */
268
+ Cache.prototype.resize = function(newMaxSize) {
269
+ this.log_('Resizing Cache from ' + this.maxSize_ + ' to ' + newMaxSize);
270
+ // Set new size before purging so we know how many items to purge
271
+ var oldMaxSize = this.maxSize_
272
+ this.maxSize_ = newMaxSize;
273
+
274
+ if (newMaxSize > 0 && (oldMaxSize < 0 || newMaxSize < oldMaxSize)) {
275
+ if (this.size() > newMaxSize) {
276
+ // Cache needs to be purged as it does contain too much entries for the new size
277
+ this.purge_();
278
+ } // else if cache isn't filled up to the new limit nothing is to do
279
+ }
280
+ // else if newMaxSize >= maxSize nothing to do
281
+ this.log_('Resizing done');
282
+ }
283
+
284
+ /**
285
+ * Removes expired items from the cache.
286
+ */
287
+ Cache.prototype.purge_ = function() {
288
+ var tmparray = new Array();
289
+ var purgeSize = Math.round(this.maxSize_ * this.fillFactor_);
290
+ if (this.maxSize_ < 0)
291
+ purgeSize = this.size() * this.fillFactor_;
292
+ // loop through the cache, expire items that should be expired
293
+ // otherwise, add the item to an array
294
+ var keys = this.storage_.keys();
295
+ for (var i = 0; i < keys.length; i++) {
296
+ var key = keys[i];
297
+ var item = this.storage_.get(key);
298
+ if (this.isExpired_(item)) {
299
+ this.removeItem(key);
300
+ } else {
301
+ tmparray.push(item);
302
+ }
303
+ }
304
+
305
+ if (tmparray.length > purgeSize) {
306
+ // sort this array based on cache priority and the last accessed date
307
+ tmparray = tmparray.sort(function(a, b) {
308
+ if (a.options.priority != b.options.priority) {
309
+ return b.options.priority - a.options.priority;
310
+ } else {
311
+ return b.lastAccessed - a.lastAccessed;
312
+ }
313
+ });
314
+ // remove items from the end of the array
315
+ while (tmparray.length > purgeSize) {
316
+ var ritem = tmparray.pop();
317
+ this.removeItem(ritem.key);
318
+ }
319
+ }
320
+ this.log_('Purged cached');
321
+ };
322
+
323
+
324
+ /**
325
+ * Add an item to the cache.
326
+ * @param {Object} item The cache item to add.
327
+ * @private
328
+ */
329
+ Cache.prototype.addItem_ = function(item, attemptedAlready) {
330
+ var cache = this;
331
+ try {
332
+ this.storage_.set(item.key, item);
333
+ } catch(err) {
334
+ if (attemptedAlready) {
335
+ this.log_('Failed setting again, giving up: ' + err.toString());
336
+ throw(err);
337
+ }
338
+ this.log_('Error adding item, purging and trying again: ' + err.toString());
339
+ this.purge_();
340
+ this.addItem_(item, true);
341
+ }
342
+ };
343
+
344
+
345
+ /**
346
+ * Remove an item from the cache, call the callback function (if it exists).
347
+ * @param {String} key The key of the item to remove
348
+ */
349
+ Cache.prototype.removeItem = function(key) {
350
+ var item = this.storage_.remove(key);
351
+ this.log_("removed key " + key);
352
+
353
+ // if there is a callback function, call it at the end of execution
354
+ if (item && item.options && item.options.callback) {
355
+ setTimeout(function() {
356
+ item.options.callback.call(null, item.key, item.value);
357
+ }, 0);
358
+ }
359
+ return item ? item.value : null;
360
+ };
361
+
362
+ /**
363
+ * Scan through each item in the cache and remove that item if it passes the
364
+ * supplied test.
365
+ * @param {Function} test A test to determine if the given item should be removed.
366
+ * The item will be removed if test(key, value) returns true.
367
+ */
368
+ Cache.prototype.removeWhere = function(test) {
369
+ // Get a copy of the keys array - it won't be modified when we remove items from storage
370
+ var keys = this.storage_.keys();
371
+ for (var i = 0; i < keys.length; i++) {
372
+ var key = keys[i];
373
+ var item = this.storage_.get(key);
374
+ if(test(key, item.value) === true) {
375
+ this.removeItem(key);
376
+ }
377
+ }
378
+ };
379
+
380
+ Cache.prototype.size = function() {
381
+ return this.storage_.size();
382
+ }
383
+
384
+
385
+ /**
386
+ * @param {Object} item A cache item.
387
+ * @return {boolean} True if the item is expired
388
+ * @private
389
+ */
390
+ Cache.prototype.isExpired_ = function(item) {
391
+ var now = new Date().getTime();
392
+ var expired = false;
393
+ if (item.options.expirationAbsolute &&
394
+ (item.options.expirationAbsolute < now)) {
395
+ // if the absolute expiration has passed, expire the item
396
+ expired = true;
397
+ }
398
+ if (!expired && item.options.expirationSliding) {
399
+ // if the sliding expiration has passed, expire the item
400
+ var lastAccess =
401
+ item.lastAccessed + (item.options.expirationSliding * 1000);
402
+ if (lastAccess < now) {
403
+ expired = true;
404
+ }
405
+ }
406
+ return expired;
407
+ };
408
+
409
+
410
+ /**
411
+ * Logs a message to the console.log if debug is set to true.
412
+ * @param {string} msg The message to log.
413
+ * @private
414
+ */
415
+ Cache.prototype.log_ = function(msg) {
416
+ if (this.debug_) {
417
+ console.log(msg);
418
+ }
419
+ };
420
+
421
+ // Establish the root object, `window` in the browser, or `global` on the server.
422
+ var root = this;
423
+
424
+ if (typeof module !== "undefined" && module.exports) {
425
+ module.exports = Cache;
426
+ } else if (typeof define == "function" && define.amd) {
427
+ define(function() { return Cache; });
428
+ } else {
429
+ root.Cache = Cache;
430
+ }
431
+
432
+ })();
@@ -0,0 +1,14 @@
1
+ $(document).ready ->
2
+ $("input#menu-lists-filter").quickfilter("div#all-available-lists-menu li:not(.dropdown-header)")
3
+ $("a#refresh-lists-list-menu").click ->
4
+ console.log 'refreshing'
5
+ cache = new Cache(-1, false, new Cache.LocalStorageCacheStorage())
6
+ cache.clear()
7
+ e = $("div#menu-saved-lists")
8
+ e.html '...'
9
+ $.ajax e.data('url'),
10
+ success: (html_response) ->
11
+ e.html html_response
12
+ if e.data('success-callback')
13
+ eval e.data('success-callback')
14
+
@@ -0,0 +1,33 @@
1
+ /*
2
+ * Plugin Name: QuickFilter
3
+ * Author: Collin Henderson (collin@syropia.net)
4
+ * Version: 1.0
5
+ * © 2012, http://syropia.net
6
+ * You are welcome to freely use and modify this script in your personal and commercial products. Please don't sell it or release it as your own work. Thanks!
7
+ */
8
+ (function($){
9
+ $.extend($.expr[':'], {missing: function (elem, index, match) {
10
+ return (elem.textContent || elem.innerText || "").toLowerCase().indexOf(match[3]) == -1;
11
+ }});
12
+ $.extend($.expr[':'], {exists: function(elem, i, match, array){
13
+ return (elem.textContent || elem.innerText || '').toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
14
+ }});
15
+ $.extend($.fn,{
16
+ quickfilter: function(el){
17
+ return this.each(function(){
18
+ var _this = $(this);
19
+ var query = _this.val().toLowerCase();
20
+ _this.keyup(function () {
21
+ query = $(this).val().toLowerCase();
22
+ if(query.replace(/\s/g,"") != ""){
23
+ $(el+':exists("' + query.toString() + '")').show();
24
+ $(el+':missing("' + query.toString() + '")').hide();
25
+ }
26
+ else {
27
+ $(el).show();
28
+ }
29
+ });
30
+ });
31
+ }
32
+ });
33
+ })(jQuery);
@@ -1,4 +1,8 @@
1
1
  //= require jquery.gritter.min
2
2
  //= require jquery.ba-throttle-debounce.min
3
+ //= require jquery.quickfilter
3
4
  //= require notifications
5
+ //= require cache
6
+ //= require async_render
7
+ //= require initialize-lists-menu
4
8
  //= require_tree
@@ -1,6 +1,6 @@
1
- @registerEvent = (eventName,options) ->
1
+ @registerEvent = (eventName,meta_data) ->
2
2
  try
3
- mixpanel.track(eventName)
4
- Intercom('trackEvent',eventName)
3
+ mixpanel.track(eventName,meta_data)
4
+ Intercom('trackEvent',eventName,meta_data)
5
5
  catch err
6
6
  console.error(err)
@@ -180,7 +180,7 @@ nav.navbar{max-width:1200px; background:none; margin:0 auto;}
180
180
  #H_moduleArea .navbar-inverse .navbar-toggle:hover{ background:#266397;}
181
181
  #H_moduleArea .navbar-right{margin-right:0;}
182
182
  .navbar-nav li:hover .dropdown-menu { display: block; }
183
- .navbar-nav li > a:hover{ background:#25669e;}
183
+ .navbar-inverse .navbar-nav li > a:hover{ background:#25669e;}
184
184
 
185
185
  nav.subnav{ background:none; font-family: 'Gotham-Medium', verdana; font-weight:normal; font-size:11px; background:#f5f5f5; height: 54px;}
186
186
  nav.subnav .wrapper{ max-width:1200px; margin:0 auto; overflow:hidden; position:relative;}
@@ -1,5 +1,4 @@
1
1
  body {
2
- font-family: Verdana, Geneva, sans-serif;
3
2
  color:#4D4D4D;
4
3
  }
5
4
 
@@ -97,11 +97,6 @@ hr {
97
97
  padding: 0;
98
98
  }
99
99
 
100
- input[type="submit"], input[type="button"], button {
101
- padding: 0 !important;
102
- margin: 0 !important;
103
- }
104
-
105
100
  input, select, a img {
106
101
  vertical-align: middle;
107
102
  }
@@ -0,0 +1,44 @@
1
+ <li><%= link_to t('header-menu.lists.lists.new_list'), "#{APP_CONFIG['crm-url']}/contacts" %></li>
2
+ <li><%= link_to t('header-menu.lists.lists.all_lists'), "#{APP_CONFIG['crm-url']}/persistent_contact_searches" %></li>
3
+
4
+ <li class="pull-right"><a id="refresh-lists-list-menu"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></a></li>
5
+ <li class="dropdown-header"><%= t('header-menu.lists.lists.saved_lists') %></li>
6
+ <li>
7
+ <input id="menu-lists-filter" class='form-control' type='text' placeholder='<%= t('header-menu.lists.lists.find_list') %>' />
8
+ </li>
9
+ <div id="all-available-lists-menu">
10
+ <div id="menu-saved-lists"
11
+ class="cached-async-render"
12
+ data-cache-expires-in="120"
13
+ data-cache-key="saved-lists-for-<%= current_user.current_account.name%>"
14
+ data-url="<%= APP_CONFIG['crm-url' ] %>/persistent_contact_searches/menu">
15
+ <li><a><%= image_tag 'spinner.gif' %></a></li>
16
+ </div>
17
+ <li class="dropdown-header"><%= t('header-menu.lists.lists.system_lists') %></li>
18
+ <%- %W(students former_students prospects).each do |st| -%>
19
+ <li>
20
+ <%= link_to t("header-menu.lists.contacts.#{st}"), "#{APP_CONFIG['crm-url']}/contacts/#{st}" %>
21
+ </li>
22
+ <%- end -%>
23
+ <li>
24
+ <%= link_to t('header-menu.lists.contacts.current_month_birthdays'), "#{APP_CONFIG['crm-url']}/contacts?contact_search%5Bchosen_columns%5D%5B%5D=full_name&contact_search%5Bchosen_columns%5D%5B%5D=birthday&contact_search%5Bdate_attribute%5D%5Bcategory%5D=birthday&contact_search%5Bdate_attribute%5D%5Bmonth%5D=#{Time.zone.now.month}&column=birthday&direction=asc" %>
25
+ </li>
26
+
27
+ <li class="dropdown-header"><%= t('header-menu.lists.subscription_changes.title') %></li>
28
+
29
+ <li><%= link_to t('header-menu.lists.subscription_changes.enrollments'), "#{APP_CONFIG['crm-url']}/enrollments" %></li>
30
+ <li><%= link_to t('header-menu.lists.subscription_changes.dropouts'), "#{APP_CONFIG['crm-url']}/drop_outs" %></li>
31
+
32
+ <li class="dropdown-header"><%= t('header-menu.lists.communications.title') %></li>
33
+ <li><%= link_to t('header-menu.lists.communications.all'), "#{APP_CONFIG['crm-url']}/communications" %></li>
34
+ <li><%= link_to t('header-menu.lists.communications.visits'), "#{APP_CONFIG['crm-url']}/communications/interviews" %></li>
35
+ <li><%= link_to t('header-menu.lists.communications.phonecalls'), "#{APP_CONFIG['crm-url']}/communications/phone_calls" %></li>
36
+ <li><%= link_to t('header-menu.lists.communications.emails'), "#{APP_CONFIG['crm-url']}/communications/emails" %></li>
37
+ <li><%= link_to t('header-menu.lists.communications.web'), "#{APP_CONFIG['crm-url']}/communications/web" %></li>
38
+
39
+ <li class="dropdown-header"><%= t('header-menu.lists.comments.title') %></li>
40
+ <li><%= link_to t('header-menu.lists.comments.all'), "#{APP_CONFIG['crm-url']}/comments" %></li>
41
+ <% %W(FollowUp Gestion Revisacion Reunion).each do |t| -%>
42
+ <li><%= link_to t("header-menu.lists.comments.#{t}"), "#{APP_CONFIG['crm-url']}/comments?comment_search%5Bcomment_types%5D%5B%5D=#{t}" %></li>
43
+ <% end -%>
44
+ </div>
@@ -12,8 +12,12 @@
12
12
  <ul class="nav navbar-nav">
13
13
  <li>
14
14
  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><%= t('header-menu.lists.title') %> <span class="caret"></span></a>
15
- <ul class="dropdown-menu" role="menu">
16
- <%= render 'layouts/lists_list' %>
15
+ <ul id="lists-menu-drowpdown" class="dropdown-menu" role="menu">
16
+ <% if can?(:manage,:persistent_contact_searches) -%>
17
+ <%= render 'layouts/alpha_lists_list' %>
18
+ <% else -%>
19
+ <%= render 'layouts/lists_list' %>
20
+ <% end -%>
17
21
  </ul>
18
22
  </li>
19
23
  <li> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><%= t('header-menu.stats.title') %> <span class="caret"></span></a>
@@ -12,6 +12,13 @@ en:
12
12
  logout: Logout
13
13
  lists:
14
14
  title: Lists
15
+ lists:
16
+ new_list: New list
17
+ all_lists: All lists
18
+ find_list: Find list
19
+ saved_lists: Saved lists
20
+ system_lists: PADMA's lists
21
+ refresh: refresh lists
15
22
  contacts:
16
23
  title: Contacts
17
24
  all: All contacts
@@ -12,6 +12,13 @@ es:
12
12
  logout: Cerrar sessión
13
13
  lists:
14
14
  title: Listas
15
+ lists:
16
+ new_list: Nueva lista
17
+ all_lists: Todas las listas
18
+ find_list: Encontrar lista
19
+ saved_lists: Listas personalizadas
20
+ system_lists: Listas de PADMA
21
+ refresh: actualizar lista
15
22
  contacts:
16
23
  title: Contactos
17
24
  all_contacts: Todos los contactos
@@ -12,6 +12,13 @@ pt-BR:
12
12
  logout: Encerrar sessāo
13
13
  lists:
14
14
  title: Listas
15
+ lists:
16
+ new_list: Nova lista
17
+ all_lists: Todas as listas
18
+ find_list: Buscar lista
19
+ saved_lists: Listas personalizadas
20
+ system_lists: Listas de PADMA
21
+ refresh: atualizar listas
15
22
  contacts:
16
23
  title: Contatos
17
24
  all_contacts: Todos os contatos
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: padma-assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20
4
+ version: 0.1.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dwayne Macgowan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-22 00:00:00.000000000 Z
11
+ date: 2015-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -60,8 +60,12 @@ files:
60
60
  - app/assets/images/ie-spacer.gif
61
61
  - app/assets/images/logo-padma-w.png
62
62
  - app/assets/images/search.svg
63
+ - app/assets/javascripts/async_render.js.coffee.erb
64
+ - app/assets/javascripts/cache.js
65
+ - app/assets/javascripts/initialize-lists-menu.js.coffee
63
66
  - app/assets/javascripts/jquery.ba-throttle-debounce.min.js
64
67
  - app/assets/javascripts/jquery.gritter.min.js
68
+ - app/assets/javascripts/jquery.quickfilter.js
65
69
  - app/assets/javascripts/jquery.stickyheader.js
66
70
  - app/assets/javascripts/mixpanel.js
67
71
  - app/assets/javascripts/notifications.js.coffee
@@ -85,6 +89,7 @@ files:
85
89
  - app/assets/stylesheets/pm-modal.scss
86
90
  - app/assets/stylesheets/reset.css
87
91
  - app/assets/stylesheets/tables.css.scss
92
+ - app/views/layouts/_alpha_lists_list.html.erb
88
93
  - app/views/layouts/_attendance_menu.html.erb
89
94
  - app/views/layouts/_header.html.erb
90
95
  - app/views/layouts/_lists_list.html.erb