add dynamic form generation (wip)