From 0f9aeb62df9a99710a349ebb03726c645bf23851 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Sat, 5 Apr 2014 12:42:28 +0200 Subject: [PATCH] Updated to spine 1.3.0. --- .../_application_controller_generic.js.coffee | 9 +- .../app/controllers/_channel/email.js.coffee | 16 +- .../controllers/_dashboard/ticket.js.coffee | 2 +- .../app/controllers/_settings/area.js.coffee | 2 +- .../controllers/agent_ticket_create.js.coffee | 9 +- .../customer_ticket_create.js.coffee | 4 +- .../app/controllers/getting_started.js.coffee | 4 +- .../app/controllers/signup.js.coffee | 4 +- .../app/controllers/ticket_overview.js.coffee | 4 +- .../app/controllers/ticket_zoom.js.coffee | 6 +- .../app/controllers/widget/template.js.coffee | 4 +- .../controllers/widget/text_module.js.coffee | 4 +- .../app/lib/app_post/task_manager.js.coffee | 6 +- .../javascripts/app/lib/spine/ajax.coffee | 275 ++++ app/assets/javascripts/app/lib/spine/ajax.js | 386 ------ app/assets/javascripts/app/lib/spine/ajax.map | 10 - .../javascripts/app/lib/spine/bindings.coffee | 95 ++ .../javascripts/app/lib/spine/list.coffee | 47 + app/assets/javascripts/app/lib/spine/list.js | 77 -- app/assets/javascripts/app/lib/spine/list.map | 10 - .../javascripts/app/lib/spine/local.coffee | 17 + app/assets/javascripts/app/lib/spine/local.js | 38 - .../javascripts/app/lib/spine/local.map | 10 - .../javascripts/app/lib/spine/manager.coffee | 83 ++ .../javascripts/app/lib/spine/manager.js | 162 --- .../javascripts/app/lib/spine/manager.map | 10 - .../javascripts/app/lib/spine/relation.coffee | 137 ++ .../javascripts/app/lib/spine/relation.js | 264 ---- .../javascripts/app/lib/spine/relation.map | 10 - .../javascripts/app/lib/spine/route.coffee | 159 +++ app/assets/javascripts/app/lib/spine/route.js | 242 ---- .../javascripts/app/lib/spine/route.map | 10 - .../javascripts/app/lib/spine/spine.coffee | 659 ++++++++++ app/assets/javascripts/app/lib/spine/spine.js | 1151 ----------------- .../javascripts/app/lib/spine/spine.map | 10 - app/assets/javascripts/app/lib/spine/tabs.js | 66 - app/assets/javascripts/app/lib/spine/tmpl.js | 22 - 37 files changed, 1509 insertions(+), 2515 deletions(-) create mode 100755 app/assets/javascripts/app/lib/spine/ajax.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/ajax.js delete mode 100755 app/assets/javascripts/app/lib/spine/ajax.map create mode 100755 app/assets/javascripts/app/lib/spine/bindings.coffee create mode 100755 app/assets/javascripts/app/lib/spine/list.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/list.js delete mode 100755 app/assets/javascripts/app/lib/spine/list.map create mode 100755 app/assets/javascripts/app/lib/spine/local.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/local.js delete mode 100755 app/assets/javascripts/app/lib/spine/local.map create mode 100755 app/assets/javascripts/app/lib/spine/manager.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/manager.js delete mode 100755 app/assets/javascripts/app/lib/spine/manager.map create mode 100755 app/assets/javascripts/app/lib/spine/relation.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/relation.js delete mode 100755 app/assets/javascripts/app/lib/spine/relation.map create mode 100755 app/assets/javascripts/app/lib/spine/route.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/route.js delete mode 100755 app/assets/javascripts/app/lib/spine/route.map create mode 100755 app/assets/javascripts/app/lib/spine/spine.coffee delete mode 100755 app/assets/javascripts/app/lib/spine/spine.js delete mode 100755 app/assets/javascripts/app/lib/spine/spine.map delete mode 100755 app/assets/javascripts/app/lib/spine/tabs.js delete mode 100755 app/assets/javascripts/app/lib/spine/tmpl.js diff --git a/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee b/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee index bbe01ac67..db112f866 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee @@ -40,13 +40,13 @@ class App.ControllerGenericNew extends App.ControllerModal # save object ui = @ object.save( - success: -> + done: -> if ui.callback item = App[ ui.genericObject ].retrieve(@id) ui.callback( item ) ui.modalHide() - error: -> + fail: -> ui.log 'errors' ui.modalHide() ) @@ -87,13 +87,13 @@ class App.ControllerGenericEdit extends App.ControllerModal # save object ui = @ @item.save( - success: -> + done: -> if ui.callback item = App[ ui.genericObject ].retrieve(@id) ui.callback( item ) ui.modalHide() - error: => + fail: => ui.log 'errors' ui.modalHide() ) @@ -170,6 +170,7 @@ class App.ControllerGenericIndex extends App.Controller objects: objects overview: overview attributes: attributes + groupBy: 'state' ) binds = {} diff --git a/app/assets/javascripts/app/controllers/_channel/email.js.coffee b/app/assets/javascripts/app/controllers/_channel/email.js.coffee index 75e94cf4c..9a99eb4e8 100644 --- a/app/assets/javascripts/app/controllers/_channel/email.js.coffee +++ b/app/assets/javascripts/app/controllers/_channel/email.js.coffee @@ -125,9 +125,9 @@ class App.ChannelEmailFilterEdit extends App.ControllerModal # save object object.save( - success: => + done: => @modalHide() - error: => + fail: => @modalHide() ) @@ -214,9 +214,9 @@ class App.ChannelEmailAddressEdit extends App.ControllerModal # save object object.save( - success: => + done: => @modalHide() - error: => + fail: => @modalHide() ) @@ -301,9 +301,9 @@ class App.ChannelEmailSignatureEdit extends App.ControllerModal # save object object.save( - success: => + done: => @modalHide() - error: => + fail: => @modalHide() ) @@ -425,9 +425,9 @@ class App.ChannelEmailInboundEdit extends App.ControllerModal # save object object.save( - success: => + done: => @modalHide() - error: => + fail: => @modalHide() ) diff --git a/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee b/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee index 4d8c3c186..8b374cc3d 100644 --- a/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee +++ b/app/assets/javascripts/app/controllers/_dashboard/ticket.js.coffee @@ -260,7 +260,7 @@ class Settings extends App.ControllerModal @overview.view['d'] = params['attributes'] @overview.save( - success: => + done: => if @reload_needed @overview.trigger('local:refetch') else diff --git a/app/assets/javascripts/app/controllers/_settings/area.js.coffee b/app/assets/javascripts/app/controllers/_settings/area.js.coffee index 04bbf6352..05ecd00e1 100644 --- a/app/assets/javascripts/app/controllers/_settings/area.js.coffee +++ b/app/assets/javascripts/app/controllers/_settings/area.js.coffee @@ -75,7 +75,7 @@ class App.SettingsAreaItem extends App.Controller @setting['state'] = state ui = @ @setting.save( - success: => + done: => App.Event.trigger 'notify', { type: 'success' diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee index 297d847ac..5660252df 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee @@ -282,7 +282,7 @@ class App.TicketCreate extends App.Controller @formDisable(e) ui = @ object.save( - success: -> + done: -> # notify UI ui.notify @@ -306,8 +306,7 @@ class App.TicketCreate extends App.Controller # if not, show start screen ui.navigate "#" - - error: -> + fail: -> ui.log 'save failed!' ui.formEnable(e) ) @@ -357,7 +356,7 @@ class UserNew extends App.ControllerModal # save user ui = @ user.save( - success: -> + done: -> # force to reload object callbackReload = (user) -> @@ -370,7 +369,7 @@ class UserNew extends App.ControllerModal ui.modalHide() App.User.retrieve( @id, callbackReload , true ) - error: -> + fail: -> ui.modalHide() ) diff --git a/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee b/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee index c21be26be..2d6296cdf 100644 --- a/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee +++ b/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee @@ -178,12 +178,12 @@ class Index extends App.ControllerContent @formDisable(e) ui = @ object.save( - success: -> + done: -> # redirect to zoom ui.navigate '#ticket/zoom/' + this.id - error: -> + fail: -> ui.log 'CustomerTicketCreate', 'error', 'can not create' ui.formEnable(e) ) diff --git a/app/assets/javascripts/app/controllers/getting_started.js.coffee b/app/assets/javascripts/app/controllers/getting_started.js.coffee index 8a80fbd27..e0d61a29e 100644 --- a/app/assets/javascripts/app/controllers/getting_started.js.coffee +++ b/app/assets/javascripts/app/controllers/getting_started.js.coffee @@ -94,7 +94,7 @@ class Index extends App.ControllerContent # save user user.save( - success: (r) => + done: (r) => if @master_user @master_user = false @@ -123,7 +123,7 @@ class Index extends App.ControllerContent # rerender page @render() - error: (data) -> + fail: (data) -> App.Event.trigger 'notify', { type: 'error' diff --git a/app/assets/javascripts/app/controllers/signup.js.coffee b/app/assets/javascripts/app/controllers/signup.js.coffee index fc5c54032..a3da92107 100644 --- a/app/assets/javascripts/app/controllers/signup.js.coffee +++ b/app/assets/javascripts/app/controllers/signup.js.coffee @@ -62,7 +62,7 @@ class Index extends App.ControllerContent # save user user.save( - success: (r) => + done: (r) => App.Auth.login( data: username: @params.login @@ -70,7 +70,7 @@ class Index extends App.ControllerContent success: @success error: @error ) -# error: => +# fail: => # @modalHide() ) diff --git a/app/assets/javascripts/app/controllers/ticket_overview.js.coffee b/app/assets/javascripts/app/controllers/ticket_overview.js.coffee index 93a85ed2d..fc7536993 100644 --- a/app/assets/javascripts/app/controllers/ticket_overview.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_overview.js.coffee @@ -311,7 +311,7 @@ class Table extends App.ControllerContent ticket.load(ticket_update) ticket.save( - success: (r) => + done: (r) => @bulk_count_index++ # refresh view after all tickets are proceeded @@ -501,7 +501,7 @@ class Settings extends App.ControllerModal @overview.view[@view_mode] = params['attributes'] @overview.save( - success: => + done: => if @reload_needed @overview.trigger('local:refetch') else diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee index e098ced86..756461082 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee @@ -530,17 +530,17 @@ class Edit extends App.Controller return ticket.save( - success: (r) => + done: (r) => # reset form after save if article article.save( - success: (r) => + done: (r) => @ui.fetch( ticket.id, true ) # reset form after save App.TaskManager.update( @task_key, { 'state': {} }) - error: (r) => + fail: (r) => @log 'error', 'update article', r ) else diff --git a/app/assets/javascripts/app/controllers/widget/template.js.coffee b/app/assets/javascripts/app/controllers/widget/template.js.coffee index c2da4003e..9367285ea 100644 --- a/app/assets/javascripts/app/controllers/widget/template.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/template.js.coffee @@ -80,10 +80,10 @@ class App.WidgetTemplate extends App.ControllerDrox else ui = @ template.save( - success: -> + done: -> ui.template_id = @.id ui.render() - error: => + fail: => @log 'error', 'save failed!' ) diff --git a/app/assets/javascripts/app/controllers/widget/text_module.js.coffee b/app/assets/javascripts/app/controllers/widget/text_module.js.coffee index 43e7b893e..e1807e060 100644 --- a/app/assets/javascripts/app/controllers/widget/text_module.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/text_module.js.coffee @@ -295,12 +295,12 @@ class App.WidgetTextModuleOld extends App.Controller else ui = @ text_module.save( - success: -> + done: -> ui.el.find('#text_module_name').val('') ui.renderTable() ui.log 'save success!' - error: -> + fail: -> ui.log 'save failed!' ) diff --git a/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee b/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee index 042161e74..f866853e9 100644 --- a/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee @@ -138,7 +138,7 @@ class _taskManagerSingleton extends App.Controller # save new task and update task collection ui = @ task.save( - success: -> + done: -> for taskPosition of ui.allTasks if ui.allTasks[taskPosition] && ui.allTasks[taskPosition]['key'] is @key task = @attributes() @@ -338,10 +338,10 @@ class _taskManagerSingleton extends App.Controller if taskUpdate.isOnline() ui = @ taskUpdate.save( - success: -> + done: -> if ui.tasksToUpdate[ @key ] is 'inProgress' delete ui.tasksToUpdate[ @key ] - error: -> + fail: -> ui.log 'error', "can't update task", @ if ui.tasksToUpdate[ @key ] is 'inProgress' delete ui.tasksToUpdate[ @key ] diff --git a/app/assets/javascripts/app/lib/spine/ajax.coffee b/app/assets/javascripts/app/lib/spine/ajax.coffee new file mode 100755 index 000000000..2007f0ae6 --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/ajax.coffee @@ -0,0 +1,275 @@ +Spine = @Spine or require('spine') +$ = Spine.$ +Model = Spine.Model +Queue = $({}) + +Ajax = + getURL: (object) -> + if object.className? + @generateURL(object) + else + @generateURL(object, encodeURIComponent(object.id)) + + getCollectionURL: (object) -> + @generateURL(object) + + getScope: (object) -> + object.scope?() or object.scope + + getCollection: (object) -> + if object.url isnt object.generateURL + if typeof object.url is 'function' + object.url() + else + object.url + else if object.className? + object.className.toLowerCase() + 's' + + generateURL: (object, args...) -> + collection = Ajax.getCollection(object) or Ajax.getCollection(object.constructor) + scope = Ajax.getScope(object) or Ajax.getScope(object.constructor) + args.unshift(collection) + args.unshift(scope) + # construct and clean url + path = args.join('/') + path = path.replace /(\/\/)/g, "/" + path = path.replace /^\/|\/$/g, "" + # handle relative urls vs those that use a host + if path.indexOf("../") isnt 0 + Model.host + "/" + path + else + path + + enabled: true + + disable: (callback) -> + if @enabled + @enabled = false + try + do callback + catch e + throw e + finally + @enabled = true + else + do callback + + queue: (request) -> + if request then Queue.queue(request) else Queue.queue() + + clearQueue: -> + @queue [] + +class Base + defaults: + dataType: 'json' + processData: false + headers: {'X-Requested-With': 'XMLHttpRequest'} + + queue: Ajax.queue + + ajax: (params, defaults) -> + $.ajax @ajaxSettings(params, defaults) + + ajaxQueue: (params, defaults, record) -> + jqXHR = null + deferred = $.Deferred() + promise = deferred.promise() + return promise unless Ajax.enabled + settings = @ajaxSettings(params, defaults) + # prefer setting if exists else default is to parallelize 'GET' requests + parallel = if settings.parallel isnt undefined then settings.parallel else (settings.type is 'GET') + request = (next) -> + if record?.id? + # for existing singleton, model id may have been updated + # after request has been queued + settings.url ?= Ajax.getURL(record) + settings.data?.id = record.id + # 2 reasons not to stringify: if already a string, or if intend to have ajax processData + if typeof settings.data isnt 'string' and settings.processData isnt true + settings.data = JSON.stringify(settings.data) + jqXHR = $.ajax(settings) + .done(deferred.resolve) + .fail(deferred.reject) + .then(next, next) + if parallel + Queue.dequeue() + + promise.abort = (statusText) -> + return jqXHR.abort(statusText) if jqXHR + index = $.inArray(request, @queue()) + @queue().splice(index, 1) if index > -1 + deferred.rejectWith( + settings.context or settings, + [promise, statusText, ''] + ) + promise + + @queue request + promise + + ajaxSettings: (params, defaults) -> + $.extend({}, @defaults, defaults, params) + +class Collection extends Base + constructor: (@model) -> + + find: (id, params, options = {}) -> + record = new @model(id: id) + @ajaxQueue( + params, { + type: 'GET' + url: options.url or Ajax.getURL(record) + parallel: options.parallel + } + ).done(@recordsResponse) + .fail(@failResponse) + + all: (params, options = {}) -> + @ajaxQueue( + params, { + type: 'GET' + url: options.url or Ajax.getURL(@model) + parallel: options.parallel + } + ).done(@recordsResponse) + .fail(@failResponse) + + fetch: (params = {}, options = {}) -> + if id = params.id + delete params.id + @find(id, params, options).done (record) => + @model.refresh(record, options) + else + @all(params, options).done (records) => + @model.refresh(records, options) + + # Private + + recordsResponse: (data, status, xhr) => + @model.trigger('ajaxSuccess', null, status, xhr) + + failResponse: (xhr, statusText, error) => + @model.trigger('ajaxError', null, xhr, statusText, error) + +class Singleton extends Base + constructor: (@record) -> + @model = @record.constructor + + reload: (params, options = {}) -> + @ajaxQueue( + params, { + type: 'GET' + url: options.url + parallel: options.parallel + }, @record + ).done(@recordResponse(options)) + .fail(@failResponse(options)) + + create: (params, options = {}) -> + @ajaxQueue( + params, { + type: 'POST' + contentType: 'application/json' + data: @record.toJSON() + url: options.url or Ajax.getCollectionURL(@record) + parallel: options.parallel + } + ).done(@recordResponse(options)) + .fail(@failResponse(options)) + + update: (params, options = {}) -> + @ajaxQueue( + params, { + type: 'PUT' + contentType: 'application/json' + data: @record.toJSON() + url: options.url + parallel: options.parallel + }, @record + ).done(@recordResponse(options)) + .fail(@failResponse(options)) + + destroy: (params, options = {}) -> + @ajaxQueue( + params, { + type: 'DELETE' + url: options.url + parallel: options.parallel + }, @record + ).done(@recordResponse(options)) + .fail(@failResponse(options)) + + # Private + + recordResponse: (options = {}) => + (data, status, xhr) => + + Ajax.disable => + unless Spine.isBlank(data) or @record.destroyed + # ID change, need to do some shifting + if data.id and @record.id isnt data.id + @record.changeID(data.id) + # Update with latest data + @record.refresh(data) + + @record.trigger('ajaxSuccess', data, status, xhr) + options.done?.apply(@record) + + failResponse: (options = {}) => + (xhr, statusText, error) => + @record.trigger('ajaxError', xhr, statusText, error) + options.fail?.apply(@record) + +# Ajax endpoint +Model.host = '' + +GenerateURL = + include: (args...) -> + args.unshift(encodeURIComponent(@id)) + Ajax.generateURL(@, args...) + extend: (args...) -> + Ajax.generateURL(@, args...) + +Include = + ajax: -> new Singleton(this) + + generateURL: GenerateURL.include + + url: GenerateURL.include + +Extend = + ajax: -> new Collection(this) + + generateURL: GenerateURL.extend + + url: GenerateURL.extend + +Model.Ajax = + extended: -> + @fetch @ajaxFetch + @change @ajaxChange + @extend Extend + @include Include + + # Private + + ajaxFetch: -> + @ajax().fetch(arguments...) + + ajaxChange: (record, type, options = {}) -> + return if options.ajax is false + record.ajax()[type](options.ajax, options) + +Model.Ajax.Methods = + extended: -> + @extend Extend + @include Include + +# Globals +Ajax.defaults = Base::defaults +Ajax.Base = Base +Ajax.Singleton = Singleton +Ajax.Collection = Collection +Spine.Ajax = Ajax +module?.exports = Ajax diff --git a/app/assets/javascripts/app/lib/spine/ajax.js b/app/assets/javascripts/app/lib/spine/ajax.js deleted file mode 100755 index 5926b1284..000000000 --- a/app/assets/javascripts/app/lib/spine/ajax.js +++ /dev/null @@ -1,386 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -(function() { - var $, Ajax, Base, Collection, Extend, Include, Model, Queue, Singleton, Spine, - __slice = [].slice, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Spine = this.Spine || require('spine'); - - $ = Spine.$; - - Model = Spine.Model; - - Queue = $({}); - - Ajax = { - getURL: function(object) { - return (typeof object.url === "function" ? object.url() : void 0) || object.url; - }, - getCollectionURL: function(object) { - if (object) { - if (typeof object.url === "function") { - return this.generateURL(object); - } else { - return object.url; - } - } - }, - getScope: function(object) { - return (typeof object.scope === "function" ? object.scope() : void 0) || object.scope; - }, - generateURL: function() { - var args, collection, object, path, scope; - object = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - if (object.className) { - collection = object.className.toLowerCase() + 's'; - scope = Ajax.getScope(object); - } else { - if (typeof object.constructor.url === 'string') { - collection = object.constructor.url; - } else { - collection = object.constructor.className.toLowerCase() + 's'; - } - scope = Ajax.getScope(object) || Ajax.getScope(object.constructor); - } - args.unshift(collection); - args.unshift(scope); - path = args.join('/'); - path = path.replace(/(\/\/)/g, "/"); - path = path.replace(/^\/|\/$/g, ""); - if (path.indexOf("../") !== 0) { - return Model.host + "/" + path; - } else { - return path; - } - }, - enabled: true, - disable: function(callback) { - var e; - if (this.enabled) { - this.enabled = false; - try { - return callback(); - } catch (_error) { - e = _error; - throw e; - } finally { - this.enabled = true; - } - } else { - return callback(); - } - }, - queue: function(request) { - if (request) { - return Queue.queue(request); - } else { - return Queue.queue(); - } - }, - clearQueue: function() { - return this.queue([]); - } - }; - - Base = (function() { - function Base() {} - - Base.prototype.defaults = { - dataType: 'json', - processData: false, - headers: { - 'X-Requested-With': 'XMLHttpRequest' - } - }; - - Base.prototype.queue = Ajax.queue; - - Base.prototype.ajax = function(params, defaults) { - return $.ajax(this.ajaxSettings(params, defaults)); - }; - - Base.prototype.ajaxQueue = function(params, defaults, record) { - var deferred, jqXHR, promise, request, settings; - jqXHR = null; - deferred = $.Deferred(); - promise = deferred.promise(); - if (!Ajax.enabled) { - return promise; - } - settings = this.ajaxSettings(params, defaults); - request = function(next) { - var _ref; - if ((record != null ? record.id : void 0) != null) { - if (settings.url == null) { - settings.url = Ajax.getURL(record); - } - if ((_ref = settings.data) != null) { - _ref.id = record.id; - } - } - if (typeof settings.data !== 'string' && settings.processData !== true) { - settings.data = JSON.stringify(settings.data); - } - return jqXHR = $.ajax(settings).done(deferred.resolve).fail(deferred.reject).then(next, next); - }; - promise.abort = function(statusText) { - var index; - if (jqXHR) { - return jqXHR.abort(statusText); - } - index = $.inArray(request, this.queue()); - if (index > -1) { - this.queue().splice(index, 1); - } - deferred.rejectWith(settings.context || settings, [promise, statusText, '']); - return promise; - }; - this.queue(request); - return promise; - }; - - Base.prototype.ajaxSettings = function(params, defaults) { - return $.extend({}, this.defaults, defaults, params); - }; - - return Base; - - })(); - - Collection = (function(_super) { - __extends(Collection, _super); - - function Collection(model) { - this.model = model; - this.failResponse = __bind(this.failResponse, this); - this.recordsResponse = __bind(this.recordsResponse, this); - } - - Collection.prototype.find = function(id, params, options) { - var record; - if (options == null) { - options = {}; - } - record = new this.model({ - id: id - }); - return this.ajaxQueue(params, { - type: 'GET', - url: options.url || Ajax.getURL(record) - }).done(this.recordsResponse).fail(this.failResponse); - }; - - Collection.prototype.all = function(params, options) { - if (options == null) { - options = {}; - } - return this.ajaxQueue(params, { - type: 'GET', - url: options.url || Ajax.getURL(this.model) - }).done(this.recordsResponse).fail(this.failResponse); - }; - - Collection.prototype.fetch = function(params, options) { - var id, - _this = this; - if (params == null) { - params = {}; - } - if (options == null) { - options = {}; - } - if (id = params.id) { - delete params.id; - return this.find(id, params, options).done(function(record) { - return _this.model.refresh(record, options); - }); - } else { - return this.all(params, options).done(function(records) { - return _this.model.refresh(records, options); - }); - } - }; - - Collection.prototype.recordsResponse = function(data, status, xhr) { - return this.model.trigger('ajaxSuccess', null, status, xhr); - }; - - Collection.prototype.failResponse = function(xhr, statusText, error) { - return this.model.trigger('ajaxError', null, xhr, statusText, error); - }; - - return Collection; - - })(Base); - - Singleton = (function(_super) { - __extends(Singleton, _super); - - function Singleton(record) { - this.record = record; - this.failResponse = __bind(this.failResponse, this); - this.recordResponse = __bind(this.recordResponse, this); - this.model = this.record.constructor; - } - - Singleton.prototype.reload = function(params, options) { - if (options == null) { - options = {}; - } - return this.ajaxQueue(params, { - type: 'GET', - url: options.url - }, this.record).done(this.recordResponse(options)).fail(this.failResponse(options)); - }; - - Singleton.prototype.create = function(params, options) { - if (options == null) { - options = {}; - } - return this.ajaxQueue(params, { - type: 'POST', - contentType: 'application/json', - data: this.record.toJSON(), - url: options.url || Ajax.getCollectionURL(this.record) - }).done(this.recordResponse(options)).fail(this.failResponse(options)); - }; - - Singleton.prototype.update = function(params, options) { - if (options == null) { - options = {}; - } - return this.ajaxQueue(params, { - type: 'PUT', - contentType: 'application/json', - data: this.record.toJSON(), - url: options.url - }, this.record).done(this.recordResponse(options)).fail(this.failResponse(options)); - }; - - Singleton.prototype.destroy = function(params, options) { - if (options == null) { - options = {}; - } - return this.ajaxQueue(params, { - type: 'DELETE', - url: options.url - }, this.record).done(this.recordResponse(options)).fail(this.failResponse(options)); - }; - - Singleton.prototype.recordResponse = function(options) { - var _this = this; - if (options == null) { - options = {}; - } - return function(data, status, xhr) { - var _ref, _ref1; - Ajax.disable(function() { - if (!(Spine.isBlank(data) || _this.record.destroyed)) { - if (data.id && _this.record.id !== data.id) { - _this.record.changeID(data.id); - } - return _this.record.refresh(data); - } - }); - _this.record.trigger('ajaxSuccess', data, status, xhr); - if ((_ref = options.success) != null) { - _ref.apply(_this.record); - } - return (_ref1 = options.done) != null ? _ref1.apply(_this.record) : void 0; - }; - }; - - Singleton.prototype.failResponse = function(options) { - var _this = this; - if (options == null) { - options = {}; - } - return function(xhr, statusText, error) { - var _ref, _ref1; - _this.record.trigger('ajaxError', xhr, statusText, error); - if ((_ref = options.error) != null) { - _ref.apply(_this.record); - } - return (_ref1 = options.fail) != null ? _ref1.apply(_this.record) : void 0; - }; - }; - - return Singleton; - - })(Base); - - Model.host = ''; - - Include = { - ajax: function() { - return new Singleton(this); - }, - url: function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - args.unshift(encodeURIComponent(this.id)); - return Ajax.generateURL.apply(Ajax, [this].concat(__slice.call(args))); - } - }; - - Extend = { - ajax: function() { - return new Collection(this); - }, - url: function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return Ajax.generateURL.apply(Ajax, [this].concat(__slice.call(args))); - } - }; - - Model.Ajax = { - extended: function() { - this.fetch(this.ajaxFetch); - this.change(this.ajaxChange); - this.extend(Extend); - return this.include(Include); - }, - ajaxFetch: function() { - var _ref; - return (_ref = this.ajax()).fetch.apply(_ref, arguments); - }, - ajaxChange: function(record, type, options) { - if (options == null) { - options = {}; - } - if (options.ajax === false) { - return; - } - return record.ajax()[type](options.ajax, options); - } - }; - - Model.Ajax.Methods = { - extended: function() { - this.extend(Extend); - return this.include(Include); - } - }; - - Ajax.defaults = Base.prototype.defaults; - - Ajax.Base = Base; - - Ajax.Singleton = Singleton; - - Ajax.Collection = Collection; - - Spine.Ajax = Ajax; - - if (typeof module !== "undefined" && module !== null) { - module.exports = Ajax; - } - -}).call(this); - -/* -//@ sourceMappingURL=ajax.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/ajax.map b/app/assets/javascripts/app/lib/spine/ajax.map deleted file mode 100755 index eccd61cf8..000000000 --- a/app/assets/javascripts/app/lib/spine/ajax.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "ajax.js", - "sourceRoot": "..", - "sources": [ - "src/ajax.coffee" - ], - "names": [], - "mappings": "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" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/bindings.coffee b/app/assets/javascripts/app/lib/spine/bindings.coffee new file mode 100755 index 000000000..6b77143c5 --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/bindings.coffee @@ -0,0 +1,95 @@ +BindingsClass = + + model: 'model' + + bindings: {} + + +class ValueSetter + + constructor: (@context) -> + + setValue: (element, value, setter) -> + if typeof setter is 'string' + setter = @context.proxy(@context[setter]) + setter = setter || (e, v) => @_standardSetter e, v + setter element, value + + getValue: (element, getter) -> + if typeof getter is 'string' + getter = @context.proxy(@context[getter]) + getter = getter || (e, v) => @_standardGetter e, v + getter element + + _standardGetter: (element) -> + self = @ + self["_#{element.attr("type")}Get"]?(element) || element.val() + + _standardSetter: (element, value) -> + self = @ + element.each -> + el = $(this) + self["_#{el.attr("type")}Set"]?(el, value) || el.val(value) + + _checkboxSet: (element, value) -> + if value + element.prop("checked", "checked") + else + element.prop("checked", "") + + _checkboxGet: (element) -> + element.is(":checked") + +BindingsInstance = + + getModel: -> + @[@modelVar] + + setModel: (model) -> + @[@modelVar] = model + + walkBindings: (fn) -> + for selector, field of @bindings + fn selector, field + + applyBindings: -> + @valueSetter = new ValueSetter @ + @walkBindings (selector, field) => + if not field.direction or field.direction is 'model' + @_bindModelToEl @getModel(), field, selector + if not field.direction or field.direction is 'element' + @_bindElToModel @getModel(), field, selector + + _getField: (value) -> + if typeof value is 'string' + value + else + value.field + + _forceModelBindings: (model) -> + @walkBindings (selector, field) => + @valueSetter.setValue @$(selector), model[@_getField(field)], field.setter + + changeBindingSource: (model) -> + @getModel().unbind 'change' + @walkBindings (selector) => + selector = false if selector is 'self' + @el.off 'change', selector + @setModel model + @_forceModelBindings model + do @applyBindings + + _bindModelToEl: (model, field, selector) -> + self = @ + selector = false if selector is 'self' + @el.on 'change', selector, -> + model[self._getField(field)] = self.valueSetter.getValue $(this), field.getter + + _bindElToModel: (model, field, selector) -> + model.bind 'change', => + @valueSetter.setValue @$(selector), model[@_getField(field)], field.setter + +Spine.Bindings = + extended: -> + @extend BindingsClass + @include BindingsInstance diff --git a/app/assets/javascripts/app/lib/spine/list.coffee b/app/assets/javascripts/app/lib/spine/list.coffee new file mode 100755 index 000000000..7c2f97a73 --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/list.coffee @@ -0,0 +1,47 @@ +Spine = @Spine or require('spine') +$ = Spine.$ + +class Spine.List extends Spine.Controller + events: + 'click .item': 'click' + + selectFirst: false + + constructor: -> + super + @bind 'change', @change + + template: -> + throw Error 'Override template' + + change: (item) => + @current = item + + unless @current + @children().removeClass('active') + return + + @children().removeClass('active') + for item, idx in @items when item is @current + index = idx + break + + $(@children().get(index)).addClass('active') + + render: (items) -> + @items = items if items + @html @template(@items) + @change @current + if @selectFirst + unless @children('.active').length + @children(':first').click() + + children: (sel) -> + @el.children(sel) + + click: (e) -> + item = @items[$(e.currentTarget).index()] + @trigger('change', item) + true + +module?.exports = Spine.List diff --git a/app/assets/javascripts/app/lib/spine/list.js b/app/assets/javascripts/app/lib/spine/list.js deleted file mode 100755 index 3e7f821b9..000000000 --- a/app/assets/javascripts/app/lib/spine/list.js +++ /dev/null @@ -1,77 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -(function() { - var $, Spine, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Spine = this.Spine || require('spine'); - - $ = Spine.$; - - Spine.List = (function(_super) { - __extends(List, _super); - - List.prototype.events = { - 'click .item': 'click' - }; - - List.prototype.selectFirst = false; - - function List() { - this.change = __bind(this.change, this); - List.__super__.constructor.apply(this, arguments); - this.bind('change', this.change); - } - - List.prototype.template = function() { - throw 'Override template'; - }; - - List.prototype.change = function(item) { - this.current = item; - if (!this.current) { - this.children().removeClass('active'); - return; - } - this.children().removeClass('active'); - return $(this.children().get(this.items.indexOf(this.current))).addClass('active'); - }; - - List.prototype.render = function(items) { - if (items) { - this.items = items; - } - this.html(this.template(this.items)); - this.change(this.current); - if (this.selectFirst) { - if (!this.children('.active').length) { - return this.children(':first').click(); - } - } - }; - - List.prototype.children = function(sel) { - return this.el.children(sel); - }; - - List.prototype.click = function(e) { - var item; - item = this.items[$(e.currentTarget).index()]; - this.trigger('change', item); - return true; - }; - - return List; - - })(Spine.Controller); - - if (typeof module !== "undefined" && module !== null) { - module.exports = Spine.List; - } - -}).call(this); - -/* -//@ sourceMappingURL=list.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/list.map b/app/assets/javascripts/app/lib/spine/list.map deleted file mode 100755 index 44f03b886..000000000 --- a/app/assets/javascripts/app/lib/spine/list.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "list.js", - "sourceRoot": "..", - "sources": [ - "src/list.coffee" - ], - "names": [], - "mappings": ";AAAA;CAAA,KAAA,EAAA;KAAA;;oSAAA;;CAAA,CAAA,CAAS,CAAC,CAAV,EAAmB;;CAAnB,CACA,CAAS,EAAK;;CADd,CAGM,GAAK;CACT;;CAAA,EACE,GADF;CACE,CAAe,IAAf,CAAA,MAAA;CADF,KAAA;;CAAA,EAGa,EAHb,MAGA;;CAEa,EAAA,CAAA,UAAA;CACX,sCAAA;CAAA,KAAA,GAAA,8BAAA;CAAA,CACgB,EAAf,EAAD,EAAA;CAPF,IAKa;;CALb,EASU,KAAV,CAAU;CACR,WAAM,OAAN;CAVF,IASU;;CATV,EAYQ,CAAA,EAAR,GAAS;CACP,EAAW,CAAV,EAAD,CAAA;AAEO,CAAP,GAAA,EAAA,CAAA;CACE,GAAC,IAAD,GAAA;CACA,aAAA;QAJF;CAAA,GAMC,EAAD,EAAA,GAAA;CACA,EAAE,CAAC,CAAqB,EAAN,CAAhB,KAAF;CApBF,IAYQ;;CAZR,EAsBQ,EAAA,CAAR,GAAS;CACP,GAAkB,CAAlB,CAAA;CAAA,EAAS,CAAR,CAAD,GAAA;QAAA;CAAA,GACC,CAAK,CAAN,EAAM;CADN,GAEC,EAAD,CAAA;CACA,GAAG,EAAH,KAAA;AACS,CAAP,GAAA,EAAA,EAAA,CAAO;CACJ,GAAA,CAAD,GAAA,SAAA;UAFJ;QAJM;CAtBR,IAsBQ;;CAtBR,EA8BU,KAAV,CAAW;CACR,CAAE,CAAH,CAAC,IAAD,KAAA;CA/BF,IA8BU;;CA9BV,EAiCO,EAAP,IAAQ;CACN,GAAA,MAAA;CAAA,EAAO,CAAP,CAAc,CAAd,OAAc;CAAd,CACmB,EAAlB,EAAD,CAAA,CAAA;CAFK,YAGL;CApCF,IAiCO;;CAjCP;;CADuB,IAAK;;;CAuCtB,EAAU,CAAlB,CAAuB,CAAjB,CAAN;IA1CA;CAAA" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/local.coffee b/app/assets/javascripts/app/lib/spine/local.coffee new file mode 100755 index 000000000..ff3b688fe --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/local.coffee @@ -0,0 +1,17 @@ +Spine = @Spine or require('spine') + +Spine.Model.Local = + extended: -> + @change @saveLocal + @fetch @loadLocal + + saveLocal: -> + result = JSON.stringify(@) + localStorage[@className] = result + + loadLocal: (options = {})-> + options.clear = true unless options.hasOwnProperty('clear') + result = localStorage[@className] + @refresh(result or [], options) + +module?.exports = Spine.Model.Local \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/local.js b/app/assets/javascripts/app/lib/spine/local.js deleted file mode 100755 index 3ae68d976..000000000 --- a/app/assets/javascripts/app/lib/spine/local.js +++ /dev/null @@ -1,38 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -(function() { - var Spine; - - Spine = this.Spine || require('spine'); - - Spine.Model.Local = { - extended: function() { - this.change(this.saveLocal); - return this.fetch(this.loadLocal); - }, - saveLocal: function() { - var result; - result = JSON.stringify(this); - return localStorage[this.className] = result; - }, - loadLocal: function(options) { - var result; - if (options == null) { - options = {}; - } - if (!options.hasOwnProperty('clear')) { - options.clear = true; - } - result = localStorage[this.className]; - return this.refresh(result || [], options); - } - }; - - if (typeof module !== "undefined" && module !== null) { - module.exports = Spine.Model.Local; - } - -}).call(this); - -/* -//@ sourceMappingURL=local.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/local.map b/app/assets/javascripts/app/lib/spine/local.map deleted file mode 100755 index 538c8dd13..000000000 --- a/app/assets/javascripts/app/lib/spine/local.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "local.js", - "sourceRoot": "..", - "sources": [ - "src/local.coffee" - ], - "names": [], - "mappings": ";AAAA;CAAA,IAAA,CAAA;;CAAA,CAAA,CAAQ,CAAC,CAAT,EAAkB;;CAAlB,CAEA,CACE,EADG;CACH,CAAU,CAAA,CAAV,IAAA,CAAU;CACR,GAAC,EAAD,GAAA;CACC,GAAA,CAAD,IAAA,IAAA;CAFF,IAAU;CAAV,CAIW,CAAA,CAAX,KAAA;CACE,KAAA,IAAA;CAAA,EAAS,CAAI,EAAb,GAAS;CACI,EAAc,CAAb,KAAD,GAAA,CAAb;CANF,IAIW;CAJX,CAQW,CAAA,CAAX,GAAW,EAAX;CACE,KAAA,IAAA;;GADoB,KAAV;QACV;AAA4B,CAA5B,GAAA,EAAA,CAAmC,OAAP;CAA5B,EAAgB,CAAhB,CAAA,EAAO,CAAP;QAAA;CAAA,EACS,CAAc,EAAvB,GAAsB,GAAA;CACrB,CAAD,EAAC,EAAQ,CAAT,MAAA;CAXF,IAQW;CAXb,GAAA;;;CAgBQ,EAAU,CAAlB,CAAuB,CAAjB,CAAN;IAhBA;CAAA" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/manager.coffee b/app/assets/javascripts/app/lib/spine/manager.coffee new file mode 100755 index 000000000..3d44e39b0 --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/manager.coffee @@ -0,0 +1,83 @@ +Spine = @Spine or require('spine') +$ = Spine.$ + +class Spine.Manager extends Spine.Module + @include Spine.Events + + constructor: -> + @controllers = [] + @bind 'change', @change + @add(arguments...) + + add: (controllers...) -> + @addOne(cont) for cont in controllers + + addOne: (controller) -> + controller.bind 'active', (args...) => + @trigger('change', controller, args...) + controller.bind 'release', => + @controllers = (c for c in @controllers when c isnt controller) + + @controllers.push(controller) + + deactivate: -> + @trigger('change', false, arguments...) + + # Private + + change: (current, args...) -> + for cont in @controllers when cont isnt current + cont.deactivate(args...) + + current.activate(args...) if current + +Spine.Controller.include + active: (args...) -> + if typeof args[0] is 'function' + @bind('active', args[0]) + else + args.unshift('active') + @trigger(args...) + @ + + isActive: -> + @el.hasClass('active') + + activate: -> + @el.addClass('active') + @ + + deactivate: -> + @el.removeClass('active') + @ + +class Spine.Stack extends Spine.Controller + controllers: {} + routes: {} + + className: 'spine stack' + + constructor: -> + super + + @manager = new Spine.Manager + + for key, value of @controllers + throw Error "'@#{ key }' already assigned - choose a different name" if @[key]? + @[key] = new value(stack: @) + @add(@[key]) + + for key, value of @routes + do (key, value) => + callback = value if typeof value is 'function' + callback or= => @[value].active(arguments...) + @route(key, callback) + + @[@default].active() if @default + + add: (controller) -> + @manager.add(controller) + @append(controller) + +module?.exports = Spine.Manager +module?.exports.Stack = Spine.Stack diff --git a/app/assets/javascripts/app/lib/spine/manager.js b/app/assets/javascripts/app/lib/spine/manager.js deleted file mode 100755 index 9ce90e97f..000000000 --- a/app/assets/javascripts/app/lib/spine/manager.js +++ /dev/null @@ -1,162 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -(function() { - var $, Spine, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Spine = this.Spine || require('spine'); - - $ = Spine.$; - - Spine.Manager = (function(_super) { - __extends(Manager, _super); - - Manager.include(Spine.Events); - - function Manager() { - this.controllers = []; - this.bind('change', this.change); - this.add.apply(this, arguments); - } - - Manager.prototype.add = function() { - var cont, controllers, _i, _len, _results; - controllers = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _results = []; - for (_i = 0, _len = controllers.length; _i < _len; _i++) { - cont = controllers[_i]; - _results.push(this.addOne(cont)); - } - return _results; - }; - - Manager.prototype.addOne = function(controller) { - var _this = this; - controller.bind('active', function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return _this.trigger.apply(_this, ['change', controller].concat(__slice.call(args))); - }); - controller.bind('release', function() { - return _this.controllers.splice(_this.controllers.indexOf(controller), 1); - }); - return this.controllers.push(controller); - }; - - Manager.prototype.deactivate = function() { - return this.trigger.apply(this, ['change', false].concat(__slice.call(arguments))); - }; - - Manager.prototype.change = function() { - var args, cont, current, _i, _len, _ref; - current = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - _ref = this.controllers; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - cont = _ref[_i]; - if (cont !== current) { - cont.deactivate.apply(cont, args); - } - } - if (current) { - return current.activate.apply(current, args); - } - }; - - return Manager; - - })(Spine.Module); - - Spine.Controller.include({ - active: function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (typeof args[0] === 'function') { - this.bind('active', args[0]); - } else { - args.unshift('active'); - this.trigger.apply(this, args); - } - return this; - }, - isActive: function() { - return this.el.hasClass('active'); - }, - activate: function() { - this.el.addClass('active'); - return this; - }, - deactivate: function() { - this.el.removeClass('active'); - return this; - } - }); - - Spine.Stack = (function(_super) { - __extends(Stack, _super); - - Stack.prototype.controllers = {}; - - Stack.prototype.routes = {}; - - Stack.prototype.className = 'spine stack'; - - function Stack() { - var key, value, _fn, _ref, _ref1, - _this = this; - Stack.__super__.constructor.apply(this, arguments); - this.manager = new Spine.Manager; - _ref = this.controllers; - for (key in _ref) { - value = _ref[key]; - if (this[key] != null) { - throw Error("'@" + key + "' already assigned - choose a different name"); - } - this[key] = new value({ - stack: this - }); - this.add(this[key]); - } - _ref1 = this.routes; - _fn = function(key, value) { - var callback; - if (typeof value === 'function') { - callback = value; - } - callback || (callback = function() { - var _ref2; - return (_ref2 = _this[value]).active.apply(_ref2, arguments); - }); - return _this.route(key, callback); - }; - for (key in _ref1) { - value = _ref1[key]; - _fn(key, value); - } - if (this["default"]) { - this[this["default"]].active(); - } - } - - Stack.prototype.add = function(controller) { - this.manager.add(controller); - return this.append(controller); - }; - - return Stack; - - })(Spine.Controller); - - if (typeof module !== "undefined" && module !== null) { - module.exports = Spine.Manager; - } - - if (typeof module !== "undefined" && module !== null) { - module.exports.Stack = Spine.Stack; - } - -}).call(this); - -/* -//@ sourceMappingURL=manager.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/manager.map b/app/assets/javascripts/app/lib/spine/manager.map deleted file mode 100755 index 6a10eb252..000000000 --- a/app/assets/javascripts/app/lib/spine/manager.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "manager.js", - "sourceRoot": "..", - "sources": [ - "src/manager.coffee" - ], - "names": [], - "mappings": ";AAAA;CAAA,KAAA,EAAA;KAAA;;uBAAA;;CAAA,CAAA,CAAS,CAAC,CAAV,EAAmB;;CAAnB,CACA,CAAS,EAAK;;CADd,CAGM,GAAK;CACT;;CAAA,GAAA,CAAc,CAAd,CAAC;;CAEY,EAAA,CAAA,aAAA;CACX,CAAA,CAAe,CAAd,EAAD,KAAA;CAAA,CACgB,EAAf,EAAD,EAAA;CADA,EAEA,CAAC,EAAD,GAAA,IAAK;CALP,IAEa;;CAFb,EAOA,MAAK;CACH,SAAA,2BAAA;CAAA,KADI,iDACJ;AAAA,CAAA;YAAA,sCAAA;gCAAA;CAAA,GAAC,EAAD;CAAA;uBADG;CAPL,IAOK;;CAPL,EAUQ,GAAR,GAAS,CAAD;CACN,SAAA,EAAA;CAAA,CAA0B,CAAA,CAA1B,EAAA,EAAA,CAA0B,CAAhB;CACR,GAAA,QAAA;CAAA,OADyB,+CACzB;CAAC,CAAkB,EAAY,CAA9B,EAAD,CAAS,CAAsB,CAAA,GAAA,CAAtB,CAAT;CADF,MAA0B;CAA1B,CAE2B,CAAA,CAA3B,EAAA,GAAA,CAAU;CACP,CAAqD,GAArD,CAAD,CAAoB,GAAA,CAAR,IAAZ;CADF,MAA2B;CAG1B,GAAA,MAAD,CAAY,EAAZ;CAhBF,IAUQ;;CAVR,EAkBY,MAAA,CAAZ;CACG,CAAkB,EAAlB,CAAyB,EAA1B,CAAS,CAAiB,IAA1B;CAnBF,IAkBY;;CAlBZ,EAuBQ,GAAR,GAAQ;CACN,SAAA,yBAAA;CAAA,CADgB,IAAT,iDACP;CAAA;CAAA,UAAA,gCAAA;yBAAA;IAA8B,CAAU;CACtC,GAAI,MAAJ,GAAgB;UADlB;CAAA,MAAA;CAGA,GAA6B,EAA7B,CAAA;CAAQ,GAAR,GAAO,CAAP,OAAA,CAAiB;QAJX;CAvBR,IAuBQ;;CAvBR;;CAD0B,IAAK;;CAHjC,CAiCA,GAAK,EAAL,GAAgB;CACd,CAAQ,CAAA,CAAR,EAAA,GAAQ;CACN,GAAA,MAAA;CAAA,KADO,iDACP;AAAG,CAAH,GAAG,CAAkB,CAArB,IAAA;CACE,CAAgB,EAAf,IAAD;MADF,EAAA;CAGE,GAAI,GAAJ,CAAA;CAAA,GACC,GAAD,CAAA,KAAS;QAJX;CADM,YAMN;CANF,IAAQ;CAAR,CAQU,CAAA,CAAV,IAAA,CAAU;CACP,CAAE,EAAF,IAAD,KAAA;CATF,IAQU;CARV,CAWU,CAAA,CAAV,IAAA,CAAU;CACR,CAAG,EAAF,EAAD,EAAA;CADQ,YAER;CAbF,IAWU;CAXV,CAeY,CAAA,CAAZ,KAAY,CAAZ;CACE,CAAG,EAAF,EAAD,EAAA,GAAA;CADU,YAEV;CAjBF,IAeY;CAjDd,GAiCA;;CAjCA,CAqDM,GAAK;CACT;;CAAA,CAAA,CAAa,QAAb;;CAAA,CAAA,CACQ,GAAR;;CADA,EAGW,MAAX,IAHA;;CAKa,EAAA,CAAA,WAAA;CACX,SAAA,kBAAA;SAAA,GAAA;CAAA,KAAA,GAAA,+BAAA;AAEW,CAFX,EAEW,CAAV,CAAmB,CAApB,CAAA;CAEA;CAAA,UAAA;2BAAA;CACE,GAAwE,IAAxE,SAAA;CAAA,EAAL,CAAkB,CAAP,WAAA,8BAAA;UAAN;CAAA,EACE,CAAA,CAAW,GAAb;CAAmB,CAAO,EAAP,CAAA,KAAA;CADnB,SACa;CADb,EAEA,CAAC,IAAD;CAHF,MAJA;CASA;CAAA,CACW,CAAN,EAAA,IAAC;CACF,OAAA,IAAA;AAAoB,CAApB,GAAoB,CAAA,CAAA,EAApB,EAAA;CAAA,EAAW,EAAX,GAAA,EAAA;UAAA;CAAA,EACa,KAAb,CAAa;CAAG,IAAA,SAAA;CAAE,IAAA,CAAF,GAAA,KAAgB,GAAhB;CADhB,QACa;CACZ,CAAW,CAAZ,EAAC,GAAD,OAAA;CAJJ,MACK;CADL,UAAA,CAAA;4BAAA;CACE,CAAS;CADX,MATA;CAeA,GAAwB,EAAxB,GAAyB;CAAzB,GAAE,EAAF,EAAA,CAAG;QAhBQ;CALb,IAKa;;CALb,EAuBA,MAAM,CAAD;CACH,EAAA,CAAC,EAAD,CAAQ,GAAR;CACC,GAAA,EAAD,IAAA,GAAA;CAzBF,IAuBK;;CAvBL;;CADwB,IAAK;;;CA4BvB,EAAU,CAAlB,CAAuB,CAAjB,CAAN;IAjFA;;;CAkFQ,EAAgB,CAAxB,CAAA,CAAM,CAAS;IAlFf;CAAA" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/relation.coffee b/app/assets/javascripts/app/lib/spine/relation.coffee new file mode 100755 index 000000000..2c506709f --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/relation.coffee @@ -0,0 +1,137 @@ +Spine = @Spine or require('spine') +isArray = Spine.isArray +require = @require or ((value) -> eval(value)) + +class Collection extends Spine.Module + constructor: (options = {}) -> + for key, value of options + @[key] = value + + all: -> + @model.select (rec) => @associated(rec) + + first: -> + @all()[0] + + last: -> + values = @all() + values[values.length - 1] + + count: -> + @all().length + + find: (id, notFound = @model.notFound) -> + records = @select (rec) => + "#{rec.id}" is "#{id}" + return records[0] or notFound?(id) + + findAllByAttribute: (name, value) -> + @model.select (rec) => + @associated(rec) and rec[name] is value + + findByAttribute: (name, value) -> + @findAllByAttribute(name, value)[0] + + select: (cb) -> + @model.select (rec) => + @associated(rec) and cb(rec) + + refresh: (values) -> + return this unless values? + for record in @all() + delete @model.irecords[record.id] + for match, i in @model.records when match.id is record.id + @model.records.splice(i, 1) + break + values = [values] unless isArray(values) + for record in values + record.newRecord = false + record[@fkey] = @record.id + @model.refresh values + this + + create: (record, options) -> + record[@fkey] = @record.id + @model.create(record, options) + + add: (record, options) -> + record.updateAttribute @fkey, @record.id, options + + remove: (record, options) -> + record.updateAttribute @fkey, null, options + + # Private + + associated: (record) -> + record[@fkey] is @record.id + +class Instance extends Spine.Module + constructor: (options = {}) -> + for key, value of options + @[key] = value + + exists: -> + return if @record[@fkey] then @model.exists(@record[@fkey]) else false + + find: -> + return @model.find(@record[@fkey]) + + update: (value) -> + return this unless value? + unless value instanceof @model + value = new @model(value) + value.save() if value.isNew() + @record[@fkey] = value and value.id + this + +class Singleton extends Spine.Module + constructor: (options = {}) -> + for key, value of options + @[key] = value + + find: -> + @record.id and @model.findByAttribute(@fkey, @record.id) + + update: (value) -> + return this unless value? + unless value instanceof @model + value = @model.fromJSON(value) + + value[@fkey] = @record.id + value.save() + this + +singularize = (str) -> + str.replace(/s$/, '') + +underscore = (str) -> + str.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase() + +association = (name, model, record, fkey, Ctor) -> + model = require(model) if typeof model is 'string' + new Ctor(name: name, model: model, record: record, fkey: fkey) + +Spine.Model.extend + hasMany: (name, model, fkey) -> + fkey ?= "#{underscore(this.className)}_id" + @::[name] = (value) -> + association(name, model, @, fkey, Collection).refresh(value) + + belongsTo: (name, model, fkey) -> + fkey ?= "#{underscore(singularize(name))}_id" + @::[name] = (value) -> + association(name, model, @, fkey, Instance).update(value).find() + @attributes.push(fkey) + + hasOne: (name, model, fkey) -> + fkey ?= "#{underscore(@className)}_id" + @::[name] = (value) -> + association(name, model, @, fkey, Singleton).update(value).find() + +Spine.Collection = Collection +Spine.Singleton = Singleton +Spine.Instance = Instance diff --git a/app/assets/javascripts/app/lib/spine/relation.js b/app/assets/javascripts/app/lib/spine/relation.js deleted file mode 100755 index 0afb8d4f1..000000000 --- a/app/assets/javascripts/app/lib/spine/relation.js +++ /dev/null @@ -1,264 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -(function() { - var Collection, Instance, Singleton, Spine, association, isArray, require, singularize, underscore, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Spine = this.Spine || require('spine'); - - isArray = Spine.isArray; - - require = this.require || (function(value) { - return eval(value); - }); - - Collection = (function(_super) { - __extends(Collection, _super); - - function Collection(options) { - var key, value; - if (options == null) { - options = {}; - } - for (key in options) { - value = options[key]; - this[key] = value; - } - } - - Collection.prototype.all = function() { - var _this = this; - return this.model.select(function(rec) { - return _this.associated(rec); - }); - }; - - Collection.prototype.first = function() { - return this.all()[0]; - }; - - Collection.prototype.last = function() { - var values; - values = this.all(); - return values[values.length - 1]; - }; - - Collection.prototype.count = function() { - return this.all().length; - }; - - Collection.prototype.find = function(id) { - var records, - _this = this; - records = this.select(function(rec) { - return ("" + rec.id) === ("" + id); - }); - if (!records[0]) { - throw new Error("\"" + this.model.className + "\" model could not find a record for the ID \"" + id + "\""); - } - return records[0]; - }; - - Collection.prototype.findAllByAttribute = function(name, value) { - var _this = this; - return this.model.select(function(rec) { - return _this.associated(rec) && rec[name] === value; - }); - }; - - Collection.prototype.findByAttribute = function(name, value) { - return this.findAllByAttribute(name, value)[0]; - }; - - Collection.prototype.select = function(cb) { - var _this = this; - return this.model.select(function(rec) { - return _this.associated(rec) && cb(rec); - }); - }; - - Collection.prototype.refresh = function(values) { - var i, match, record, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - if (values == null) { - return this; - } - _ref = this.all(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - record = _ref[_i]; - delete this.model.irecords[record.id]; - _ref1 = this.model.records; - for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { - match = _ref1[i]; - if (!(match.id === record.id)) { - continue; - } - this.model.records.splice(i, 1); - break; - } - } - if (!isArray(values)) { - values = [values]; - } - for (_k = 0, _len2 = values.length; _k < _len2; _k++) { - record = values[_k]; - record.newRecord = false; - record[this.fkey] = this.record.id; - } - this.model.refresh(values); - return this; - }; - - Collection.prototype.create = function(record, options) { - record[this.fkey] = this.record.id; - return this.model.create(record, options); - }; - - Collection.prototype.add = function(record, options) { - return record.updateAttribute(this.fkey, this.record.id, options); - }; - - Collection.prototype.remove = function(record, options) { - return record.updateAttribute(this.fkey, null, options); - }; - - Collection.prototype.associated = function(record) { - return record[this.fkey] === this.record.id; - }; - - return Collection; - - })(Spine.Module); - - Instance = (function(_super) { - __extends(Instance, _super); - - function Instance(options) { - var key, value; - if (options == null) { - options = {}; - } - for (key in options) { - value = options[key]; - this[key] = value; - } - } - - Instance.prototype.exists = function() { - if (this.record[this.fkey]) { - return this.model.exists(this.record[this.fkey]); - } else { - return false; - } - }; - - Instance.prototype.update = function(value) { - if (value == null) { - return this; - } - if (!(value instanceof this.model)) { - value = new this.model(value); - } - if (value.isNew()) { - value.save(); - } - this.record[this.fkey] = value && value.id; - return this; - }; - - return Instance; - - })(Spine.Module); - - Singleton = (function(_super) { - __extends(Singleton, _super); - - function Singleton(options) { - var key, value; - if (options == null) { - options = {}; - } - for (key in options) { - value = options[key]; - this[key] = value; - } - } - - Singleton.prototype.find = function() { - return this.record.id && this.model.findByAttribute(this.fkey, this.record.id); - }; - - Singleton.prototype.update = function(value) { - if (value == null) { - return this; - } - if (!(value instanceof this.model)) { - value = this.model.fromJSON(value); - } - value[this.fkey] = this.record.id; - value.save(); - return this; - }; - - return Singleton; - - })(Spine.Module); - - singularize = function(str) { - return str.replace(/s$/, ''); - }; - - underscore = function(str) { - return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\d])([A-Z])/g, '$1_$2').replace(/-/g, '_').toLowerCase(); - }; - - association = function(name, model, record, fkey, Ctor) { - if (typeof model === 'string') { - model = require(model); - } - return new Ctor({ - name: name, - model: model, - record: record, - fkey: fkey - }); - }; - - Spine.Model.extend({ - hasMany: function(name, model, fkey) { - if (fkey == null) { - fkey = "" + (underscore(this.className)) + "_id"; - } - return this.prototype[name] = function(value) { - return association(name, model, this, fkey, Collection).refresh(value); - }; - }, - belongsTo: function(name, model, fkey) { - if (fkey == null) { - fkey = "" + (underscore(singularize(name))) + "_id"; - } - this.prototype[name] = function(value) { - return association(name, model, this, fkey, Instance).update(value).exists(); - }; - return this.attributes.push(fkey); - }, - hasOne: function(name, model, fkey) { - if (fkey == null) { - fkey = "" + (underscore(this.className)) + "_id"; - } - return this.prototype[name] = function(value) { - return association(name, model, this, fkey, Singleton).update(value).find(); - }; - } - }); - - Spine.Collection = Collection; - - Spine.Singleton = Singleton; - - Spine.Instance = Instance; - -}).call(this); - -/* -//@ sourceMappingURL=relation.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/relation.map b/app/assets/javascripts/app/lib/spine/relation.map deleted file mode 100755 index adc49d975..000000000 --- a/app/assets/javascripts/app/lib/spine/relation.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "relation.js", - "sourceRoot": "..", - "sources": [ - "src/relation.coffee" - ], - "names": [], - "mappings": ";AAAA;CAAA,KAAA,wFAAA;KAAA;oSAAA;;CAAA,CAAA,CAAU,CAAC,CAAX,EAAoB;;CAApB,CACA,CAAU,EAAK,EAAf;;CADA,CAEA,CAAU,CAAC,CAAY,EAAvB,EAAwB;CAAe,GAAL,CAAA,MAAA;CAAZ,EAAC;;CAFvB,CAIM;CACJ;;CAAa,EAAA,CAAA,GAAA,aAAC;CACZ,SAAA;;GADsB,KAAV;QACZ;AAAA,CAAA,UAAA,GAAA;8BAAA;CACE,EAAE,CAAA,CAAF,GAAA;CADF,MADW;CAAb,IAAa;;CAAb,EAIA,MAAK;CACH,SAAA,EAAA;CAAC,EAAa,CAAb,CAAK,CAAN,GAAe,IAAf;CAAwB,EAAD,EAAC,KAAD,KAAA;CAAvB,MAAc;CALhB,IAIK;;CAJL,EAOO,EAAP,IAAO;CACJ,EAAD,CAAC,SAAD;CARF,IAOO;;CAPP,EAUM,CAAN,KAAM;CACJ,KAAA,IAAA;CAAA,EAAS,CAAC,EAAV;CACO,EAAgB,GAAhB,OAAP;CAZF,IAUM;;CAVN,EAcO,EAAP,IAAO;CACJ,EAAD,CAAC,SAAD;CAfF,IAcO;;CAdP,CAiBM,CAAA,CAAN,KAAO;CACL,MAAA,GAAA;SAAA,GAAA;CAAA,EAAU,CAAC,EAAX,CAAA,EAAmB;CACjB,CAAA,CAAE,EAAa,UAAf;CADQ,MAAQ;AAEmF,CAArG,GAAA,EAAA,CAA6G;CAA7G,CAAiB,CAAG,CAAV,CAAA,IAAO,KAAP,kCAAO;QAFjB;CAGQ,MAAA,MAAR;CArBF,IAiBM;;CAjBN,CAuB2B,CAAP,CAAA,CAAA,IAAC,SAArB;CACE,SAAA,EAAA;CAAC,EAAa,CAAb,CAAK,CAAN,GAAe,IAAf;CACG,EAAD,CAAqB,CAApB,KAAD,KAAA;CADF,MAAc;CAxBhB,IAuBoB;;CAvBpB,CA2BwB,CAAP,CAAA,CAAA,IAAC,MAAlB;CACG,CAAyB,EAAzB,CAAD,QAAA,KAAA;CA5BF,IA2BiB;;CA3BjB,CA8BQ,CAAA,GAAR,GAAS;CACP,SAAA,EAAA;CAAC,EAAa,CAAb,CAAK,CAAN,GAAe,IAAf;CACG,CAAoB,CAArB,CAAqB,CAApB,KAAD,KAAA;CADF,MAAc;CA/BhB,IA8BQ;;CA9BR,EAkCS,GAAA,CAAT,EAAU;CACR,SAAA,mDAAA;CAAA,GAAmB,EAAnB,QAAA;CAAA,GAAA,WAAO;QAAP;CACA;CAAA,UAAA,gCAAA;2BAAA;AACE,CAAA,CAAuB,EAAf,CAAK,CAAb,EAAA;CACA;CAAA,YAAA,yCAAA;4BAAA;CAAoC,CAAA,GAAK,CAAa;;YACpD;CAAA,CAAyB,EAAxB,CAAK,CAAN,CAAc,GAAd;CACA,eAFF;CAAA,QAFF;CAAA,MADA;AAMyB,CAAzB,GAAA,EAAA,CAAyB;CAAzB,EAAS,GAAT,EAAA;QANA;AAOA,CAAA,UAAA,oCAAA;6BAAA;CACE,EAAmB,EAAnB,CAAM,EAAN,CAAA;CAAA,CAAA,CACgB,CAAR,EAAD,EAAP;CAFF,MAPA;CAAA,GAUC,CAAK,CAAN,CAAA;CAXO,YAYP;CA9CF,IAkCS;;CAlCT,CAgDiB,CAAT,GAAR,CAAQ,EAAC;CACP,CAAA,CAAgB,CAAR,EAAR;CACC,CAAqB,EAArB,CAAK,CAAN,CAAA,MAAA;CAlDF,IAgDQ;;CAhDR,CAoDc,CAAd,GAAK,CAAA,EAAC;CACG,CAAuB,EAAN,EAAlB,CAAN,MAAA,EAAA;CArDF,IAoDK;;CApDL,CAuDiB,CAAT,GAAR,CAAQ,EAAC;CACA,CAAuB,EAAN,EAAlB,CAAN,MAAA,EAAA;CAxDF,IAuDQ;;CAvDR,EA4DY,GAAA,GAAC,CAAb;CACS,GAAC,CAAS,CAAV,OAAP;CA7DF,IA4DY;;CA5DZ;;CADuB,IAAK;;CAJ9B,CAoEM;CACJ;;CAAa,EAAA,CAAA,GAAA,WAAC;CACZ,SAAA;;GADsB,KAAV;QACZ;AAAA,CAAA,UAAA,GAAA;8BAAA;CACE,EAAE,CAAA,CAAF,GAAA;CADF,MADW;CAAb,IAAa;;CAAb,EAIQ,GAAR,GAAQ;CACC,GAAG,EAAH;CAAwB,GAAA,CAAK,CAAN,SAAA;MAAvB,EAAA;CAAA,cAA0D;QAD3D;CAJR,IAIQ;;CAJR,EAOQ,EAAA,CAAR,GAAS;CACP,GAAmB,EAAnB,OAAA;CAAA,GAAA,WAAO;QAAP;AACA,CAAA,GAAA,CAAO,CAAP,MAAwB;CACtB,EAAY,CAAA,CAAZ,GAAA;QAFF;CAGA,GAAgB,CAAK,CAArB;CAAA,GAAA,CAAK,GAAL;QAHA;CAAA,CAAA,CAIiB,CAAhB,CAAgB,CAAjB;CALM,YAMN;CAbF,IAOQ;;CAPR;;CADqB,IAAK;;CApE5B,CAoFM;CACJ;;CAAa,EAAA,CAAA,GAAA,YAAC;CACZ,SAAA;;GADsB,KAAV;QACZ;AAAA,CAAA,UAAA,GAAA;8BAAA;CACE,EAAE,CAAA,CAAF,GAAA;CADF,MADW;CAAb,IAAa;;CAAb,EAIM,CAAN,KAAM;CACH,CAAD,EAAC,CAAoB,CAAd,OAAP,EAAe;CALjB,IAIM;;CAJN,EAOQ,EAAA,CAAR,GAAS;CACP,GAAmB,EAAnB,OAAA;CAAA,GAAA,WAAO;QAAP;AACA,CAAA,GAAA,CAAO,CAAP,MAAwB;CACtB,EAAQ,CAAC,CAAT,GAAA;QAFF;CAAA,CAAA,CAIe,CAAR,CAAD,CAAN;CAJA,GAKA,CAAK,CAAL;CANM,YAON;CAdF,IAOQ;;CAPR;;CADsB,IAAK;;CApF7B,CAqGA,CAAc,MAAC,EAAf;CACM,CAAc,CAAf,CAAH,GAAA,IAAA;CAtGF,EAqGc;;CArGd,CAwGA,CAAa,MAAC,CAAd;CACM,CAAe,CAAhB,CAAH,CAAA,EAAA,IAAA,QAAA,IAAA;CAzGF,EAwGa;;CAxGb,CA+GA,CAAc,CAAA,CAAA,CAAA,GAAC,EAAf;AAC4B,CAA1B,GAAA,CAA0B,CAAA,EAA1B;CAAA,EAAQ,EAAR,CAAA,CAAQ;MAAR;CACS,GAAL,OAAA;CAAK,CAAM,EAAN,EAAA;CAAA,CAAmB,GAAP,CAAA;CAAZ,CAAkC,IAAR;CAA1B,CAAgD,EAAN,EAAA;CAFvC,KAER;CAjHN,EA+Gc;;CA/Gd,CAmHA,GAAK,CAAL;CACE,CAAS,CAAA,CAAT,CAAS,EAAT,EAAU;;CACE,CAAF,CAAA,CAAiB,IAAzB,CAAU,CAAA;QAAV;CACC,EAAW,CAAX,CAAW,IAAR,IAAJ;CACc,CAAM,EAAlB,CAAA,EAAA,GAAA,CAAA,IAAA;CAHK,MAEK;CAFd,IAAS;CAAT,CAKW,CAAA,CAAX,CAAW,IAAX;;CACY,CAAF,CAAA,CAAa,IAArB,EAAU,CAAW;QAArB;CAAA,EACY,CAAX,CAAW,CAAZ,GAAI;CACU,CAAM,EAAlB,CAAA,CAAA,EAAA,GAAA,IAAA;CAFF,MACY;CAGX,GAAA,MAAU,GAAX;CAVF,IAKW;CALX,CAYQ,CAAA,CAAR,CAAQ,CAAR,GAAS;;CACG,CAAF,CAAA,CAAc,IAAtB,CAAU,CAAA;QAAV;CACC,EAAW,CAAX,CAAW,IAAR,IAAJ;CACc,CAAM,EAAlB,CAAA,CAAA,GAAA,EAAA,IAAA;CAHI,MAEM;CAdd,IAYQ;CAhIV,GAmHA;;CAnHA,CAqIA,CAAmB,EAAd,KAAL;;CArIA,CAsIA,CAAkB,EAAb,IAAL;;CAtIA,CAuIA,CAAiB,EAAZ,GAAL;CAvIA" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/route.coffee b/app/assets/javascripts/app/lib/spine/route.coffee new file mode 100755 index 000000000..0ecb63275 --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/route.coffee @@ -0,0 +1,159 @@ +Spine = @Spine or require('spine') +$ = Spine.$ + +hashStrip = /^#*/ +namedParam = /:([\w\d]+)/g +splatParam = /\*([\w\d]+)/g +escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g + +class Spine.Route extends Spine.Module + @extend Spine.Events + + @historySupport: window.history?.pushState? + + @routes: [] + + @options: + trigger: true + history: false + shim: false + replace: false + redirect: false + + @add: (path, callback) -> + if (typeof path is 'object' and path not instanceof RegExp) + @add(key, value) for key, value of path + else + @routes.push(new @(path, callback)) + + @setup: (options = {}) -> + @options = $.extend({}, @options, options) + + if (@options.history) + @history = @historySupport and @options.history + + return if @options.shim + + if @history + $(window).bind('popstate', @change) + else + $(window).bind('hashchange', @change) + @change() + + @unbind: -> + return if @options.shim + + if @history + $(window).unbind('popstate', @change) + else + $(window).unbind('hashchange', @change) + + @navigate: (args...) -> + options = {} + + lastArg = args[args.length - 1] + if typeof lastArg is 'object' + options = args.pop() + else if typeof lastArg is 'boolean' + options.trigger = args.pop() + + options = $.extend({}, @options, options) + + path = args.join('/') + return if @path is path + @path = path + + @trigger('navigate', @path) + + route = @matchRoute(@path, options) if options.trigger + + return if options.shim + + if !route + if typeof options.redirect is 'function' + return options.redirect.apply this, [@path, options] + else + if options.redirect is true + @redirect(@path) + + if @history and options.replace + history.replaceState({}, document.title, @path) + else if @history + history.pushState({}, document.title, @path) + else + window.location.hash = @path + + # Private + + @getPath: -> + if @history + path = window.location.pathname + path = '/' + path if path.substr(0,1) isnt '/' + else + path = window.location.hash + path = path.replace(hashStrip, '') + path + + @getHost: -> + "#{window.location.protocol}//#{window.location.host}" + + @change: -> + path = @getPath() + return if path is @path + @path = path + @matchRoute(@path) + + @matchRoute: (path, options) -> + for route in @routes when route.match(path, options) + @trigger('change', route, path) + return route + + @redirect: (path) -> + window.location = path + + constructor: (@path, @callback) -> + @names = [] + + if typeof path is 'string' + namedParam.lastIndex = 0 + while (match = namedParam.exec(path)) != null + @names.push(match[1]) + + splatParam.lastIndex = 0 + while (match = splatParam.exec(path)) != null + @names.push(match[1]) + + path = path.replace(escapeRegExp, '\\$&') + .replace(namedParam, '([^\/]*)') + .replace(splatParam, '(.*?)') + + @route = new RegExp("^#{path}$") + else + @route = path + + match: (path, options = {}) -> + match = @route.exec(path) + return false unless match + options.match = match + params = match.slice(1) + + if @names.length + for param, i in params + options[@names[i]] = param + @.constructor.trigger('before', @) + @callback.call(null, options) isnt false + +# Coffee-script bug +Spine.Route.change = Spine.Route.proxy(Spine.Route.change) + +Spine.Controller.include + route: (path, callback) -> + Spine.Route.add(path, @proxy(callback)) + + routes: (routes) -> + @route(key, value) for key, value of routes + + navigate: -> + Spine.Route.navigate.apply(Spine.Route, arguments) + +module?.exports = Spine.Route diff --git a/app/assets/javascripts/app/lib/spine/route.js b/app/assets/javascripts/app/lib/spine/route.js deleted file mode 100755 index 4f2a81bb0..000000000 --- a/app/assets/javascripts/app/lib/spine/route.js +++ /dev/null @@ -1,242 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -(function() { - var $, Spine, escapeRegExp, hashStrip, namedParam, splatParam, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Spine = this.Spine || require('spine'); - - $ = Spine.$; - - hashStrip = /^#*/; - - namedParam = /:([\w\d]+)/g; - - splatParam = /\*([\w\d]+)/g; - - escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; - - Spine.Route = (function(_super) { - var _ref; - - __extends(Route, _super); - - Route.extend(Spine.Events); - - Route.historySupport = ((_ref = window.history) != null ? _ref.pushState : void 0) != null; - - Route.routes = []; - - Route.options = { - trigger: true, - history: false, - shim: false, - replace: false, - redirect: false - }; - - Route.add = function(path, callback) { - var key, value, _results; - if (typeof path === 'object' && !(path instanceof RegExp)) { - _results = []; - for (key in path) { - value = path[key]; - _results.push(this.add(key, value)); - } - return _results; - } else { - return this.routes.push(new this(path, callback)); - } - }; - - Route.setup = function(options) { - if (options == null) { - options = {}; - } - this.options = $.extend({}, this.options, options); - if (this.options.history) { - this.history = this.historySupport && this.options.history; - } - if (this.options.shim) { - return; - } - if (this.history) { - $(window).bind('popstate', this.change); - } else { - $(window).bind('hashchange', this.change); - } - return this.change(); - }; - - Route.unbind = function() { - if (this.options.shim) { - return; - } - if (this.history) { - return $(window).unbind('popstate', this.change); - } else { - return $(window).unbind('hashchange', this.change); - } - }; - - Route.navigate = function() { - var args, lastArg, options, path, route; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - options = {}; - lastArg = args[args.length - 1]; - if (typeof lastArg === 'object') { - options = args.pop(); - } else if (typeof lastArg === 'boolean') { - options.trigger = args.pop(); - } - options = $.extend({}, this.options, options); - path = args.join('/'); - if (this.path === path) { - return; - } - this.path = path; - this.trigger('navigate', this.path); - if (options.trigger) { - route = this.matchRoute(this.path, options); - } - if (options.shim) { - return; - } - if (!route) { - if (typeof options.redirect === 'function') { - return options.redirect.apply(this, [this.path, options]); - } else { - if (options.redirect === true) { - this.redirect(this.path); - } - } - } - if (this.history && options.replace) { - return history.replaceState({}, document.title, this.path); - } else if (this.history) { - return history.pushState({}, document.title, this.path); - } else { - return window.location.hash = this.path; - } - }; - - Route.getPath = function() { - var path; - if (this.history) { - path = window.location.pathname; - if (path.substr(0, 1) !== '/') { - path = '/' + path; - } - } else { - path = window.location.hash; - path = path.replace(hashStrip, ''); - } - return path; - }; - - Route.getHost = function() { - return "" + window.location.protocol + "//" + window.location.host; - }; - - Route.change = function() { - var path; - path = this.getPath(); - if (path === this.path) { - return; - } - this.path = path; - return this.matchRoute(this.path); - }; - - Route.matchRoute = function(path, options) { - var route, _i, _len, _ref1; - _ref1 = this.routes; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - route = _ref1[_i]; - if (!(route.match(path, options))) { - continue; - } - this.trigger('change', route, path); - return route; - } - }; - - Route.redirect = function(path) { - return window.location = path; - }; - - function Route(path, callback) { - var match; - this.path = path; - this.callback = callback; - this.names = []; - if (typeof path === 'string') { - namedParam.lastIndex = 0; - while ((match = namedParam.exec(path)) !== null) { - this.names.push(match[1]); - } - splatParam.lastIndex = 0; - while ((match = splatParam.exec(path)) !== null) { - this.names.push(match[1]); - } - path = path.replace(escapeRegExp, '\\$&').replace(namedParam, '([^\/]*)').replace(splatParam, '(.*?)'); - this.route = new RegExp("^" + path + "$"); - } else { - this.route = path; - } - } - - Route.prototype.match = function(path, options) { - var i, match, param, params, _i, _len; - if (options == null) { - options = {}; - } - match = this.route.exec(path); - if (!match) { - return false; - } - options.match = match; - params = match.slice(1); - if (this.names.length) { - for (i = _i = 0, _len = params.length; _i < _len; i = ++_i) { - param = params[i]; - options[this.names[i]] = param; - } - } - return this.callback.call(null, options) !== false; - }; - - return Route; - - })(Spine.Module); - - Spine.Route.change = Spine.Route.proxy(Spine.Route.change); - - Spine.Controller.include({ - route: function(path, callback) { - return Spine.Route.add(path, this.proxy(callback)); - }, - routes: function(routes) { - var key, value, _results; - _results = []; - for (key in routes) { - value = routes[key]; - _results.push(this.route(key, value)); - } - return _results; - }, - navigate: function() { - return Spine.Route.navigate.apply(Spine.Route, arguments); - } - }); - - if (typeof module !== "undefined" && module !== null) { - module.exports = Spine.Route; - } - -}).call(this); - -/* -//@ sourceMappingURL=route.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/route.map b/app/assets/javascripts/app/lib/spine/route.map deleted file mode 100755 index 27453dd8e..000000000 --- a/app/assets/javascripts/app/lib/spine/route.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "route.js", - "sourceRoot": "..", - "sources": [ - "src/route.coffee" - ], - "names": [], - "mappings": "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" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/spine.coffee b/app/assets/javascripts/app/lib/spine/spine.coffee new file mode 100755 index 000000000..7c898f181 --- /dev/null +++ b/app/assets/javascripts/app/lib/spine/spine.coffee @@ -0,0 +1,659 @@ +### +Spine.js MVC library +Released under the MIT License +### + +Events = + bind: (ev, callback) -> + evs = ev.split(' ') + @_callbacks = {} unless @hasOwnProperty('_callbacks') and @_callbacks + for name in evs + @_callbacks[name] or= [] + @_callbacks[name].push(callback) + this + + one: (ev, callback) -> + @bind ev, handler = -> + @unbind(ev, handler) + callback.apply(this, arguments) + + trigger: (args...) -> + ev = args.shift() + list = @hasOwnProperty('_callbacks') and @_callbacks?[ev] + return unless list + for callback in list + if callback.apply(this, args) is false + break + true + + listenTo: (obj, ev, callback) -> + obj.bind(ev, callback) + @listeningTo or= [] + @listeningTo.push {obj, ev, callback} + this + + listenToOnce: (obj, ev, callback) -> + listeningToOnce = @listeningToOnce or= [] + obj.bind ev, handler = -> + idx = -1 + for lt, i in listeningToOnce when lt.obj is obj + idx = i if lt.ev is ev and lt.callback is callback + obj.unbind(ev, handler) + listeningToOnce.splice(idx, 1) unless idx is -1 + callback.apply(this, arguments) + listeningToOnce.push {obj, ev, callback, handler} + this + + stopListening: (obj, events, callback) -> + if arguments.length is 0 + for listeningTo in [@listeningTo, @listeningToOnce] + continue unless listeningTo + for lt in listeningTo + lt.obj.unbind(lt.ev, lt.handler or lt.callback) + @listeningTo = undefined + @listeningToOnce = undefined + + else if obj + for listeningTo in [@listeningTo, @listeningToOnce] + continue unless listeningTo + events = if events then events.split(' ') else [undefined] + for ev in events + for idx in [listeningTo.length-1..0] + lt = listeningTo[idx] + continue if callback and (lt.handler or lt.callback) isnt callback + if (not ev) or (ev is lt.ev) + lt.obj.unbind(lt.ev, lt.handler or lt.callback) + listeningTo.splice(idx, 1) unless idx is -1 + else if ev + evts = lt.ev.split(' ') + if ev in evts + evts = (e for e in evts when e isnt ev) + lt.ev = $.trim(evts.join(' ')) + lt.obj.unbind(ev, lt.handler or lt.callback) + + unbind: (ev, callback) -> + if arguments.length is 0 + @_callbacks = {} + return this + return this unless ev + evs = ev.split(' ') + for name in evs + list = @_callbacks?[name] + continue unless list + unless callback + delete @_callbacks[name] + continue + for cb, i in list when (cb is callback) + list = list.slice() + list.splice(i, 1) + @_callbacks[name] = list + break + this + +Events.on = Events.bind +Events.off = Events.unbind + +Log = + trace: true + + logPrefix: '(App)' + + log: (args...) -> + return unless @trace + if @logPrefix then args.unshift(@logPrefix) + console?.log?(args...) + this + +moduleKeywords = ['included', 'extended'] + +class Module + @include: (obj) -> + throw new Error('include(obj) requires obj') unless obj + for key, value of obj when key not in moduleKeywords + @::[key] = value + obj.included?.apply(this) + this + + @extend: (obj) -> + throw new Error('extend(obj) requires obj') unless obj + for key, value of obj when key not in moduleKeywords + @[key] = value + obj.extended?.apply(this) + this + + @proxy: (func) -> + => func.apply(this, arguments) + + proxy: (func) -> + => func.apply(this, arguments) + + constructor: -> + @init?(arguments...) + +class Model extends Module + @extend Events + + @records : [] + @irecords : {} + @attributes : [] + + @configure: (name, attributes...) -> + @className = name + @deleteAll() + @attributes = attributes if attributes.length + @attributes and= makeArray(@attributes) + @attributes or= [] + @unbind() + this + + @toString: -> "#{@className}(#{@attributes.join(", ")})" + + @find: (id, notFound = @notFound) -> + record = @irecords[id]?.clone() + return record or notFound?(id) + + @notFound: (id) -> return null + + @exists: (id) -> + return if @irecords[id] then true else false + + @addRecord: (record) -> + if record.id and @irecords[record.id] + @irecords[record.id].remove() + + record.id or= record.cid + @records.push(record) + @irecords[record.id] = record + @irecords[record.cid] = record + + @refresh: (values, options = {}) -> + @deleteAll() if options.clear + + records = @fromJSON(values) + records = [records] unless isArray(records) + @addRecord(record) for record in records + @sort() + + result = @cloneArray(records) + @trigger('refresh', result, options) + result + + @select: (callback) -> + (record.clone() for record in @records when callback(record)) + + @findByAttribute: (name, value) -> + for record in @records + if record[name] is value + return record.clone() + null + + @findAllByAttribute: (name, value) -> + @select (item) -> + item[name] is value + + @each: (callback) -> + callback(record.clone()) for record in @records + + @all: -> + @cloneArray(@records) + + @slice: (begin = 0, end)-> + @cloneArray(@records.slice(begin, end)) + + @first: (end = 1)-> + if end > 1 + @cloneArray(@records.slice(0, end)) + else + @records[0]?.clone() + + @last: (begin)-> + if typeof begin is 'number' + @cloneArray(@records.slice(-begin)) + else + @records[@records.length - 1]?.clone() + + @count: -> + @records.length + + @deleteAll: -> + @records = [] + @irecords = {} + + @destroyAll: (options) -> + record.destroy(options) for record in @records + + @update: (id, atts, options) -> + @find(id).updateAttributes(atts, options) + + @create: (atts, options) -> + record = new @(atts) + record.save(options) + + @destroy: (id, options) -> + @find(id).destroy(options) + + @change: (callbackOrParams) -> + if typeof callbackOrParams is 'function' + @bind('change', callbackOrParams) + else + @trigger('change', arguments...) + + @fetch: (callbackOrParams) -> + if typeof callbackOrParams is 'function' + @bind('fetch', callbackOrParams) + else + @trigger('fetch', arguments...) + + @toJSON: -> + @records + + @fromJSON: (objects) -> + return unless objects + if typeof objects is 'string' + objects = JSON.parse(objects) + if isArray(objects) + (new @(value) for value in objects) + else + new @(objects) + + @fromForm: -> + (new this).fromForm(arguments...) + + @sort: -> + if @comparator + @records.sort @comparator + this + + # Private + + @cloneArray: (array) -> + (value.clone() for value in array) + + @idCounter: 0 + + @uid: (prefix = '') -> + uid = prefix + @idCounter++ + uid = @uid(prefix) if @exists(uid) + uid + + # Instance + + constructor: (atts) -> + super + if @constructor.uuid? and typeof @constructor.uuid is 'function' + @cid = @constructor.uuid() + @id = @cid unless @id + else + @cid = atts?.cid or @constructor.uid('c-') + @load atts if atts + + isNew: -> + not @exists() + + isValid: -> + not @validate() + + validate: -> + + load: (atts) -> + if atts.id then @id = atts.id + for key, value of atts + if atts.hasOwnProperty(key) and typeof @[key] is 'function' + @[key](value) + else + @[key] = value + this + + attributes: -> + result = {} + for key in @constructor.attributes when key of this + if typeof @[key] is 'function' + result[key] = @[key]() + else + result[key] = @[key] + result.id = @id if @id + result + + eql: (rec) -> + !!(rec and rec.constructor is @constructor and + ((rec.cid is @cid) or (rec.id and rec.id is @id))) + + save: (options = {}) -> + unless options.validate is false + error = @validate() + if error + @trigger('error', error) + return false + + @trigger('beforeSave', options) + record = if @isNew() then @create(options) else @update(options) + @stripCloneAttrs() + @trigger('save', options) + record + + stripCloneAttrs: -> + return if @hasOwnProperty 'cid' # Make sure it's not the raw object + for own key, value of this + delete @[key] if key in @constructor.attributes + this + + updateAttribute: (name, value, options) -> + atts = {} + atts[name] = value + @updateAttributes(atts, options) + + updateAttributes: (atts, options) -> + @load(atts) + @save(options) + + changeID: (id) -> + return if id is @id + records = @constructor.irecords + records[id] = records[@id] + delete records[@id] unless @cid is @id + @id = id + @save() + + remove: -> + # Remove record from model + records = @constructor.records.slice(0) + for record, i in records when @eql(record) + records.splice(i, 1) + break + @constructor.records = records + # Remove the ID and CID + delete @constructor.irecords[@id] + delete @constructor.irecords[@cid] + + destroy: (options = {}) -> + @trigger('beforeDestroy', options) + @remove() + @destroyed = true + # handle events + @trigger('destroy', options) + @trigger('change', 'destroy', options) + if @listeningTo + @stopListening() + @unbind() + this + + dup: (newRecord = true) -> + atts = @attributes() + if newRecord + delete atts.id + else + atts.cid = @cid + new @constructor(atts) + + clone: -> + createObject(this) + + reload: -> + return this if @isNew() + original = @constructor.find(@id) + @load(original.attributes()) + original + + refresh: (data) -> + # go to the source and load attributes + root = @constructor.irecords[@id] + root.load(data) + @trigger('refresh') + @ + + toJSON: -> + @attributes() + + toString: -> + "<#{@constructor.className} (#{JSON.stringify(this)})>" + + fromForm: (form) -> + result = {} + + for checkbox in $(form).find('[type=checkbox]:not([value])') + result[checkbox.name] = $(checkbox).prop('checked') + + for checkbox in $(form).find('[type=checkbox][name$="[]"]') + name = checkbox.name.replace(/\[\]$/, '') + result[name] or= [] + result[name].push checkbox.value if $(checkbox).prop('checked') + + for key in $(form).serializeArray() + result[key.name] or= key.value + + @load(result) + + exists: -> + @constructor.exists(@id) + + # Private + + update: (options) -> + @trigger('beforeUpdate', options) + + records = @constructor.irecords + records[@id].load @attributes() + + @constructor.sort() + + clone = records[@id].clone() + clone.trigger('update', options) + clone.trigger('change', 'update', options) + clone + + create: (options) -> + @trigger('beforeCreate', options) + @id or= @cid + + record = @dup(false) + @constructor.addRecord(record) + @constructor.sort() + + clone = record.clone() + clone.trigger('create', options) + clone.trigger('change', 'create', options) + clone + + bind: (events, callback) -> + @constructor.bind events, binder = (record) => + if record && @eql(record) + callback.apply(this, arguments) + # create a wrapper function to be called with 'unbind' for each event + for singleEvent in events.split(' ') + do (singleEvent) => + @constructor.bind "unbind", unbinder = (record, event, cb) => + if record && @eql(record) + return if event and event isnt singleEvent + return if cb and cb isnt callback + @constructor.unbind(singleEvent, binder) + @constructor.unbind("unbind", unbinder) + this + + one: (events, callback) -> + @bind events, handler = => + @unbind(events, handler) + callback.apply(this, arguments) + + trigger: (args...) -> + args.splice(1, 0, this) + @constructor.trigger(args...) + + listenTo: -> Events.listenTo.apply @, arguments + listenToOnce: -> Events.listenToOnce.apply @, arguments + stopListening: -> Events.stopListening.apply @, arguments + + unbind: (events, callback) -> + if arguments.length is 0 + @trigger('unbind') + else if events + for event in events.split(' ') + @trigger('unbind', event, callback) + +Model::on = Model::bind +Model::off = Model::unbind + +class Controller extends Module + @include Events + @include Log + + eventSplitter: /^(\S+)\s*(.*)$/ + tag: 'div' + + constructor: (options) -> + @options = options + + for key, value of @options + @[key] = value + + @el = document.createElement(@tag) unless @el + @el = $(@el) + @$el = @el + + @el.addClass(@className) if @className + @el.attr(@attributes) if @attributes + + @events = @constructor.events unless @events + @elements = @constructor.elements unless @elements + + context = @ + while parent_prototype = context.constructor.__super__ + @events = $.extend({}, parent_prototype.events, @events) if parent_prototype.events + @elements = $.extend({}, parent_prototype.elements, @elements) if parent_prototype.elements + context = parent_prototype + + @delegateEvents(@events) if @events + @refreshElements() if @elements + + super + + release: => + @trigger 'release', this + # no need to unDelegateEvents since remove will end up handling that + @el.remove() + @unbind() + @stopListening() + + $: (selector) -> $(selector, @el) + + delegateEvents: (events) -> + for key, method of events + + if typeof(method) is 'function' + # Always return true from event handlers + method = do (method) => => + method.apply(this, arguments) + true + else + unless @[method] + throw new Error("#{method} doesn't exist") + + method = do (method) => => + @[method].apply(this, arguments) + true + + match = key.match(@eventSplitter) + eventName = match[1] + selector = match[2] + + if selector is '' + @el.bind(eventName, method) + else + @el.on(eventName, selector, method) + + refreshElements: -> + for key, value of @elements + @[value] = @$(key) + + delay: (func, timeout) -> + setTimeout(@proxy(func), timeout || 0) + + # keep controllers elements obj in sync with it contents + + html: (element) -> + @el.html(element.el or element) + @refreshElements() + @el + + append: (elements...) -> + elements = (e.el or e for e in elements) + @el.append(elements...) + @refreshElements() + @el + + appendTo: (element) -> + @el.appendTo(element.el or element) + @refreshElements() + @el + + prepend: (elements...) -> + elements = (e.el or e for e in elements) + @el.prepend(elements...) + @refreshElements() + @el + + replace: (element) -> + element = element.el or element + element = $.trim(element) if typeof element is "string" + # parseHTML is incompatible with Zepto + [previous, @el] = [@el, $($.parseHTML(element)?[0] or element)] + previous.replaceWith(@el) + @delegateEvents(@events) + @refreshElements() + @el + +# Utilities & Shims + +$ = window?.jQuery or window?.Zepto or (element) -> element + +createObject = Object.create or (o) -> + Func = -> + Func.prototype = o + new Func() + +isArray = (value) -> + Object::toString.call(value) is '[object Array]' + +isBlank = (value) -> + return true unless value + return false for key of value + true + +makeArray = (args) -> + Array::slice.call(args, 0) + +# Globals + +Spine = @Spine = {} +module?.exports = Spine + +Spine.version = '1.3.0' +Spine.isArray = isArray +Spine.isBlank = isBlank +Spine.$ = $ +Spine.Events = Events +Spine.Log = Log +Spine.Module = Module +Spine.Controller = Controller +Spine.Model = Model + +# Global events + +Module.extend.call(Spine, Events) + +# JavaScript compatability + +Module.create = Module.sub = + Controller.create = Controller.sub = + Model.sub = (instances, statics) -> + class Result extends this + Result.include(instances) if instances + Result.extend(statics) if statics + Result.unbind?() + Result + +Model.setup = (name, attributes = []) -> + class Instance extends this + Instance.configure(name, attributes...) + Instance + +Spine.Class = Module diff --git a/app/assets/javascripts/app/lib/spine/spine.js b/app/assets/javascripts/app/lib/spine/spine.js deleted file mode 100755 index 2bc6a54ed..000000000 --- a/app/assets/javascripts/app/lib/spine/spine.js +++ /dev/null @@ -1,1151 +0,0 @@ -// Generated by CoffeeScript 1.6.3 -/* -Spine.js MVC library -Released under the MIT License -*/ - - -(function() { - var $, Controller, Events, Log, Model, Module, Spine, createObject, isArray, isBlank, makeArray, moduleKeywords, - __slice = [].slice, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - - Events = { - bind: function(ev, callback) { - var calls, evs, name, _i, _len; - evs = ev.split(' '); - calls = this.hasOwnProperty('_callbacks') && this._callbacks || (this._callbacks = {}); - for (_i = 0, _len = evs.length; _i < _len; _i++) { - name = evs[_i]; - calls[name] || (calls[name] = []); - calls[name].push(callback); - } - return this; - }, - one: function(ev, callback) { - var handler; - return this.bind(ev, handler = function() { - this.unbind(ev, handler); - return callback.apply(this, arguments); - }); - }, - trigger: function() { - var args, callback, ev, list, _i, _len, _ref; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - ev = args.shift(); - list = this.hasOwnProperty('_callbacks') && ((_ref = this._callbacks) != null ? _ref[ev] : void 0); - if (!list) { - return; - } - for (_i = 0, _len = list.length; _i < _len; _i++) { - callback = list[_i]; - if (callback.apply(this, args) === false) { - break; - } - } - return true; - }, - listenTo: function(obj, ev, callback) { - obj.bind(ev, callback); - this.listeningTo || (this.listeningTo = []); - this.listeningTo.push({ - obj: obj, - ev: ev, - callback: callback - }); - return this; - }, - listenToOnce: function(obj, ev, callback) { - var handler, listeningToOnce; - listeningToOnce = this.listeningToOnce || (this.listeningToOnce = []); - obj.bind(ev, handler = function() { - var i, idx, lt, _i, _len; - idx = -1; - for (i = _i = 0, _len = listeningToOnce.length; _i < _len; i = ++_i) { - lt = listeningToOnce[i]; - if (lt.obj === obj) { - if (lt.ev === ev && lt.callback === callback) { - idx = i; - } - } - } - obj.unbind(ev, handler); - if (idx !== -1) { - listeningToOnce.splice(idx, 1); - } - return callback.apply(this, arguments); - }); - listeningToOnce.push({ - obj: obj, - ev: ev, - callback: callback, - handler: handler - }); - return this; - }, - stopListening: function(obj, events, callback) { - var ev, evts, i, idx, listeningTo, lt, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _results; - if (arguments.length === 0) { - _ref = [this.listeningTo, this.listeningToOnce]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - listeningTo = _ref[_i]; - if (!listeningTo) { - continue; - } - for (_j = 0, _len1 = listeningTo.length; _j < _len1; _j++) { - lt = listeningTo[_j]; - lt.obj.unbind(lt.ev, lt.handler || lt.callback); - } - } - this.listeningTo = void 0; - return this.listeningToOnce = void 0; - } else if (obj) { - _ref1 = [this.listeningTo, this.listeningToOnce]; - _results = []; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - listeningTo = _ref1[_k]; - if (!listeningTo) { - continue; - } - events = events ? events.split(' ') : [void 0]; - _results.push((function() { - var _l, _len3, _results1; - _results1 = []; - for (_l = 0, _len3 = events.length; _l < _len3; _l++) { - ev = events[_l]; - _results1.push((function() { - var _m, _ref2, _results2; - _results2 = []; - for (idx = _m = _ref2 = listeningTo.length - 1; _ref2 <= 0 ? _m <= 0 : _m >= 0; idx = _ref2 <= 0 ? ++_m : --_m) { - lt = listeningTo[idx]; - if ((!ev) || (ev === lt.ev)) { - lt.obj.unbind(lt.ev, lt.handler || lt.callback); - if (idx !== -1) { - _results2.push(listeningTo.splice(idx, 1)); - } else { - _results2.push(void 0); - } - } else if (ev) { - evts = lt.ev.split(' '); - if (~(i = evts.indexOf(ev))) { - evts.splice(i, 1); - lt.ev = $.trim(evts.join(' ')); - _results2.push(lt.obj.unbind(ev, lt.handler || lt.callback)); - } else { - _results2.push(void 0); - } - } else { - _results2.push(void 0); - } - } - return _results2; - })()); - } - return _results1; - })()); - } - return _results; - } - }, - unbind: function(ev, callback) { - var cb, evs, i, list, name, _i, _j, _len, _len1, _ref; - if (arguments.length === 0) { - this._callbacks = {}; - return this; - } - if (!ev) { - return this; - } - evs = ev.split(' '); - for (_i = 0, _len = evs.length; _i < _len; _i++) { - name = evs[_i]; - list = (_ref = this._callbacks) != null ? _ref[name] : void 0; - if (!list) { - continue; - } - if (!callback) { - delete this._callbacks[name]; - continue; - } - for (i = _j = 0, _len1 = list.length; _j < _len1; i = ++_j) { - cb = list[i]; - if (!(cb === callback)) { - continue; - } - list = list.slice(); - list.splice(i, 1); - this._callbacks[name] = list; - break; - } - } - return this; - } - }; - - Events.on = Events.bind; - - Events.off = Events.unbind; - - Log = { - trace: true, - logPrefix: '(App)', - log: function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (!this.trace) { - return; - } - if (this.logPrefix) { - args.unshift(this.logPrefix); - } - if (typeof console !== "undefined" && console !== null) { - if (typeof console.log === "function") { - console.log.apply(console, args); - } - } - return this; - } - }; - - moduleKeywords = ['included', 'extended']; - - Module = (function() { - Module.include = function(obj) { - var key, value, _ref; - if (!obj) { - throw new Error('include(obj) requires obj'); - } - for (key in obj) { - value = obj[key]; - if (__indexOf.call(moduleKeywords, key) < 0) { - this.prototype[key] = value; - } - } - if ((_ref = obj.included) != null) { - _ref.apply(this); - } - return this; - }; - - Module.extend = function(obj) { - var key, value, _ref; - if (!obj) { - throw new Error('extend(obj) requires obj'); - } - for (key in obj) { - value = obj[key]; - if (__indexOf.call(moduleKeywords, key) < 0) { - this[key] = value; - } - } - if ((_ref = obj.extended) != null) { - _ref.apply(this); - } - return this; - }; - - Module.proxy = function(func) { - var _this = this; - return function() { - return func.apply(_this, arguments); - }; - }; - - Module.prototype.proxy = function(func) { - var _this = this; - return function() { - return func.apply(_this, arguments); - }; - }; - - function Module() { - if (typeof this.init === "function") { - this.init.apply(this, arguments); - } - } - - return Module; - - })(); - - Model = (function(_super) { - __extends(Model, _super); - - Model.extend(Events); - - Model.records = []; - - Model.irecords = {}; - - Model.attributes = []; - - Model.configure = function() { - var attributes, name; - name = arguments[0], attributes = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - this.className = name; - this.deleteAll(); - if (attributes.length) { - this.attributes = attributes; - } - this.attributes && (this.attributes = makeArray(this.attributes)); - this.attributes || (this.attributes = []); - this.unbind(); - return this; - }; - - Model.toString = function() { - return "" + this.className + "(" + (this.attributes.join(", ")) + ")"; - }; - - Model.find = function(id) { - var record; - record = this.exists(id); - if (!record) { - throw new Error("\"" + this.className + "\" model could not find a record for the ID \"" + id + "\""); - } - return record; - }; - - Model.exists = function(id) { - var _ref; - return (_ref = this.irecords[id]) != null ? _ref.clone() : void 0; - }; - - Model.addRecord = function(record) { - if (record.id && this.irecords[record.id]) { - this.irecords[record.id].remove(); - } - record.id || (record.id = record.cid); - this.records.push(record); - this.irecords[record.id] = record; - return this.irecords[record.cid] = record; - }; - - Model.refresh = function(values, options) { - var record, records, result, _i, _len; - if (options == null) { - options = {}; - } - if (options.clear) { - this.deleteAll(); - } - records = this.fromJSON(values); - if (!isArray(records)) { - records = [records]; - } - for (_i = 0, _len = records.length; _i < _len; _i++) { - record = records[_i]; - this.addRecord(record); - } - this.sort(); - result = this.cloneArray(records); - this.trigger('refresh', result, options); - return result; - }; - - Model.select = function(callback) { - var record, _i, _len, _ref, _results; - _ref = this.records; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - record = _ref[_i]; - if (callback(record)) { - _results.push(record.clone()); - } - } - return _results; - }; - - Model.findByAttribute = function(name, value) { - var record, _i, _len, _ref; - _ref = this.records; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - record = _ref[_i]; - if (record[name] === value) { - return record.clone(); - } - } - return null; - }; - - Model.findAllByAttribute = function(name, value) { - return this.select(function(item) { - return item[name] === value; - }); - }; - - Model.each = function(callback) { - var record, _i, _len, _ref, _results; - _ref = this.records; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - record = _ref[_i]; - _results.push(callback(record.clone())); - } - return _results; - }; - - Model.all = function() { - return this.cloneArray(this.records); - }; - - Model.slice = function(begin, end) { - if (begin == null) { - begin = 0; - } - return this.cloneArray(this.records.slice(begin, end)); - }; - - Model.first = function(end) { - var _ref; - if (end == null) { - end = 1; - } - if (end > 1) { - return this.cloneArray(this.records.slice(0, end)); - } else { - return (_ref = this.records[0]) != null ? _ref.clone() : void 0; - } - }; - - Model.last = function(begin) { - var _ref; - if (typeof begin === 'number') { - return this.cloneArray(this.records.slice(-begin)); - } else { - return (_ref = this.records[this.records.length - 1]) != null ? _ref.clone() : void 0; - } - }; - - Model.count = function() { - return this.records.length; - }; - - Model.deleteAll = function() { - this.records = []; - return this.irecords = {}; - }; - - Model.destroyAll = function(options) { - var record, _i, _len, _ref, _results; - _ref = this.records; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - record = _ref[_i]; - _results.push(record.destroy(options)); - } - return _results; - }; - - Model.update = function(id, atts, options) { - return this.find(id).updateAttributes(atts, options); - }; - - Model.create = function(atts, options) { - var record; - record = new this(atts); - return record.save(options); - }; - - Model.destroy = function(id, options) { - return this.find(id).destroy(options); - }; - - Model.change = function(callbackOrParams) { - if (typeof callbackOrParams === 'function') { - return this.bind('change', callbackOrParams); - } else { - return this.trigger.apply(this, ['change'].concat(__slice.call(arguments))); - } - }; - - Model.fetch = function(callbackOrParams) { - if (typeof callbackOrParams === 'function') { - return this.bind('fetch', callbackOrParams); - } else { - return this.trigger.apply(this, ['fetch'].concat(__slice.call(arguments))); - } - }; - - Model.toJSON = function() { - return this.records; - }; - - Model.fromJSON = function(objects) { - var value, _i, _len, _results; - if (!objects) { - return; - } - if (typeof objects === 'string') { - objects = JSON.parse(objects); - } - if (isArray(objects)) { - _results = []; - for (_i = 0, _len = objects.length; _i < _len; _i++) { - value = objects[_i]; - _results.push(new this(value)); - } - return _results; - } else { - return new this(objects); - } - }; - - Model.fromForm = function() { - var _ref; - return (_ref = new this).fromForm.apply(_ref, arguments); - }; - - Model.sort = function() { - if (this.comparator) { - this.records.sort(this.comparator); - } - return this; - }; - - Model.cloneArray = function(array) { - var value, _i, _len, _results; - _results = []; - for (_i = 0, _len = array.length; _i < _len; _i++) { - value = array[_i]; - _results.push(value.clone()); - } - return _results; - }; - - Model.idCounter = 0; - - Model.uid = function(prefix) { - var uid; - if (prefix == null) { - prefix = ''; - } - uid = prefix + this.idCounter++; - if (this.exists(uid)) { - uid = this.uid(prefix); - } - return uid; - }; - - function Model(atts) { - Model.__super__.constructor.apply(this, arguments); - if (atts) { - this.load(atts); - } - this.cid = (atts != null ? atts.cid : void 0) || this.constructor.uid('c-'); - } - - Model.prototype.isNew = function() { - return !this.exists(); - }; - - Model.prototype.isValid = function() { - return !this.validate(); - }; - - Model.prototype.validate = function() {}; - - Model.prototype.load = function(atts) { - var key, value; - if (atts.id) { - this.id = atts.id; - } - for (key in atts) { - value = atts[key]; - if (atts.hasOwnProperty(key) && typeof this[key] === 'function') { - this[key](value); - } else { - this[key] = value; - } - } - return this; - }; - - Model.prototype.attributes = function() { - var key, result, _i, _len, _ref; - result = {}; - _ref = this.constructor.attributes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - if (key in this) { - if (typeof this[key] === 'function') { - result[key] = this[key](); - } else { - result[key] = this[key]; - } - } - } - if (this.id) { - result.id = this.id; - } - return result; - }; - - Model.prototype.eql = function(rec) { - return !!(rec && rec.constructor === this.constructor && ((rec.cid === this.cid) || (rec.id && rec.id === this.id))); - }; - - Model.prototype.save = function(options) { - var error, record; - if (options == null) { - options = {}; - } - if (options.validate !== false) { - error = this.validate(); - if (error) { - this.trigger('error', error); - return false; - } - } - this.trigger('beforeSave', options); - record = this.isNew() ? this.create(options) : this.update(options); - this.stripCloneAttrs(); - this.trigger('save', options); - return record; - }; - - Model.prototype.stripCloneAttrs = function() { - var key, value; - if (this.hasOwnProperty('cid')) { - return; - } - for (key in this) { - if (!__hasProp.call(this, key)) continue; - value = this[key]; - if (this.constructor.attributes.indexOf(key) > -1) { - delete this[key]; - } - } - return this; - }; - - Model.prototype.updateAttribute = function(name, value, options) { - var atts; - atts = {}; - atts[name] = value; - return this.updateAttributes(atts, options); - }; - - Model.prototype.updateAttributes = function(atts, options) { - this.load(atts); - return this.save(options); - }; - - Model.prototype.changeID = function(id) { - var records; - if (id === this.id) { - return; - } - records = this.constructor.irecords; - records[id] = records[this.id]; - if (this.cid !== this.id) { - delete records[this.id]; - } - this.id = id; - return this.save(); - }; - - Model.prototype.remove = function() { - var i, record, records, _i, _len; - records = this.constructor.records.slice(0); - for (i = _i = 0, _len = records.length; _i < _len; i = ++_i) { - record = records[i]; - if (!(this.eql(record))) { - continue; - } - records.splice(i, 1); - break; - } - this.constructor.records = records; - delete this.constructor.irecords[this.id]; - return delete this.constructor.irecords[this.cid]; - }; - - Model.prototype.destroy = function(options) { - if (options == null) { - options = {}; - } - this.trigger('beforeDestroy', options); - this.remove(); - this.destroyed = true; - this.trigger('destroy', options); - this.trigger('change', 'destroy', options); - if (this.listeningTo) { - this.stopListening(); - } - this.unbind(); - return this; - }; - - Model.prototype.dup = function(newRecord) { - var atts; - if (newRecord == null) { - newRecord = true; - } - atts = this.attributes(); - if (newRecord) { - delete atts.id; - } else { - atts.cid = this.cid; - } - return new this.constructor(atts); - }; - - Model.prototype.clone = function() { - return createObject(this); - }; - - Model.prototype.reload = function() { - var original; - if (this.isNew()) { - return this; - } - original = this.constructor.find(this.id); - this.load(original.attributes()); - return original; - }; - - Model.prototype.refresh = function(data) { - var root; - root = this.constructor.irecords[this.id]; - root.load(data); - this.trigger('refresh'); - return this; - }; - - Model.prototype.toJSON = function() { - return this.attributes(); - }; - - Model.prototype.toString = function() { - return "<" + this.constructor.className + " (" + (JSON.stringify(this)) + ")>"; - }; - - Model.prototype.fromForm = function(form) { - var checkbox, key, name, result, _i, _j, _k, _len, _len1, _len2, _name, _ref, _ref1, _ref2; - result = {}; - _ref = $(form).find('[type=checkbox]:not([value])'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - checkbox = _ref[_i]; - result[checkbox.name] = $(checkbox).prop('checked'); - } - _ref1 = $(form).find('[type=checkbox][name$="[]"]'); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - checkbox = _ref1[_j]; - name = checkbox.name.replace(/\[\]$/, ''); - result[name] || (result[name] = []); - if ($(checkbox).prop('checked')) { - result[name].push(checkbox.value); - } - } - _ref2 = $(form).serializeArray(); - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - key = _ref2[_k]; - result[_name = key.name] || (result[_name] = key.value); - } - return this.load(result); - }; - - Model.prototype.exists = function() { - return this.constructor.exists(this.id); - }; - - Model.prototype.update = function(options) { - var clone, records; - this.trigger('beforeUpdate', options); - records = this.constructor.irecords; - records[this.id].load(this.attributes()); - this.constructor.sort(); - clone = records[this.id].clone(); - clone.trigger('update', options); - clone.trigger('change', 'update', options); - return clone; - }; - - Model.prototype.create = function(options) { - var clone, record; - this.trigger('beforeCreate', options); - this.id || (this.id = this.cid); - record = this.dup(false); - this.constructor.addRecord(record); - this.constructor.sort(); - clone = record.clone(); - clone.trigger('create', options); - clone.trigger('change', 'create', options); - return clone; - }; - - Model.prototype.bind = function(events, callback) { - var binder, singleEvent, _fn, _i, _len, _ref, - _this = this; - this.constructor.bind(events, binder = function(record) { - if (record && _this.eql(record)) { - return callback.apply(_this, arguments); - } - }); - _ref = events.split(' '); - _fn = function(singleEvent) { - var unbinder; - return _this.constructor.bind("unbind", unbinder = function(record, event, cb) { - if (record && _this.eql(record)) { - if (event && event !== singleEvent) { - return; - } - if (cb && cb !== callback) { - return; - } - _this.constructor.unbind(singleEvent, binder); - return _this.constructor.unbind("unbind", unbinder); - } - }); - }; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - singleEvent = _ref[_i]; - _fn(singleEvent); - } - return this; - }; - - Model.prototype.one = function(events, callback) { - var handler, - _this = this; - return this.bind(events, handler = function() { - _this.unbind(events, handler); - return callback.apply(_this, arguments); - }); - }; - - Model.prototype.trigger = function() { - var args, _ref; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - args.splice(1, 0, this); - return (_ref = this.constructor).trigger.apply(_ref, args); - }; - - Model.prototype.listenTo = function() { - return Events.listenTo.apply(this, arguments); - }; - - Model.prototype.listenToOnce = function() { - return Events.listenToOnce.apply(this, arguments); - }; - - Model.prototype.stopListening = function() { - return Events.stopListening.apply(this, arguments); - }; - - Model.prototype.unbind = function(events, callback) { - var event, _i, _len, _ref, _results; - if (arguments.length === 0) { - return this.trigger('unbind'); - } else if (events) { - _ref = events.split(' '); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - event = _ref[_i]; - _results.push(this.trigger('unbind', event, callback)); - } - return _results; - } - }; - - return Model; - - })(Module); - - Model.prototype.on = Model.prototype.bind; - - Model.prototype.off = Model.prototype.unbind; - - Controller = (function(_super) { - __extends(Controller, _super); - - Controller.include(Events); - - Controller.include(Log); - - Controller.prototype.eventSplitter = /^(\S+)\s*(.*)$/; - - Controller.prototype.tag = 'div'; - - function Controller(options) { - this.release = __bind(this.release, this); - var context, key, parent_prototype, value, _ref; - this.options = options; - _ref = this.options; - for (key in _ref) { - value = _ref[key]; - this[key] = value; - } - if (!this.el) { - this.el = document.createElement(this.tag); - } - this.el = $(this.el); - this.$el = this.el; - if (this.className) { - this.el.addClass(this.className); - } - if (this.attributes) { - this.el.attr(this.attributes); - } - if (!this.events) { - this.events = this.constructor.events; - } - if (!this.elements) { - this.elements = this.constructor.elements; - } - context = this; - while (parent_prototype = context.constructor.__super__) { - if (parent_prototype.events) { - this.events = $.extend({}, parent_prototype.events, this.events); - } - if (parent_prototype.elements) { - this.elements = $.extend({}, parent_prototype.elements, this.elements); - } - context = parent_prototype; - } - if (this.events) { - this.delegateEvents(this.events); - } - if (this.elements) { - this.refreshElements(); - } - Controller.__super__.constructor.apply(this, arguments); - } - - Controller.prototype.release = function() { - this.trigger('release', this); - this.el.remove(); - this.unbind(); - return this.stopListening(); - }; - - Controller.prototype.$ = function(selector) { - return $(selector, this.el); - }; - - Controller.prototype.delegateEvents = function(events) { - var eventName, key, match, method, selector, _results, - _this = this; - _results = []; - for (key in events) { - method = events[key]; - if (typeof method === 'function') { - method = (function(method) { - return function() { - method.apply(_this, arguments); - return true; - }; - })(method); - } else { - if (!this[method]) { - throw new Error("" + method + " doesn't exist"); - } - method = (function(method) { - return function() { - _this[method].apply(_this, arguments); - return true; - }; - })(method); - } - match = key.match(this.eventSplitter); - eventName = match[1]; - selector = match[2]; - if (selector === '') { - _results.push(this.el.bind(eventName, method)); - } else { - _results.push(this.el.on(eventName, selector, method)); - } - } - return _results; - }; - - Controller.prototype.refreshElements = function() { - var key, value, _ref, _results; - _ref = this.elements; - _results = []; - for (key in _ref) { - value = _ref[key]; - _results.push(this[value] = this.$(key)); - } - return _results; - }; - - Controller.prototype.delay = function(func, timeout) { - return setTimeout(this.proxy(func), timeout || 0); - }; - - Controller.prototype.html = function(element) { - this.el.html(element.el || element); - this.refreshElements(); - return this.el; - }; - - Controller.prototype.append = function() { - var e, elements, _ref; - elements = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - elements = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = elements.length; _i < _len; _i++) { - e = elements[_i]; - _results.push(e.el || e); - } - return _results; - })(); - (_ref = this.el).append.apply(_ref, elements); - this.refreshElements(); - return this.el; - }; - - Controller.prototype.appendTo = function(element) { - this.el.appendTo(element.el || element); - this.refreshElements(); - return this.el; - }; - - Controller.prototype.prepend = function() { - var e, elements, _ref; - elements = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - elements = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = elements.length; _i < _len; _i++) { - e = elements[_i]; - _results.push(e.el || e); - } - return _results; - })(); - (_ref = this.el).prepend.apply(_ref, elements); - this.refreshElements(); - return this.el; - }; - - Controller.prototype.replace = function(element) { - var previous, _ref, _ref1; - element = element.el || element; - if (typeof element === "string") { - element = $.trim(element); - } - _ref1 = [this.el, $(((_ref = $.parseHTML(element)) != null ? _ref[0] : void 0) || element)], previous = _ref1[0], this.el = _ref1[1]; - previous.replaceWith(this.el); - this.delegateEvents(this.events); - this.refreshElements(); - return this.el; - }; - - return Controller; - - })(Module); - - $ = (typeof window !== "undefined" && window !== null ? window.jQuery : void 0) || (typeof window !== "undefined" && window !== null ? window.Zepto : void 0) || function(element) { - return element; - }; - - createObject = Object.create || function(o) { - var Func; - Func = function() {}; - Func.prototype = o; - return new Func(); - }; - - isArray = function(value) { - return Object.prototype.toString.call(value) === '[object Array]'; - }; - - isBlank = function(value) { - var key; - if (!value) { - return true; - } - for (key in value) { - return false; - } - return true; - }; - - makeArray = function(args) { - return Array.prototype.slice.call(args, 0); - }; - - Spine = this.Spine = {}; - - if (typeof module !== "undefined" && module !== null) { - module.exports = Spine; - } - - Spine.version = '1.2.2'; - - Spine.isArray = isArray; - - Spine.isBlank = isBlank; - - Spine.$ = $; - - Spine.Events = Events; - - Spine.Log = Log; - - Spine.Module = Module; - - Spine.Controller = Controller; - - Spine.Model = Model; - - Module.extend.call(Spine, Events); - - Module.create = Module.sub = Controller.create = Controller.sub = Model.sub = function(instances, statics) { - var Result, _ref; - Result = (function(_super) { - __extends(Result, _super); - - function Result() { - _ref = Result.__super__.constructor.apply(this, arguments); - return _ref; - } - - return Result; - - })(this); - if (instances) { - Result.include(instances); - } - if (statics) { - Result.extend(statics); - } - if (typeof Result.unbind === "function") { - Result.unbind(); - } - return Result; - }; - - Model.setup = function(name, attributes) { - var Instance, _ref; - if (attributes == null) { - attributes = []; - } - Instance = (function(_super) { - __extends(Instance, _super); - - function Instance() { - _ref = Instance.__super__.constructor.apply(this, arguments); - return _ref; - } - - return Instance; - - })(this); - Instance.configure.apply(Instance, [name].concat(__slice.call(attributes))); - return Instance; - }; - - Spine.Class = Module; - -}).call(this); - -/* -//@ sourceMappingURL=spine.map -*/ diff --git a/app/assets/javascripts/app/lib/spine/spine.map b/app/assets/javascripts/app/lib/spine/spine.map deleted file mode 100755 index b65cb7cb4..000000000 --- a/app/assets/javascripts/app/lib/spine/spine.map +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 3, - "file": "spine.js", - "sourceRoot": "..", - "sources": [ - "src/spine.coffee" - ], - "names": [], - "mappings": "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" -} \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/spine/tabs.js b/app/assets/javascripts/app/lib/spine/tabs.js deleted file mode 100755 index 13179ba43..000000000 --- a/app/assets/javascripts/app/lib/spine/tabs.js +++ /dev/null @@ -1,66 +0,0 @@ -(function() { - var $, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = Object.prototype.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; - - if (typeof Spine === "undefined" || Spine === null) Spine = require('spine'); - - $ = Spine.$; - - Spine.Tabs = (function(_super) { - - __extends(Tabs, _super); - - Tabs.prototype.events = { - 'click [data-name]': 'click' - }; - - function Tabs() { - this.change = __bind(this.change, this); Tabs.__super__.constructor.apply(this, arguments); - this.bind('change', this.change); - } - - Tabs.prototype.change = function(name) { - if (!name) return; - this.current = name; - this.children().removeClass('active'); - return this.children("[data-name=" + this.current + "]").addClass('active'); - }; - - Tabs.prototype.render = function() { - this.change(this.current); - if (!(this.children('.active').length || this.current)) { - return this.children(':first').click(); - } - }; - - Tabs.prototype.children = function(sel) { - return this.el.children(sel); - }; - - Tabs.prototype.click = function(e) { - var name; - name = $(e.currentTarget).attr('data-name'); - return this.trigger('change', name); - }; - - Tabs.prototype.connect = function(tabName, controller) { - var _this = this; - this.bind('change', function(name) { - if (name === tabName) return controller.active(); - }); - return controller.bind('active', function() { - return _this.change(tabName); - }); - }; - - return Tabs; - - })(Spine.Controller); - - if (typeof module !== "undefined" && module !== null) { - module.exports = Spine.Tabs; - } - -}).call(this); diff --git a/app/assets/javascripts/app/lib/spine/tmpl.js b/app/assets/javascripts/app/lib/spine/tmpl.js deleted file mode 100755 index cd8253ac6..000000000 --- a/app/assets/javascripts/app/lib/spine/tmpl.js +++ /dev/null @@ -1,22 +0,0 @@ -(function() { - var $; - - $ = typeof jQuery !== "undefined" && jQuery !== null ? jQuery : require("jqueryify"); - - $.fn.item = function() { - var item; - item = $(this); - item = item.data("item") || (typeof item.tmplItem === "function" ? item.tmplItem().data : void 0); - if (item != null) if (typeof item.reload === "function") item.reload(); - return item; - }; - - $.fn.forItem = function(item) { - return this.filter(function() { - var compare; - compare = $(this).item(); - return (typeof item.eql === "function" ? item.eql(compare) : void 0) || item === compare; - }); - }; - -}).call(this);