{"version":3,"sources":["components/datastore.js"],"names":["dmx","Component","initialData","batch","data","attributes","session","type","Boolean","default","columns","Object","methods","insert","this","_insert","update","filter","_update","upsert","_upsert","delete","_delete","clear","_clear","get","_filter","startBatch","set","endBatch","_updateData","events","inserted","Event","updated","deleted","render","init","_records","_lastid","_save","bind","_storageHandler","window","addEventListener","_read","destroy","removeEventListener","performUpdate","updatedProps","has","JSON","parse","_store","getItem","name","records","lastid","err","console","warn","$id","record","Array","isArray","i","length","prop","result","debug","time","_array","forEach","entry","_mergeData","push","clone","timeEnd","dispatchEvent","_validData","updatedRecord","equal","assign","merged","value","_isExpression","DataScope","props","map","index","scope","$value","$index","$key","column","delay","clearTimeout","setTimeout","stringify","setItem","includes","event"],"mappings":"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","file":"dmxDatastore.js","sourcesContent":["dmx.Component('datastore', {\r\n\r\n initialData: {\r\n batch: false,\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: null,\r\n },\r\n },\r\n\r\n methods: {\r\n insert (data) {\r\n this._insert(data);\r\n },\r\n\r\n update (filter, data) {\r\n this._update(filter, data);\r\n },\r\n\r\n upsert (filter, data) {\r\n this._upsert(filter, data);\r\n },\r\n\r\n delete (filter) {\r\n this._delete(filter);\r\n },\r\n\r\n clear () {\r\n this._clear();\r\n },\r\n\r\n get (filter) {\r\n return this._filter(filter)\r\n },\r\n\r\n startBatch () {\r\n this.set('batch', true);\r\n },\r\n\r\n endBatch () {\r\n this.set('batch', false);\r\n this._updateData();\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: false,\r\n\r\n init () {\r\n this._records = [];\r\n this._lastid = 0;\r\n\r\n this._save = this._save.bind(this);\r\n this._updateData = this._updateData.bind(this);\r\n this._storageHandler = this._storageHandler.bind(this);\r\n\r\n window.addEventListener('storage', this._storageHandler);\r\n\r\n this._read();\r\n },\r\n\r\n destroy () {\r\n window.removeEventListener('storage', this._storageHandler);\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n if (updatedProps.has('columns')) {\r\n this._updateData();\r\n }\r\n },\r\n\r\n _read () {\r\n try {\r\n const data = JSON.parse(this._store().getItem('datastore_' + this.name));\r\n\r\n if (data) {\r\n if (data.records) this._records = data.records;\r\n if (data.lastid) this._lastid = data.lastid;\r\n this._updateData();\r\n }\r\n } catch (err) {\r\n console.warn('Error parsing datastore', err);\r\n }\r\n },\r\n\r\n _filter (filter) {\r\n if (typeof filter == 'number') {\r\n filter = { $id: filter };\r\n }\r\n\r\n return this._records.filter(record => {\r\n if (Array.isArray(filter)) {\r\n for (const i = 0; i < filter.length; i++) {\r\n for (const prop in filter[i]) {\r\n if (record[prop] === filter[i][prop]) return true;\r\n }\r\n }\r\n } else {\r\n for (const prop in filter) {\r\n if (record[prop] === filter[prop]) return true;\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n },\r\n\r\n _insert (data) {\r\n const result = { inserted: [], deleted: [] };\r\n\r\n if (dmx.debug) {\r\n console.debug('_insert method');\r\n console.time('_insert' + this.name);\r\n }\r\n \r\n this._array(data).forEach(entry => {\r\n const record = this._mergeData({ $id: ++this._lastid }, entry);\r\n this._records.push(record);\r\n result.inserted.push(dmx.clone(record));\r\n });\r\n\r\n if (dmx.debug) {\r\n console.timeEnd('_insert' + this.name);\r\n }\r\n this._save();\r\n\r\n this.dispatchEvent('inserted', null, result);\r\n },\r\n\r\n _update (filter, data) {\r\n if (!this._validData(data)) {\r\n console.warn('Invalid data!', data);\r\n return;\r\n }\r\n\r\n const result = { inserted: [], deleted: [] };\r\n\r\n if (dmx.debug) {\r\n console.debug('_update method');\r\n console.time('_update' + this.name);\r\n }\r\n\r\n this._filter(filter).forEach(record => {\r\n const updatedRecord = this._mergeData(record, data);\r\n if (!dmx.equal(record, updatedRecord)) {\r\n result.deleted.push(dmx.clone(record));\r\n result.inserted.push(dmx.clone(updatedRecord));\r\n Object.assign(record, updatedRecord);\r\n }\r\n });\r\n\r\n if (dmx.debug) {\r\n console.timeEnd('_update' + this.name);\r\n }\r\n\r\n this._save();\r\n\r\n this.dispatchEvent('updated', null, result);\r\n },\r\n\r\n _upsert (filter, data) {\r\n const toUpdate = this._filter(filter);\r\n\r\n if (toUpdate.length) {\r\n this._update(filter, data);\r\n } else {\r\n this._insert(data);\r\n }\r\n },\r\n\r\n _delete (filter) {\r\n const result = { inserted: [], deleted: [] };\r\n\r\n if (typeof filter == 'number') {\r\n filter = { $id: filter };\r\n }\r\n\r\n if (dmx.debug) {\r\n console.debug('_delete method');\r\n console.time('_delete' + this.name);\r\n }\r\n\r\n this._records = this._records.filter(record => {\r\n for (const 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 if (dmx.debug) {\r\n console.timeEnd('_delete' + this.name);\r\n }\r\n\r\n this._save();\r\n\r\n this.dispatchEvent('deleted', null, result);\r\n },\r\n\r\n _clear () {\r\n this._records = [];\r\n this._lastid = 0;\r\n this._save();\r\n },\r\n\r\n _validData (data) {\r\n return typeof data == 'object' && !Array.isArray(data);\r\n },\r\n\r\n _mergeData (record, data) {\r\n if (dmx.debug) {\r\n console.debug('Merge Data');\r\n console.time('merge' + this.name);\r\n }\r\n\r\n const merged = Object.assign({}, record);\r\n\r\n for (const prop in data) {\r\n let value = data[prop];\r\n\r\n if (this._isExpression(value)) {\r\n value = dmx.parse(value, dmx.DataScope(record, this));\r\n }\r\n\r\n merged[prop] = value;\r\n }\r\n\r\n if (dmx.debug) {\r\n console.timeEnd('merge' + this.name);\r\n }\r\n\r\n return merged;\r\n },\r\n\r\n _updateData () {\r\n if (this.data.batch) return;\r\n if (this.props.columns && typeof this.props.columns == 'object') {\r\n if (dmx.debug) {\r\n console.debug('Update data columns');\r\n console.time('update' + this.name);\r\n }\r\n this.set('data', this._records.map((record, index) => {\r\n const updatedRecord = dmx.clone(record);\r\n const scope = dmx.DataScope({ $value: record, $index: index, $key: index , ...record }, this);\r\n\r\n for (const column in this.props.columns) {\r\n let value = this.props.columns[column];\r\n\r\n if (this._isExpression(value)) {\r\n value = dmx.parse(value, scope);\r\n }\r\n\r\n updatedRecord[column] = value;\r\n }\r\n\r\n return updatedRecord;\r\n }));\r\n if (dmx.debug) {\r\n console.timeEnd('update' + this.name);\r\n }\r\n } else {\r\n if (dmx.debug) {\r\n console.debug('Update data records');\r\n console.time('update' + this.name);\r\n }\r\n this.set('data', dmx.clone(this._records));\r\n if (dmx.debug) {\r\n console.timeEnd('update' + this.name);\r\n }\r\n }\r\n },\r\n\r\n _save () {\r\n this._updateData();\r\n\r\n if (this.delay) {\r\n clearTimeout(this.delay);\r\n }\r\n\r\n this.delay = setTimeout(() => {\r\n if (dmx.debug) {\r\n console.debug('Save data to storage');\r\n console.time('store' + this.name);\r\n }\r\n const data = JSON.stringify({\r\n records: this._records,\r\n lastid: this._lastid,\r\n });\r\n\r\n this._store().setItem('datastore_' + this.name, data);\r\n if (dmx.debug) {\r\n console.timeEnd('store' + this.name);\r\n }\r\n });\r\n },\r\n\r\n _isExpression (value) {\r\n return typeof value == 'string' && value.includes('{{');\r\n },\r\n\r\n _array (data) {\r\n return Array.isArray(data) ? data : [data];\r\n },\r\n\r\n _store () {\r\n return window[(this.props.session ? 'session' : 'local') + 'Storage'];\r\n },\r\n\r\n _storageHandler (event) {\r\n this._read();\r\n },\r\n\r\n});\r\n"]}