diff --git a/ui (gen4)/features/config.js b/ui (gen4)/features/config.js index d27991f4..5ae2fbfb 100755 --- a/ui (gen4)/features/config.js +++ b/ui (gen4)/features/config.js @@ -112,9 +112,10 @@ module.ConfigStore = core.ImageGridFeatures.Feature({ handlers: [ // XXX need to update rather than rewrite things... ['prepareStoreToSave', - function(res, query){ + function(res, query, data){ var ls_path = '${INSTANCE}/config' //var ls_path = 'config' + query = this.parseStoreQuery(query) // config not requested... if(query.key != '*' @@ -127,12 +128,14 @@ module.ConfigStore = core.ImageGridFeatures.Feature({ // NOTE: we do not need to clone anything here as this // will be done by the localStorage handler... if(query.store.indexOf('storage') >= 0){ - res.data.storage[ls_path] = this.config + //res.data.storage[ls_path] = this.config + res.data.storage[ls_path] = data || this.config } if(query.store.indexOf('fileSync') >= 0){ // XXX should this include path??? - res.data.fileSync[this.config['config-fs-filename'] || '.ImageGrid.json'] = this.config + //res.data.fileSync[this.config['config-fs-filename'] || '.ImageGrid.json'] = this.config + res.data.fileSync[this.config['config-fs-filename'] || '.ImageGrid.json'] = data || this.config } }], //['prepareIndexForLoad', diff --git a/ui (gen4)/features/store.js b/ui (gen4)/features/store.js index 60f4cb14..a664303a 100755 --- a/ui (gen4)/features/store.js +++ b/ui (gen4)/features/store.js @@ -192,22 +192,12 @@ var StoreActions = actions.Actions({ return query }], - // XXX this should: - // - parse query - // - call: .prepareStoreToSave(..) / .prepareStoreToLoad(..) ??? - // - call: .saveStore(..) / .loadStore(..) - // XXX need to be able to either just get data or load/init it too... - // i.e. we need two stages/APIs: - // - get/set/del key -- via .store(..) - // - load/save key -- via system events and specific actions... - // e.g. just get the config from store or get it and set it to .config... - // - load/save/clear - // -> .loadConfig() / .saveConfig() / .resetConfig() - // - get/set/del - // -> .store('*:config') / .store('*:config', value) / .store('*:config', null) - // ...think initializing should be done by the owner plugin... + + // HL API... + // // XXX sync or async or both??? // ...should we add an .onStore(query, handler) event/promise??? + // one way to do this is to place promises into res where async... store: ['- Store/', core.doc` @@ -222,6 +212,16 @@ var StoreActions = actions.Actions({ .store(query, null) + Returns: + { + : { + : , + ... + }, + ... + } + + NOTE: for query syntax see .parseStoreQuery(..) @@ -237,87 +237,26 @@ var StoreActions = actions.Actions({ .loadStore(..) .saveStore(..) .clearStore(..) + + NOTE: .prepareStoreToSave(..) is triggered only when no data + is passed to .saveStore(..)... + NOTE: .prepareStoreToLoad(..) is called every time .loadStore(..) + is called... + `, function(query, value){ query = this.parseStoreQuery(query) - return ( // get... - // XXX should this call the .prepareStoreToLoad(..) or - // should it be handled in .loadStore(..)??? arguments.length == 1 ? - //this.loadStore(query) - this.prepareStoreToLoad( - query, - this.loadStore(query)) + this.loadStore(query) // delete... : (value === undefined && arguments.length == 2) ? this.clearStore(query) // set... - // XXX should this call the .prepareStoreToSave(..) or - // should it be handled in .saveStore(..)??? - //: this.saveStore(query, value) ) }], - : this.saveStore( - query, - value || this.prepareStoreToSave(query)) ) }], + : (this.saveStore(query, value) && undefined) ) }], - // XXX these expect the parsed query... - // XXX extend these per store... - // XXX should clients trigger a stored event??? - saveStore: ['- Store/', - core.doc` - - .saveStore(query, data) - - `, - core.notUserCallable(function(query, data){ - // Extending action must: - // - save query/data to it's store... - // XXX should this be called outer??? - // XXX how do we handle the case where no data was given??? - // XXX how do we pass the results to handlers??? - //this.prepareStoreToSave(query, data) - })], - // XXX should this be sync or async??? - // one way to do this is to place promises into res where async... - loadStore: ['- Store/', - core.doc` - `, - core.notUserCallable(function(query){ - // Extending action must: - // - populate query from it's store... - // - trigger .storeDataLoaded(store) event when done... - // - // NOTE: if query.store is a single value then the root object - // must be populated, otherwise the appropriate section - // should be used... - // e.g. - // if(query.store.length == 1){ - // res = data - // } else { - // res['store-key'] = data - // } - var res = {} - query - && query.store.length >= 1 - && query.store.forEach(function(s){ res[s] = {} }) - // XXX should this be called outer??? - //return this.prepareStoreToLoad(query, res) - return res - })], - // XXX should clients trigger a stored event??? - clearStore: ['- Store/', - core.doc` - `, - core.notUserCallable(function(query){ - // Extending action: - // - must clear query from it's store... - })], - - // XXX these should: - // - transform data to/from saved state - // XXX these expect the parsed query... - // XXX define these per data set... + // Application API... prepareStoreToSave: ['- Store/', core.doc` @@ -342,7 +281,6 @@ var StoreActions = actions.Actions({ query = this.parseStoreQuery(query) var stores = query.store || defaults.store - // XXX is this needed here??? data = data || {} query.store.forEach(function(s){ data[s] = {} }) @@ -355,8 +293,6 @@ var StoreActions = actions.Actions({ data: data || {}, } }], - // XXX use query??? - // XXX should this be the same as .prepareStoreToSave(..)??? prepareStoreToLoad: ['- Store/', core.doc` @@ -365,9 +301,75 @@ var StoreActions = actions.Actions({ function(query, data){ return data || {} }], + // Store API... + // XXX BUG: .saveStore('storage:moo', 123) saves this.data + saveStore: ['- Store/', + core.doc` + + Build and store all/query data... + .saveStore() + .saveStore(query) + -> data + + Store query data... + .saveStore(query, data) - // XXX EXPERIMENTAL / LEGACY STUFF... + NOTE: this only calls .prepareStoreToSave(..) if no data is given... + NOTE: the returned data is the same format as returned by .store(..) + `, + core.notUserCallable(function(query, data){ + // Extending action must: + // - save query/data to it's store... + return data == null ? + this.prepareStoreToSave(this.parseStoreQuery(query), {}).data + : undefined + })], + loadStore: ['- Store/', + core.doc` + + .loadStore(query) + -> data + + + NOTE: async stores will write promises to .data + `, + core.notUserCallable(function(query){ + // Extending action must: + // - populate query from it's store... + // - trigger .storeDataLoaded(store) event when done... + // + // NOTE: if query.store is a single value then the root object + // must be populated, otherwise the appropriate section + // should be used... + // e.g. + // if(query.store.length == 1){ + // res = data + // } else { + // res['store-key'] = data + // } + var res = {} + var q = this.parseStoreQuery(query) + query + && q.store.length >= 1 + && q.store.forEach(function(s){ res[s] = {} }) + return this.prepareStoreToLoad(q, res) + })], + clearStore: ['- Store/', + core.doc` + + .clearStore(query) + + + `, + core.notUserCallable(function(query){ + // Extending action: + // - must clear query from it's store... + })], + + + + // XXX LEGACY STUFF... (???) // XXX REVISE API @@ -665,39 +667,49 @@ module.StoreLocalStorage = core.ImageGridFeatures.Feature({ // XXX should we use .localStorageDataHandler(..) here??? // XXX the following two sections are almost identical... ['saveStore', - function(_, query, value){ + function(res, query, value){ + var q = this.parseStoreQuery(query) query - && query.key instanceof Array - && query.store.indexOf('storage') >= 0 - && query.key.forEach(function(k){ - this.localStorageDataHandler(k, value) }.bind(this)) }], + && q.key instanceof Array + && q.store.indexOf('storage') >= 0 + && q.key.forEach(function(k){ + this.localStorageDataHandler( + k, + res !== this ? res.data : value) }.bind(this)) }], ['loadStore', function(res, query){ + query = this.parseStoreQuery(query) res.storage && Object.assign(res.storage, this.localStorageDataHandler(query.key)) }], ['clearStore', function(_, query){ + var q = this.parseStoreQuery(query) query - && query.store.indexOf('storage') >= 0 - && this.localStorageDataHandler(query.key, null) }], + && q.store.indexOf('storage') >= 0 + && this.localStorageDataHandler(q.key, null) }], // sessionStorage... ['saveStore', - function(_, query, value){ + function(res, query, value){ + var q = this.parseStoreQuery(query) query - && query.key instanceof Array - && query.store.indexOf('session') >= 0 - && query.key.forEach(function(k){ - this.sessionStorageDataHandler(k, value) }.bind(this)) }], + && q.key instanceof Array + && q.store.indexOf('session') >= 0 + && q.key.forEach(function(k){ + this.sessionStorageDataHandler( + k, + res !== this ? res.data : value) }.bind(this)) }], ['loadStore', function(res, query){ + query = this.parseStoreQuery(query) res.session && Object.assign(res.storage, this.sessionStorageDataHandler(query.key)) }], ['clearStore', function(_, query){ + var q = this.parseStoreQuery(query) query - && query.store.indexOf('session') >= 0 - && this.sessionStorageDataHandler(query.key, null) }], + && q.store.indexOf('session') >= 0 + && this.sessionStorageDataHandler(q.key, null) }], ], })