From c70354997a2e7a6c1995bc0952aa1b94857ce88e Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Mon, 25 May 2015 11:22:53 +0300 Subject: [PATCH] Support nested parameters in object configurations in presets. --- lib/common.coffee | 14 +++++++++++++- lib/presets.coffee | 34 ++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/lib/common.coffee b/lib/common.coffee index 0983161..1834d4d 100644 --- a/lib/common.coffee +++ b/lib/common.coffee @@ -82,10 +82,22 @@ exports.parseDeviceId = (deviceId) -> exports.extend = (obj, mixin) -> - obj[name] = method for name, method of mixin + obj[name] = method for name, method of mixin obj +exports.flattenObject = (object) -> + newObj = {} + f = (obj, prefix) -> + for k, v of obj + if typeof(v) is 'object' + f(v, "#{prefix}#{k}.") + else + newObj["#{prefix}#{k}"] = v + f(object, '') + return newObj + + exports.getParamValueFromPath = (obj, path) -> pp = path.split('.') ref = obj diff --git a/lib/presets.coffee b/lib/presets.coffee index 4144025..ffc6805 100644 --- a/lib/presets.coffee +++ b/lib/presets.coffee @@ -54,12 +54,21 @@ exports.calculatePresetsHash = (presets, objects) -> matchObject = (object, param) -> - return false if not object._keys? or object._keys.length == 0 - for k in object._keys - return false if not param[k]? - v = common.matchType(param[k]._value, object[k]) - if param[k]._value != v + flatObject = common.flattenObject(object) + if object._keys?.length + keys = object._keys + else + # Consider all parameters as keys if none are defined + keys = (k for k in Object.keys(flatObject) when k[0] != '_') + + for k in keys + p = common.getParamValueFromPath(param, k) + return false if not p? + v = common.matchType(p._value, flatObject[k]) + + if p._value != common.matchType(p._value, flatObject[k]) return false + return true @@ -250,18 +259,19 @@ exports.processDevicePreset = (deviceId, devicePreset, callback) -> for objectName, objectDetails of object continue if not objectDetails.current? if objectDetails.preset? + flatObject = common.flattenObject(objectDetails.preset) if Object.keys(objectDetails.current).length > 0 for i, obj of objectDetails.current - for paramName, paramValue of objectDetails.preset + for paramName, paramValue of flatObject continue if paramName[0] == '_' - if obj[paramName] - currentValue = obj[paramName]._value - presetValue = common.matchType(currentValue, objectDetails.preset[paramName]) - if currentValue != presetValue - setParameterValues.push(["#{parameterPath}.#{i}.#{paramName}", presetValue, obj[paramName]._type]) + currentValue = common.getParamValueFromPath(obj, paramName) + if currentValue? + presetValue = common.matchType(currentValue._value, flatObject[paramName]) + if currentValue._value != presetValue + setParameterValues.push(["#{parameterPath}.#{i}.#{paramName}", presetValue, currentValue._type]) else vals = [] - for k,v of objectDetails.preset + for k,v of flatObject vals.push([k, v]) if k[0] != '_' taskList.push({device : deviceId, name : 'addObject', objectName : parameterPath, parameterValues : vals, instanceName : objectName}) else if Object.keys(objectDetails.current).length > 0