Version history most recent first

v0.9.8 [8th beta release]

  1. Create a load test example. Generates several large data structures and displays in tables. Include some @$xx variables.
  2. Generate before and after processing messages. single subscribe method adds to two different pubSub systems. (look at modelling on node 'on' setup.) Use a timeout after before - so UI can be updated
  3. Try to speed up sync/heartbeat process.
    • Explore pass1 and pass2. Could they be organised differently.
    • Look at small changes, separate lists of bindings. Always calculating dependents.
    • Look at a big change, dirty becomes part of the binding rather than a separate list. Only visible items are updated - and get dirty cleared.
  4. Track user activity. keep status 'normal'|'busy'|'sleep' and times of last activity. When 'busy' don't trigger heartbeat activity. When 'sleep' don't sync to storage. Any key/mouse/touch activity ends sleep state. Any zynii key activity triggers busy. No activity for 1/2 - 1 second ends busy state. Lack of activity for N minutes triggers sleep state.
  5. Create a dumb transform method. Generates static html from HTML template, JSON and possibly a list of functions.
  6. Also get rid of _curr => move to el.zynii.curr.
  7. demos should have separate index and webindex.html pages. Deploy the 2nd
  8. BUG: There is a glitch (probably across all browsers) that shows up in the dialog demo. Changing the $index value and redisplaying the dialog some-times a field gets changed to the previous value. This is probably a combination of the fact that the main tick loop goes through different states, and that a zyniiCurr value is stored in the element. [This may have to be done differently - depending on mode being blur/click].
  9. run tests
    • run node tester
    • run testframe in each browser
    • make zynii.js (browserify)
    • run demos on each browser

v0.9.7 [7th beta release]

  1. move typeOf and path. utils from model.js to utils.js
    • add to utils.js
    • add tests to utils.test.js
    • remove from model.js
    • update parser.js, model.js, app.js to use utils.js versions.
    • remove tests from model.test.js and modelB.test.js
  2. app.test.js doesn't really work on node. minidom doesn't fake properties of DOM objects well enough. JSDOM is probably impossible (too many dependencies - difficult to run on windows). Implement own mocking code or look at jsdom-little. Or accept this isn't node testable and instead run app.test.html on each browser
  3. in IE9, in debug. When you list an array - it's an object with properties 0, 1, 2,3 [JSON doesn't work between iframes].
  4. If errors occur in the core zynii code - should really generate Zynii exceptions.
  5. setup test case with nested functions.
  6. Nested functions. need to figure out if this works and if not whether fault is in parser or evaluate. [Appears to work ]
  7. require.js cleanup JSLint/Hint.
  8. input type=number has spin controls. These probably generate onclick events. Could adapt zyniify to hook these even when in blur mode... [DONE NEEDS TESTING]
  9. Build a test harness for require.js and make work more like node. (Or look at npm library for pre-existing code commonjs require/mr)
  10. poly.js. Possible test harness - HTML only! - just tests that won't raise an exception and that classList will work.
  11. poly.js cleanup JSLint/Hint.
  12. deploy just the required files (zynii.js/debug.html/dump.html/new index file)
  13. deploy a source version. Adds source code, test files etc. possibly in sub-folders?
  14. scrap beta folders on web-site. Look to remove other stuff that can be done on desktop.

v0.9.6 [6th beta release]

  1. debug.html - WBNI refresh called function rather than doing page refresh.
  2. debug.html doesn't seem to work on safari/IE11/10/9. Although other demos and tests work. Works in Chrome, Firefox. Trips in both safari/IE on the attributes property of an element (in patchHTML). Change .attributes[] to hasAttribute(). [UNTESTED!]
  3. debug.html WBNI navbar didn't switch to drop-down on narrower screens.
  4. debug.html. Uses bootstrap. Need to either include bootstrap or use CDN for b/s and jQuery....
  5. Modify demos. Remove box to edit model - instead refer users to debug page.
  6. create index.html pages for all folders in test setup - so is easier to run all tests etc.
  7. demo/params.html. Uses bootstrap which isn't loaded - change path or use CDN version
  8. modify tester.js and tester.json - so calls to server can be emulated in nodeJS. Include a map of urls to javascript functions to handle server requests....]
  9. tester.js. make tester.json a js file and require it. Allows comments and code to be embedded in.
  10. when browing a directory - tester should test for index.html. If not found might generate a folder listing. Like web servers used to!
  11. Code review: Work through testing code: tester.js, miniJasmine.js, each of the xx.test.js files, each of the xxx.test.html files. Try and make testing more robust.
  12. Try to extend unit testing to make more comprehensive: utils.js, model.js
  13. Current tests don't work properly on IE9/IE10. model.test.html and parser.test.html work. utils.test.html and app.test.html fail - though not for an obvious reason.
  14. replace deploy.php with js version working from home system. Creates zip, copies zip, src, demos etc to
  15. app.js cleanup JSLint/Hint.
  16. demo/static.html. On nexus - local store doesn't work..

v0.9.5 [5th beta release]

persist.js scrapped (done in model). model, schema and options can now be preset when calling newApp() (replaces .app.js()). zyniPoly.js scrapped, replaced by poly.js - which is included automatically. zynii.js renamed to app.js.

Using browserify to generate static zynii.js file from all the separate dynamically loadable modules. Added tester.js script - runs under node and runs tests and acts as web server.

  1. Rewrote tester.js. node script acts as web server and testing server. Allows running of all test scripts under node.
  2. persist.js - This could now be moved into model.js. Need to have a way of unit testing in this setup.
  3. Modify zynii.App(schema, options) to pass schema and options to model.
  4. Update all demos and test code to use new model persist mechanism
  5. scrap persist.js
  6. update ebook to current Persist mechanism, newApp(), zynii.js, no persist.js, no zyniiPoly.js.....
  7. Add support for IE8?
  8. Assume never going to support anything before IE9. zyniiPoly could be slimmed down - rename to poly.js. Just needs shims for IE9 and IE10.
  9. poly.js could be dynamically loaded as part of zynii
  10. Look at using browserify (in npm) to compile zynii down to a single browser script. require/persist/zyniiPoly not needed. zynii.js built from model.js, parser.js, utils.js, app.js
  11. if moving persist - might also move model and parser eventually.
  12. Stress test ensureEL() for tr li etc in table/div/ul/ol etc. (This may no longer be required as templates now based on DOM rather than innerHTML - might need to stress test templates.)
  13. debug.html - add internal model listing.
  14. debug.html - template listing a bit buggy (see demos/table1.html)
  15. debug.html - WBNI you could modify values in the model from debug page.

v0.9.4 [4th beta release]

An interim release to fix problems with previous release. Some new features (eg schema replacing persist) but not fully implemented in demos or docs

  1. Moved tests code from units to separate files.
  2. Implemented schema for model. This allows persistence to be declared rather than coded. persistence/load/saving code built into model.
  3. Numerous changes to try and reduce number of JSLint warnings.

v0.9.3 [3rd beta release - features]

  1. migrate tests to node based framework.
    • require.js
    • utils.js
    • model.js
    • parser.js
    • persist.js
    • zynii.js
  2. get tests working on browser - served by node
  3. get demos working on local node server
  4. move useful functions/objects to a utils.js file, so can be explicitly unit tested.
  5. Used to have to mark the outer el with the data-zynii='path' when dynamically drawing a list. Can this be omitted? Will sort work? [This is required and is utilised in the pass1/sync process. Path is used to match current elements to data-children.]
  6. Get rid of requirement to have data-zynii="@@" on children/templates outer element (see above!). Instead, automatically add a hidden _zynii attribute whenever new HTML is created. This should be simpler and means the data-zynii attribute can be used to set innerHTML/value.
  7. Add tests/demo to stress sync'ing dynamic UX generation
  8. Stress test embedded {} in paths within UI.
  9. Does a list within a list work (seems not)? Can the code be rearranged so this works properly? After sync'ing the items in the outer list need to generate some signal to ensure any new inner lists get changed. !! The sync process needs to be called each time new stuff is added. So the html structure is completely sync'ed with the data - before moving onto pass2.
  10. When using template to display element - can't get at the index value and/or object key. WBNI this was available as a special variable @@@?
  11. data-zynii-format is required. This handles situation where data-zynii link was on a different element to actual data (pointed to by data-zynii-format). Could this be scrapped? And format become optional. Only needed when not a string!
  12. BUG: since making changes checkbox clicking seems a bit fussy. Value bounces a bit. This might be a result of changes in the convert/formating routines?
  13. update ebook and demos to reflect changes. Format now optional. persist mechanism docs out-of-date. @@@ in templates.
  14. Test on node
  15. Test on chrome
  16. Run demos on chrome
  17. Test on safari
  18. Run demos on safari
  19. Test on firefox
  20. Run demos on firefox
  21. Test on IE11
  22. Run demos on IE11
  23. Test on IE10
  24. Run demos on IE10
  25. Test on IE9
  26. Run demos on IE9


2nd beta release - mainly bugfixes. Also scrapped LocalPersist/HttpPersist and replaced with single Persist class.

  1. HTML might contain non HTMLElement content. e.g. google charts use SVG elements. bind() process should not walk into these objects!
  2. When evaluating an expression, a function does not have 'this.' set. (When function is an event handler it's different!) Might make sense if this were set to the HTML element to which the function relates.
  3. when setting style doesn't work. style is not a string. Need to intercept and convert string to cssText.
  4. During bind()'ing, expressions get called to set initial value. Might be better simply to makeDirty() the path. So the evaluation happens later.
  5. merge bind()/bindElement() to single method
  6. when moving from one control to another; the new one doesn't get updated? Needs to allow update even when focussed? Or maybe abandon the blur mode
  7. todo list on IE10/IE9: clicking on an item doesn't change it to being done. So completed number isn't correct (or views or items left).
  8. Improve debugger: rename existing scripts to dump.html. Create a debug app using zynii
  9. Improve debugger: Allow JSON/$ values to be edited. Put refresh into a routine so doesn't require a page refresh - add button
  10. Improve debugger: filter out predefined functions
  11. tidy up files. dump/debug should be in zynii. demos should refer. Should be possible to simply copy demos from beta to /demos and have them still work.
  12. test before deploy.
    • x - index.html
    • x - test.html
    • x - all demos
    • chrome
    • safari
    • firefox
    • IE11
    • IE10
    • IE9
  13. update deploy.php. Deploys from /beta folder to /zynii and /demos. Also does DEBUG strip and makes zip.

Other changes:

  1. document <template> replaced with <script ... >
  2. clean up home page, add beta warning, shorten tagline. Add copyright info, licence info, contact info.
  3. Sort out setup for doing future development/beta testing. Will need separate development area for beta versions.
  4. commit and prepare for next version
  5. rename test2 to test
  6. Upgrade web-site to latest version of bootstrap.
  7. Think about structure for documentation/ebook
    1. introduction
    2. quick setup and hello world
    3. downloading, setup, development environment, zyniiPoly
    4. binding HTML to simple data values. acessing model.
    5. binding to arrays/objects. Templates. sorting and filtering
    6. more complex paths - {} substitions
    7. persistence
    8. zynii expressions
      1. calculated values
      2. binding to event attributes
      3. binding to other attributes
    9. case study 1: online shop app.

v0.9.1 [1st beta release]

  1. Allow a template to be declared in HTML and then used in zynii-data-draw instead of defining a draw function. templates would need to be able to substitute the current path into attributes.
    • Add code to binder to handle template tags. Needs to remove template from DOM so doesn't get deleted later.
    • Add function via addFunc() with same name as template. This function returns new HTML based on template
    • Handle paths inside template. Has to handle the fact that a path is being passed in and this can be substituted into the zynii expressions.
  2. Improve parser 2: So expressions can contain []/{} arrays/objects.
  3. Allow a template to be declared in HTML and then used in zynii-data-draw instead of defining a draw function. templates would need to be able to substitute the current path into attributes.
  4. Run through demos and update to use new grammar, require etc.
  5. Update other programs: todo, tware, rss etc.
  6. Update description of grammar in API ref.html
    • document require()
  7. document unit test usage (format for test data and functions).
  8. Copy/move comments/documentation from source code to doc pages
  9. Revise each tutorial to match code in each demo
  10. Finish off API reference html
  11. Finish off intro page and index pages
  12. Add copyright block to each module.
  13. Test cross-browser
    • run all units through jsLint
    • chrome
    • safari
    • firefox
    • ie11 - OK except for error in autosaving local persist?
    • ie10 - ditto and issue with todo list
    • ie9 - ditto and ditto
    • ie8 - don't support yet!
    • ie7 - don't support

    tests for each browser [IE9]

    1. load zynii/index.html
    2. load zynii/test.html
    3. load and test demos:
      1. static
      2. dynamic
      3. calculated
      4. dialog1
      5. dialog2
      6. table1
      7. table2
      8. table3
      9. todo

    Ideally at each failure - update test2.html to fail in the future.

  14. Create minified versions of files.
  15. Add downloads to download page.
  16. Change so home page is cms/index.html


  1. Improve parser 0: write new version of BNF
  2. update lexer to handle new special characters
  3. Improve parser 1: So expressions can contain []/{} arrays/objects.
  4. Improve parser 2: add end token to lexer() - then throw errors if it appears unexpectedly.
  5. Improve parser 3: Add support for multiple statements within an expression?
  6. Improve parser 4: Allow expressions to be a=b statements
  7. parser tests 1: Add []/{} tests
  8. parser tests 2: Add multiple statement tests
  9. parser tests 3: Add a=b statement tests...
  10. Update zyniiParts/zynii.js to handle data-zynii="" statements with multiple lines.

2014 - Jan-May

  • 2013


    1. -
    2. -
    3. -
      • Add insertBefore handling to dynamic drawing of arrays [OK]
      • Add alpha sorted option to properties. [OK]
      • Clean up code [OK]
      • Add testing for internal utility functions join/head/el/$/etc [60%]
      • document in code walk thru [OK]
      • document data-xxx options in instructions [OK]
      • Add paging of output to arrays - only add HTML where index between first & last. [OK]
    4. HALF TERM

    6. Add function to set internal model from JSON [OK]
      • Ideally should merge incoming JSON with existing
      • Convert incoming JSON to flat table [path => value]
      • Use merge algorithm (see nixUpgrade?) to change values (old/current are internal copy, new is from supplied JSON).
      • Possibly handle conflicts
      • [88%]
      • Create web-site[OK]
      • Write documentation[******----64%]
        • API Reference[********--80%]
        • Getting started
        • Tutorial 1 [OK]
        • Tutorial 2 [OK]
        • Tutorial 3
        • Tutorial 4 [OK]
        • Tutorial 5 [OK]
        • Tutorial 6 [OK]
        • Tutorial 7
      • Write 7 demos [OK]
      • [80%]
      • Add diagrams to internal documentation.
      • Extend expressions to handle embedded {}. Inside {} should be a path. This is looked up and inserted into the expression in it's place. This applies to expressions in functions/filters etc.
      • Extend paths to handle embedded {}. Inside {} should be a path. This is looked up and inserted into the path expression in it's place. This applies to paths but also applies to functions/filters etc.
      • Implement multiple filter functions
      • make paging a kind of filter
      • [80%]
      • Add Calculated fields option to HTML binding [33%]
        • look to make sort() a separate callable function (uses data-zynii-sort/reverse)
        • look to make filter() a callable function extending el.zynii
        • Re-arrange tutorials and add one for doing calc.
        • Add data-zynii-calc handling
        • save dependent params with entries in model somehow
        • Call calc function as required
      • Add lookup values for combo boxes [OK]
      • Work out load/store to localStorage [OK]
      • Work out load/store via XMLHttpRequest to server [OK]

      • insert parser code into zynii.js
      • convert zynii to use parser.
      • check works with current test/examples
      • Add example that allows master/slave link in data to update automatically
      • Add code to support some interactive debugging. Might want inner model to return a list of data/bindings/subs. Then let external debug code call this code. Ironically debug code should not use zynii itself!!!!