{"version":3,"sources":["components/datastore.js"],"names":["dmx","Component","initialData","data","attributes","session","type","Boolean","default","columns","Object","methods","insert","this","_insert","_store","update","filter","_update","upsert","_filter","length","delete","_delete","clear","records","lastid","get","events","inserted","Event","updated","deleted","render","node","$node","store","window","props","stored","getItem","name","JSON","parse","err","console","warn","_setData","equal","$id","record","Array","isArray","i","prop","_parseData","_mergeData","merged","assign","value","indexOf","DataScope","result","push","dispatchEvent","forEach","newRecord","clone","stringify","setItem","scope","$value","$index","$key","column","set"],"mappings":";;;;;;AAAAA,IAAAC,UAAA,YAAA,CAEAC,YAAA,WACA,MAAA,CACAC,KAAA,KAIAC,WAAA,CACAC,QAAA,CACAC,KAAAC,QACAC,SAAA,GAGAC,QAAA,CACAH,KAAAI,OACAF,QAAA,KAIAG,QAAA,CACAC,OAAA,SAAAT,GACAU,KAAAC,QAAAX,GACAU,KAAAE,UAGAC,OAAA,SAAAC,EAAAd,GACAU,KAAAK,QAAAD,EAAAd,GACAU,KAAAE,UAGAI,OAAA,SAAAF,EAAAd,GACAU,KAAAO,QAAAH,GACAI,OACAR,KAAAK,QAAAD,EAAAd,GAEAU,KAAAC,QAAAX,GAEAU,KAAAE,UAGAO,OAAA,SAAAL,GACAJ,KAAAU,QAAAN,GACAJ,KAAAE,UAGAS,MAAA,WACAX,KAAAY,QAAA,GACAZ,KAAAa,OAAA,EACAb,KAAAE,UAGAY,IAAA,SAAAV,GACA,OAAAJ,KAAAO,QAAAH,KAIAW,OAAA,CACAC,SAAAC,MACAC,QAAAD,MACAE,QAAAF,OAGAG,OAAA,SAAAC,GACArB,KAAAsB,MAAA,KACAtB,KAAAuB,MAAAC,OAAAxB,KAAAyB,MAAAjC,QAAA,iBAAA,gBACAQ,KAAAY,QAAA,GACAZ,KAAAa,OAAA,EAEA,IACA,IAAAa,EAAA1B,KAAAuB,MAAAI,QAAA,aAAA3B,KAAA4B,MACAF,KACAA,EAAAG,KAAAC,MAAAJ,IACAd,UAAAZ,KAAAY,QAAAc,EAAAd,SACAc,EAAAb,SAAAb,KAAAa,OAAAa,EAAAb,SAEA,MAAAkB,GACAC,QAAAC,KAAA,0BAAAF,GAIA/B,KAAAkC,YAGA/B,OAAA,SAAAsB,GACAtC,IAAAgD,MAAAV,EAAA7B,QAAAI,KAAAyB,MAAA7B,UACAI,KAAAkC,YAIA3B,QAAA,SAAAH,GAGA,MAFA,iBAAAA,IAAAA,EAAA,CAAAgC,IAAAhC,IAEAJ,KAAAY,QAAAR,OAAA,SAAAiC,GACA,GAAAC,MAAAC,QAAAnC,IACA,IAAA,IAAAoC,EAAA,EAAAA,EAAApC,EAAAI,OAAAgC,IACA,IAAA,IAAAC,KAAArC,EAAAoC,GACA,GAAAH,EAAAI,KAAArC,EAAAoC,GAAAC,GACA,OAAA,OAKA,IAAA,IAAAA,KAAArC,EACA,GAAAiC,EAAAI,KAAArC,EAAAqC,GACA,OAAA,EAKA,OAAA,KAIAC,WAAA,SAAApD,GACA,MAAA,iBAAAA,IAAAgD,MAAAC,QAAAjD,IAOAqD,WAAA,SAAAN,EAAA/C,GACA,IAAAsD,EAAA/C,OAAAgD,OAAA,GAAAR,GAEA,IAAA,IAAAI,KAAAnD,EAAA,CACA,IAAAwD,EAAAxD,EAAAmD,GAEA,iBAAAK,IAAA,GAAAA,EAAAC,QAAA,QACAD,EAAA3D,IAAA2C,MAAAgB,EAAA,IAAA3D,IAAA6D,UAAAX,EAAArC,QAGA4C,EAAAH,GAAAK,EAGA,OAAAF,GAGA3C,QAAA,SAAAX,GACA,IAAA2D,EAAA,CAAAjC,SAAA,GAAAG,QAAA,IAEA,GAAAmB,MAAAC,QAAAjD,GACA,IAAA,IAAAkD,EAAA,EAAAA,EAAAlD,EAAAkB,OAAAgC,IAAA,CACA,IAAAH,EAAArC,KAAA2C,WAAA,CAAAP,MAAApC,KAAAa,QAAAvB,EAAAkD,IACAxC,KAAAY,QAAAsC,KAAAb,GACAY,EAAAjC,SAAAkC,KAAAb,OAEA,CACAA,EAAArC,KAAA2C,WAAA,CAAAP,MAAApC,KAAAa,QAAAvB,GACAU,KAAAY,QAAAsC,KAAAb,GACAY,EAAAjC,SAAAkC,KAAAb,GAGArC,KAAAmD,cAAA,WAAA,KAAAF,IAGA5C,QAAA,SAAAD,EAAAd,GACA,GAAAU,KAAA0C,WAAApD,GAAA,CAKA,IAAA2D,EAAA,CAAAjC,SAAA,GAAAG,QAAA,IAEAnB,KAAAO,QAAAH,GAAAgD,QAAA,SAAAf,GACA,IAAAgB,EAAArD,KAAA2C,WAAAN,EAAA/C,GACAH,IAAAgD,MAAAE,EAAAgB,KACAJ,EAAA9B,QAAA+B,KAAA/D,IAAAmE,MAAAjB,IACAY,EAAAjC,SAAAkC,KAAA/D,IAAAmE,MAAAD,IACAxD,OAAAgD,OAAAR,EAAAgB,KAEArD,MAEAA,KAAAmD,cAAA,UAAA,KAAAF,QAfAjB,QAAAC,KAAA,gBAAA3C,IAkBAoB,QAAA,SAAAN,GACA,iBAAAA,IAAAA,EAAA,CAAAgC,IAAAhC,IAEA,IAAA6C,EAAA,CAAAjC,SAAA,GAAAG,QAAA,IAEAnB,KAAAY,QAAAZ,KAAAY,QAAAR,OAAA,SAAAiC,GACA,IAAA,IAAAI,KAAArC,EACA,GAAAiC,EAAAI,KAAArC,EAAAqC,GAEA,OADAQ,EAAA9B,QAAA+B,KAAA/D,IAAAmE,MAAAjB,KACA,EAIA,OAAA,IAGArC,KAAAmD,cAAA,UAAA,KAAAF,IAGA/C,OAAA,WACA,IAAAZ,EAAAuC,KAAA0B,UAAA,CACA3C,QAAAZ,KAAAY,QACAC,OAAAb,KAAAa,SAGAvB,IAAAU,KAAAuB,MAAAI,QAAA,aAAA3B,KAAA4B,QACA5B,KAAAuB,MAAAiC,QAAA,aAAAxD,KAAA4B,KAAAtC,GAEAU,KAAAkC,aAIAA,SAAA,WACA,IAAA5C,EAAAH,IAAAmE,MAAAtD,KAAAY,SAEA,GAAA,iBAAAZ,KAAAyB,MAAA7B,QACA,IAAA,IAAA4C,KAAAlD,EAAA,CACA,IAAA+C,EAAA/C,EAAAkD,GACAiB,EAAA,IAAAtE,IAAA6D,UAAAnD,OAAAgD,OAAA,CACAa,OAAArB,EACAsB,OAAAnB,EACAoB,KAAApB,GACAH,GAAArC,MAEA,IAAA,IAAA6D,KAAA7D,KAAAyB,MAAA7B,QACAyC,EAAAwB,GAAA1E,IAAA2C,MAAA9B,KAAAyB,MAAA7B,QAAAiE,GAAAJ,GAKAzD,KAAA8D,IAAA,OAAAxE","file":"../dmxDatastore/dmxDatastore.js","sourcesContent":["dmx.Component('datastore', {\r\n\r\n initialData: function() {\r\n return {\r\n data: []\r\n };\r\n },\r\n\r\n attributes: {\r\n session: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n columns: {\r\n type: Object,\r\n default: {}\r\n }\r\n },\r\n\r\n methods: {\r\n insert: function(data) {\r\n this._insert(data);\r\n this._store();\r\n },\r\n\r\n update: function(filter, data) {\r\n this._update(filter, data);\r\n this._store();\r\n },\r\n\r\n upsert: function(filter, data) {\r\n var toUpdate = this._filter(filter);\r\n if (toUpdate.length) {\r\n this._update(filter, data);\r\n } else {\r\n this._insert(data);\r\n }\r\n this._store();\r\n },\r\n\r\n delete: function(filter) {\r\n this._delete(filter);\r\n this._store();\r\n },\r\n\r\n clear: function() {\r\n this.records = [];\r\n this.lastid = 0;\r\n this._store();\r\n },\r\n\r\n get: function(filter) {\r\n return this._filter(filter);\r\n }\r\n },\r\n\r\n events: {\r\n inserted: Event,\r\n updated: Event,\r\n deleted: Event\r\n },\r\n\r\n render: function(node) {\r\n this.$node = null;\r\n this.store = window[this.props.session ? 'sessionStorage' : 'localStorage'];\r\n this.records = [];\r\n this.lastid = 0;\r\n\r\n try {\r\n var stored = this.store.getItem('datastore_' + this.name);\r\n if (stored) {\r\n stored = JSON.parse(stored);\r\n if (stored.records) this.records = stored.records;\r\n if (stored.lastid) this.lastid = stored.lastid;\r\n }\r\n } catch(err) {\r\n console.warn('Error parsing datastore', err);\r\n }\r\n\r\n //this.set('data', dmx.clone(this.records));\r\n this._setData();\r\n },\r\n\r\n update: function(props) {\r\n if (!dmx.equal(props.columns, this.props.columns)) {\r\n this._setData();\r\n }\r\n },\r\n\r\n _filter: function(filter) {\r\n if (typeof filter == 'number') filter = { $id: filter };\r\n\r\n return this.records.filter(function filterRecord(record) {\r\n if (Array.isArray(filter)) {\r\n for (var i = 0; i < filter.length; i++) {\r\n for (var prop in filter[i]) {\r\n if (record[prop] === filter[i][prop]) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (var prop in filter) {\r\n if (record[prop] === filter[prop]) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n },\r\n\r\n _parseData: function(data) {\r\n if (typeof data == 'object' && !Array.isArray(data)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _mergeData: function(record, data) {\r\n var merged = Object.assign({}, record);\r\n \r\n for (var prop in data) {\r\n var value = data[prop];\r\n\r\n if (typeof value == 'string' && value.indexOf('{{') != -1) {\r\n value = dmx.parse(value, new dmx.DataScope(record, this));\r\n }\r\n\r\n merged[prop] = value;\r\n }\r\n\r\n return merged;\r\n },\r\n\r\n _insert: function(data) {\r\n var result = { inserted: [], deleted: [] };\r\n\r\n if (Array.isArray(data)) {\r\n for (var i = 0; i < data.length; i++) {\r\n var record = this._mergeData({ $id: ++this.lastid }, data[i]);\r\n this.records.push(record);\r\n result.inserted.push(record);\r\n }\r\n } else {\r\n var record = this._mergeData({ $id: ++this.lastid }, data);\r\n this.records.push(record);\r\n result.inserted.push(record);\r\n }\r\n\r\n this.dispatchEvent('inserted', null, result);\r\n },\r\n\r\n _update: function(filter, data) {\r\n if (!this._parseData(data)) {\r\n console.warn('Invalid data!', data);\r\n return;\r\n }\r\n\r\n var result = { inserted: [], deleted: [] };\r\n \r\n this._filter(filter).forEach(function(record) {\r\n var newRecord = this._mergeData(record, data);\r\n if (!dmx.equal(record, newRecord)) {\r\n result.deleted.push(dmx.clone(record));\r\n result.inserted.push(dmx.clone(newRecord));\r\n Object.assign(record, newRecord);\r\n }\r\n }, this);\r\n\r\n this.dispatchEvent('updated', null, result);\r\n },\r\n\r\n _delete: function(filter) {\r\n if (typeof filter == 'number') filter = { $id: filter };\r\n\r\n var result = { inserted: [], deleted: [] };\r\n\r\n this.records = this.records.filter(function(record) {\r\n for (var prop in filter) {\r\n if (record[prop] === filter[prop]) {\r\n result.deleted.push(dmx.clone(record));\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n });\r\n\r\n this.dispatchEvent('deleted', null, result);\r\n },\r\n\r\n _store: function() {\r\n var data = JSON.stringify({\r\n records: this.records,\r\n lastid: this.lastid\r\n });\r\n\r\n if (data !== this.store.getItem('datastore_' + this.name)) {\r\n this.store.setItem('datastore_' + this.name, data);\r\n //this.set('data', dmx.clone(this.records));\r\n this._setData();\r\n }\r\n },\r\n\r\n _setData: function() {\r\n var data = dmx.clone(this.records);\r\n\r\n if (typeof this.props.columns == 'object') {\r\n for (var i in data) {\r\n var record = data[i];\r\n var scope = new dmx.DataScope(Object.assign({\r\n $value: record,\r\n $index: i,\r\n $key: i\r\n }, record), this);\r\n\r\n for (var column in this.props.columns) {\r\n record[column] = dmx.parse(this.props.columns[column], scope);\r\n }\r\n }\r\n }\r\n\r\n this.set('data', data);\r\n }\r\n\r\n});\r\n"]}