Skip to content

Instantly share code, notes, and snippets.

@mitechie
Forked from lsmith/gist:1356355
Created December 14, 2011 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mitechie/1476757 to your computer and use it in GitHub Desktop.
Save mitechie/1476757 to your computer and use it in GitHub Desktop.

DataTable design overview

These are my early thoughts on how to structure DataTable in 3.5.0. Feedback is welcome in the comments. Test

Instantiable classes out of the box

new Y.DataTable({...});
new Y.DataTable.Base({...});

Class generation

Y.DataTable.Base = Y.Base.create('datatable', Y.Widget, [Y.DataTable.Core]);
Y.DataTable = Y.mix(
    Y.Base.create('datatable', Y.DataTable.Base, []),
    Y.DataTable, true);

Class extensions CAN (if non-invasive by default)

Y.Base.mix(Y.DataTable, [ Y.DataTable.Sortable ]);

Primary configuration

new Y.DataTable({
    data: [{ ... }, { ... }, ... ]
    data: modelList
    data: {
        source: url, function, xml
        type: 'json'
        schema: { ... }        
    }

    columns: (optional) [ key, key, { key: key, config: stuff, ... }, ... ]

    recordType: (optional) ModelClass

    headerView: (optional) ViewClass
    bodyView: (optional) ViewClass
    footerView: (optional) ViewClass

    summary: (optional) 'string'
    caption: (optional) 'string'
});

Instance structure

instance
    .data = modelListInstance

    .head = viewInstance
    .body = viewInstance
    .foot = viewInstance

Component classes

  • Y.DataTable.Core

    Everything added to Y.Widget to make DataTable.Base

  • Y.DataTable.HeaderView

  • Y.DataTable.BodyView

  • Y.DataTable.FooterView

    Used by DataTable(.Base) to render the table contents.

    Referenced via configuration, not composition.

  • Y.DataTable.Source

    Optional class extension.

    Adds support data config to generate ML with DataSource load.

  • Y.DataTable.Scrollable

    Optional class extension.

    Adds support for scrolling table. May be used to create a third instantiable class.

  • Y.DataTable.ScrollingBodyView

    Used in place of DataTable.BodyView to render the scrolling table. May not be necessary?

  • Y.DataTable.Sortable

    Adds support for sorting headers and sortable config.

Render lifecycle

instance.render(...)

  1. build <table> (markup only or off DOM node?)
  2. instantiate header, body, footer views passing
    1. the DT instance
    2. the created table?
    3. the data ModelList?
  3. call each view's render()

Logic for reacting to user input is moved to the View classes

Concern: string based rendering would have viewX.render() return a string or populate a property, but it has requirements of the DT renderer

Load lifecycle

instance.load(...)

Pass through to this.data.load(...). Let the ModelList be responsible for data interaction.

Default Model generation

  • No ModelList is provided in data configuration AND
  • No recordType is provided in configuration
  1. Use the first item in the data array to build ATTRS and Y.Base.create(...)
  2. If data is empty, use columns?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment