{"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","store","window","props","_read","bind","addEventListener","fields","has","_setData","stored","getItem","name","JSON","parse","err","console","warn","$id","record","Array","isArray","i","prop","hasOwnProperty","_parseData","_mergeData","merged","assign","value","_isExpression","DataScope","result","push","dispatchEvent","forEach","newRecord","equal","clone","stringify","setItem","set","map","scope","$value","$index","$key","column","includes"],"mappings":"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","file":"../dmxDatastore/dmxDatastore.js","sourcesContent":["dmx.Component('datastore', {\r\n\r\n initialData: {\r\n data: []\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.store = window[this.props.session ? 'sessionStorage' : 'localStorage'];\r\n this.records = [];\r\n this.lastid = 0;\r\n\r\n this._read = this._read.bind(this);\r\n\r\n if (!this.props.session) {\r\n window.addEventListener('storage', this._read);\r\n }\r\n \r\n this._read();\r\n },\r\n\r\n update: function(props, fields) {\r\n if (fields.has('columns')) {\r\n this._setData();\r\n }\r\n },\r\n\r\n _read: function() {\r\n try {\r\n var stored = this.store.getItem('datastore_' + this.name);\r\n\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._setData();\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((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 (!filter[i].hasOwnProperty(prop)) continue;\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 (!filter.hasOwnProperty(prop)) continue;\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 if (!data.hasOwnProperty(prop)) continue;\r\n\r\n var value = data[prop];\r\n\r\n if (this._isExpression(value)) {\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((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 });\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 (!filter.hasOwnProperty(prop)) continue;\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._setData();\r\n }\r\n },\r\n\r\n _setData: function() {\r\n if (typeof this.props.columns == 'object') {\r\n this.set('data', this.records.map((record, i) => {\r\n const result = dmx.clone(record);\r\n const scope = dmx.DataScope({\r\n $value: record,\r\n $index: i,\r\n $key: i,\r\n ...record\r\n });\r\n\r\n for (let column in this.props.columns) {\r\n if (!this.props.columns.hasOwnProperty(column)) continue;\r\n let value = this.props.columns[column];\r\n if (this._isExpression(value)) {\r\n value = dmx.parse(value, scope);\r\n }\r\n result[column] = value;\r\n }\r\n\r\n return result;\r\n }));\r\n } else {\r\n this.set('data', this.records);\r\n }\r\n },\r\n\r\n _isExpression: function(value) {\r\n return typeof value == 'string' && value.includes('{{');\r\n }\r\n\r\n});\r\n"]}