add forEachDescend to iterate over all descendant widgets; update select box to skip publish on invalid values