129 lines
3.3 KiB
CoffeeScript
129 lines
3.3 KiB
CoffeeScript
get = Ember.get
|
|
set = Ember.set
|
|
|
|
Array.prototype.diff = (a) ->
|
|
this.filter (i) -> !(a.indexOf(i) > -1)
|
|
|
|
|
|
@Travis.Model = Ember.Model.extend
|
|
id: Ember.attr('number')
|
|
|
|
init: ->
|
|
@_super.apply this, arguments
|
|
this
|
|
|
|
merge: (hash) ->
|
|
data = @get('_data')
|
|
Ember.merge(data, hash)
|
|
@notifyPropertyChange('_data')
|
|
|
|
unload: ->
|
|
@constructor.unload(this)
|
|
|
|
dataKey: (key) ->
|
|
meta = @constructor.metaForProperty(key)
|
|
if meta.isRelationship && !meta.options?.key?
|
|
type = meta.type
|
|
if typeof type == "string"
|
|
type = Ember.get(Ember.lookup, type)
|
|
|
|
if meta.kind == 'belongsTo'
|
|
return type.singularName() + '_id'
|
|
else
|
|
return type.singularName() + '_ids'
|
|
|
|
@_super(key)
|
|
|
|
getBelongsTo: (key, type, meta) ->
|
|
unless key
|
|
key = type.singularName() + '_id'
|
|
@_super(key, type, meta)
|
|
|
|
getHasMany: (key, type, meta) ->
|
|
unless key
|
|
key = type.singularName() + '_ids'
|
|
@_super(key, type, meta)
|
|
|
|
select: ->
|
|
@constructor.select(@get('id'))
|
|
|
|
@Travis.Model.reopenClass
|
|
select: (id) ->
|
|
@find().forEach (record) ->
|
|
record.set('selected', record.get('id') == id)
|
|
|
|
buildURL: (suffix) ->
|
|
base = @url || @pluralName()
|
|
Ember.assert('Base URL (' + base + ') must not start with slash', !base || base.toString().charAt(0) != '/')
|
|
Ember.assert('URL suffix (' + suffix + ') must not start with slash', !suffix || suffix.toString().charAt(0) != '/')
|
|
url = [base]
|
|
url.push(suffix) if (suffix != undefined)
|
|
url.join('/')
|
|
|
|
singularName: ->
|
|
parts = @toString().split('.')
|
|
name = parts[parts.length - 1]
|
|
name.replace(/([A-Z])/g, '_$1').toLowerCase().slice(1)
|
|
|
|
pluralName: ->
|
|
@singularName() + 's'
|
|
|
|
collectionKey: (->
|
|
@pluralName()
|
|
).property()
|
|
|
|
rootKey: (->
|
|
@singularName()
|
|
).property()
|
|
|
|
isModel: (->
|
|
true
|
|
).property()
|
|
|
|
isRecordLoaded: (id) ->
|
|
reference = @_getReferenceById(id)
|
|
reference && reference.record
|
|
|
|
camelizeKeys: true
|
|
|
|
# TODO: the functions below will be added to Ember Model, remove them when that
|
|
# happens
|
|
resetData: ->
|
|
@_referenceCache = {}
|
|
@sideloadedData = {}
|
|
@recordArrays = []
|
|
@_currentBatchIds = []
|
|
@_hasManyArrays = []
|
|
@_findAllRecordArray = null
|
|
|
|
unload: (record) ->
|
|
@removeFromRecordArrays(record)
|
|
primaryKey = record.get(get(this, 'primaryKey'))
|
|
@removeFromCache(primaryKey)
|
|
|
|
removeFromCache: (key) ->
|
|
if @sideloadedData && @sideloadedData[key]
|
|
delete this.sideloadedData[key]
|
|
if @recordCache && @recordCache[key]
|
|
delete this.recordCache[key]
|
|
|
|
loadRecordForReference: (reference) ->
|
|
record = @create({ _reference: reference, id: reference.id })
|
|
@sideloadedData = {} unless @sideloadedData
|
|
reference.record = record
|
|
record.load(reference.id, @sideloadedData[reference.id])
|
|
# TODO: find a nicer way to not add record to record arrays twice
|
|
if @currentRecordsToAdd
|
|
@currentRecordsToAdd.pushObject(record) unless @currentRecordsToAdd.contains(record)
|
|
else
|
|
@currentRecordsToAdd = [record]
|
|
|
|
Ember.run.scheduleOnce('data', this, @_batchAddToRecordArrays);
|
|
|
|
_batchAddToRecordArrays: ->
|
|
for record in @currentRecordsToAdd
|
|
if !@_findAllRecordArray || !@_findAllRecordArray.contains(record)
|
|
@addToRecordArrays(record)
|
|
|
|
@currentRecordsToAdd = null
|