@diosmosis opened this Issue on July 8th 2013 Member

This ticket includes any refactoring to be done to ViewDataTable & Piwik_Visualization and will include a new treemap visualization.

The goal is to move all visualizations and Viewdatatable to a new CoreVisualizations plugin.

This ticket is a rather large refactoring and team work among Piwik team members!

@tsteur commented on October 4th 2013 Member

Attachment:
visualization.patch

@tsteur commented on October 4th 2013 Member

Attachment:
visTreemap.patch

@anonymous-matomo-user commented on July 9th 2013

In b5ed458b466e37b4d70ee65cdeebc0d38c7dc9be: Refs #4041, cleaned up ViewDataTable, related classes, and related templates:

  • Remove uniqIdTable, chartDivId and related code as important element IDs are determined in datatable_manager.js now.
  • Clarify _dataTable twig template + related css.
  • Also added visiblity to Piwik_DataTable_Renderer_Php::renderException.
@anonymous-matomo-user commented on July 11th 2013

In 4f0e655a7c9fade57851bb539db285c8f88ae35c: Refs #4041, allow subtable template to be used if idSubtable is in request so Actions controller doesn't have to call setTemplate. Also did some mild refactoring for Piwik_ViewDataTable_HtmlTable::setRecursiveLoadDataTableIfSearchingForPattern.

@anonymous-matomo-user commented on July 11th 2013

In a7879ae599bd57ff3f3a305ac54f785880b6a175: Refs #4041, removed Piwik_ViewDataTable_HtmlTable::recursiveDataTableLoad.

@anonymous-matomo-user commented on July 12th 2013

In 22d767681a824087e3a228c3e3ba1f842c6272b8: Refs #4041, removed extra ViewDataTable classes used by Goals Controller.

@anonymous-matomo-user commented on July 12th 2013

In c792ca8e35f1d104bbd16cdcc9f93708f31d9f6c: Refs #4041, make getVisitorLog.twig more like _dataTable.twig.

@anonymous-matomo-user commented on July 12th 2013

In 98e6c9b8874ffc8c18570ed4cc062cc5f0eb80c0: Refs #4041, fix widgetize datatable width regression.

@anonymous-matomo-user commented on July 12th 2013

In 01057779046dd67923bd34d123628ab60ed263bc: Refs #4040, #4041, move all ViewDataTable properties to the viewProperties array and allow these properties to be specified through new display metadata. Converted the Actions, Goals, UserSettings and VisitTime controllers.

Notes:

  • Includes refactoring of ExcludeLowPopulation filter.
@anonymous-matomo-user commented on July 13th 2013

In 349f28088cac598b3c9a8e5686fefbd9aaef8cc4: Refs #4041, fix bug in displaying DBStats reports by redefining how columns_to_display view property defaults and allow unique visitors to be displayed on reports that have it, outside of period=day.

@anonymous-matomo-user commented on July 19th 2013

In 0713062313967d940b8f5c34cb21d515c6b016b4: Refs #4041, move Piwik_ViewDataTable_GenerateGraphData logic to new JqplotDataGenerator class that does not derive from ViewDataTable and remove recursive API request used to get graph data.

@anonymous-matomo-user commented on July 27th 2013

In 93b301dad6b09ec259e574d41b7d508b6b71f0b6: Refs #4041, modify tag cloud ViewDataTable to use _dataTable.twig w/ Visualization_Cloud as visualization..

@anonymous-matomo-user commented on July 28th 2013

In 26051fccef9ee7f8497069fc508da3d30a29813d: Refs #4041, merge _dataTableGraph.twig with _dataTable.twig (moved unmergable parts to new visualization twig file for Visualization_JqplotGraph).

@anonymous-matomo-user commented on July 30th 2013

In edf2c04f41445fb6f3f5658e887b53a8a49b4e13: Refs #4040, #4041, added ability to access view properties directly, started documenting view properties and modified ExampleUI plugin to set view properties directly.

@anonymous-matomo-user commented on July 30th 2013

In 0ea1a94655bb441b832b118904b65bdfd72766fc: Refs #4040, #4041 convert RowEvolution popup rendering code to set view properties directly.

@anonymous-matomo-user commented on July 30th 2013

In 13f657ccfa6b58864291a173a0849d7169b031b2: Refs #4040, #4041, fix sparklines regression caused by datatable css refactoring and clean up the getLastUnitGraphAcrossPlugins function (modified to set properties directly).

@anonymous-matomo-user commented on August 1st 2013

In 0f61caac0d97e28ac7653078c6d1b7bf09cd4bab: Refs #4040, #4041 removed rest of viewdatatable set/get/enable/disable property functions, did the same for all other ViewDataTable classes, moved most of ViewDataTable/HtmlTable logic to visualization instead of main class and re-add links for UI integration tests.

@anonymous-matomo-user commented on August 1st 2013

In 883c3228e03e4e93e5338fa1f3ad18a6aaaa65ea: Refs #4040, #4041, move more logic out of HtmlTable ViewDataTable class.

@anonymous-matomo-user commented on August 3rd 2013

In 1a9898be75d875132ff09e94c08b6d8114767aee: Refs #4040, #4041, fix regression in default sort column of goals table.

@anonymous-matomo-user commented on August 3rd 2013

In 7519e6734ae0ccc740d9ff52c6835bdf7d119f6d: Refs #4040, #4041, move AllColumns ViewDataTable & Goals ViewDataTable logic to HtmlTable visualization class & remove those classes. Revised the way visualizations default/override view properties. Cleaned up the ViewDataTable class a bit. Added base type for datatable visualizations.

@anonymous-matomo-user commented on August 3rd 2013

In b80848961f49c75249f2992d17e14fc2c5012071: Refs #4040, #4041, remove is_multi_evolution javascript parameter as it is no longer necessary due to earlier row evolution refactoring.

@anonymous-matomo-user commented on August 3rd 2013

In cc92fac0339044aef75c8395e394f3a1a79aa646: Refs #4040, #4041, remove GenerateGraphHtml & descended ViewDataTables and replace w/ new visualizations for jqplot.

@anonymous-matomo-user commented on August 3rd 2013

In ac3a25c3784dfc099c93b53848cf00302766ce7e: Refs #4040, #4041, forgot to remove GenerateGraphHTML file.

@anonymous-matomo-user commented on August 6th 2013

In cf8d0a51591e39ecf8aa8f4c09b5672ec2d312cd: Refs #4041, #4040, moved viewdatatable cloud logic to cloud visualization. Removed cloud viewdatatable.

@anonymous-matomo-user commented on August 6th 2013

In 2615404eab2e96048583caccf86248af2dd90d9b: Refs #4040, #4041, move visualization only view properties to separate visualizations, changed JavaScript properties to 'client side parameters' and 'overridable properties' to 'client side properties', changed keep_summary_row from a JavaScript property to a client side property, allowed visualization properties to be inherited, fixed system that allowed visualizations to set custom defaults for property values, modified behavior of datatable_css_class viewdatatable property, allow view properties to be customized in metadata based on the visualization used, and tweaks to UI Integration tests.

@anonymous-matomo-user commented on August 6th 2013

In 9b5a42a62395607556893085701a8d385c464697: Refs #4040, #4041, change the way jqplot.js checks for viewdatatble types, changed relatedReports view property name to related_reports and fixed spelling of row_picker_mach_rows_by.

@anonymous-matomo-user commented on August 6th 2013

In e898bc2998e672f76defd8b7a996865b759d1aa4: Refs #4040, #4041 add initial code for making datatable visualizations an extensibility point.

@anonymous-matomo-user commented on August 6th 2013

In 9e19f249150a142b5fe97e96175beb847323862c: Refs #4041, #4040 add new CoreVisualizations plugin and move HtmlTable, Cloud & JqplotGraph visualizations to it and improve UIIntegration test debug output.

@anonymous-matomo-user commented on August 6th 2013

In be35dc408c539892d201bcda65e03d099f529128: Refs #4040, #4041, removed ViewDataTable::init & moved default property values for core properties to Properties class.

@anonymous-matomo-user commented on August 6th 2013

In 7daadd45d61228131a805569e145f3bd4228b604: Refs #4040, #4041 added new plugin ExtraVisualizations with dummy visualization and made it possible for non-core visualizations to appear in DataTable UI footer.

@anonymous-matomo-user commented on August 6th 2013

In 6f8b40d75e202b4e42682be4538747bcfc31d8a2: Refs #4040, #4041, added documentation to DataTableVisualization class.

@anonymous-matomo-user commented on August 6th 2013

In 27dcd700926b3a7011b44fce21be2814f5032a29: Refs #4040, #4041, removed two-phase rendering for ViewDataTable.

@anonymous-matomo-user commented on August 6th 2013

In 5ff42da365f64fed1cb60cde94ba12d38f60dd4e: Refs #4041, added parameter to Archive::getDataTableExpanded so entire tree will not be created if not necessary.

@mattab commented on August 7th 2013 Member

In 07c430fba0014336fce6071dd8a4c1fb9c65ef25: Always enable CoreVisualizations plugin Refs #4041

@anonymous-matomo-user commented on August 8th 2013

In 1d09b2cbe273035c92b15f9e4b96aa88419cda81: Refs #4041, fixing regressions & bugs in visualization refactor.

@mattab commented on August 9th 2013 Member

It is very welcome to see these simplifications in the Visualizations/ViewDatatable code!

Looking forward to seeing final result & new Treemap visualization plugin

@mattab commented on August 9th 2013 Member

In 07dab25d926001fbeb0f15958a1cf03e3dd22f20: Refs #4041 Deleting ExtraVisualizations plugin (to be renamed to Treemap)

@anonymous-matomo-user commented on August 9th 2013

In 2549406e1212ad57b05b3a01ac846e11c25184ee: Refs #4041, fix regression when evolution graph tries to display empty graph.

@anonymous-matomo-user commented on August 10th 2013

In eafff67e029a84e5f0de8a9b9913093b6be634b3: Refs #4041, fix regression in datatable footer width.

@diosmosis commented on August 10th 2013 Member

Treemap will go in a new ticket, so calling this done.

@anonymous-matomo-user commented on August 12th 2013

In 771d42f8d2ba548bc2a43835f66ec84632729adc: Refs #4041, fix regression that caused jqplot tooltips not to show.

@anonymous-matomo-user commented on August 14th 2013

In b33ce4ca0942167e058d02006a94ababbb949bac: Refs #4041, add default getDefaultPropertyValues() call for DataTableVisualizations, move overrideViewProperties() call in ViewDataTable to right before data is loaded from API, fix @category/@package for files moved into CoreVisualizations.

@anonymous-matomo-user commented on August 14th 2013

In c732114df3576faf297e38a7bf04ff9092947905: Refs #4041, removed Visualizations\Chart* classes and moved Visualization\Chart to CoreVisualizations plugin and removed graph_width/graph_height visualization properties in favor of CSS solution.

@anonymous-matomo-user commented on August 14th 2013

In a22af728e4449c5e5b0a4fd22d1acd4929438a10: Refs #4041, added Graph base visualization to hold visualization properties that are not specific to jqplot graphs.

@anonymous-matomo-user commented on August 17th 2013

In 349b2ebd28be7fcec518aca5ebfb5a284f7d7f99: Refs #4041, remove setActiveIcon function from dataTable.js and refactor way footer icons are rendered in _dataTable.twig.

@anonymous-matomo-user commented on August 17th 2013

In c0fe3f45322a07da1259d91f9185c49073b708a4: Refs #4041, fix regression in last commit.

@anonymous-matomo-user commented on August 17th 2013

In 35e86eb9ccccd1ec669379a049e3a2c02cb6df66: Refs #4041, fix another regression in previous commit.

@anonymous-matomo-user commented on August 17th 2013

In f75363e31c13c3992bd2dde18ad296d4560b6352: Refs #4041, fix another regression in previous commit.

@anonymous-matomo-user commented on August 17th 2013

In 96bd72adf6b6794dd6c0ea8e73612a84605434df: Refs #4041, fix yet another regression in previous commit.

@anonymous-matomo-user commented on August 17th 2013

In 5254d5edfd37b1f139ddb34df205592c66282703: Refs #4041, fix yet another regression in previous commit.

@anonymous-matomo-user commented on August 19th 2013

In fc8ae5f1e6813e59d7c75558625b26f19309bc7e: Refs #4041, change filter_limit, filter_sort_column and filter_sort_order to be client side parameters of HtmlTable visualization only so its no longer necessary to disable queued/generic filters for graphs.

@anonymous-matomo-user commented on August 20th 2013

In ad685e9f1cbe75bff25f06d6da2dd2263c82e722: Refs #4041, mild refactoring to ViewDataTable, handle max_graph_elements property w/ filter_truncate instead of directly executing filter and fix bug in JqplotGraph's constructor.

@anonymous-matomo-user commented on August 22nd 2013

In 1fe353be64a31cbd2b36a3bc40e65ce0e0a79e42: Refs #4041, remove override of filter_offset in Graph DataTable visualization.

@anonymous-matomo-user commented on August 22nd 2013

In 9e56138f792d95a7b822e23492e8a340eebe7423: Refs #4041, allow all view/visualization properties to be set via query parameter, remove unecessary client side properties from ViewDataTable, move HtmlTable specific client side parameters to HtmlTable, remove code that looks for generic filter query parameters when setting client side parameters, make sure client side parameters are set if they're not false (ie, 0) instead of if not empty and add filter_offset as view property.

@anonymous-matomo-user commented on August 26th 2013

In caef9f915cf73365a28960aba3e4df97f47391b5: Refs #4041, #4077, started refactoring of series picker JavaScript so it can be used by more than just jqPlot graphs.

Notes:

  • Added new 'after_data_loaded_functions' view property that executes callbacks after data is loaded. Different from filters since it will be only executed once per data table.
  • Moved row picker view properties to Graph datatable visualization.
  • Refactored jqplot data generation so selectable columns & rows are dealt w/ in Graph datatable visualization instead of a JqplotDataGenerator instance.
  • Rewrote series picker to use dataTable client side properties instead of data generated by JqplotDataGenerator.
  • Fixed jqplock typo.
@anonymous-matomo-user commented on August 26th 2013

In fcb589270edc4ebfb56e6b778e486cc38bb2e033: Refs #4077, #4041, separated jqplot specific code from generic series picker code and cleaned up series picker code a bit.

@anonymous-matomo-user commented on August 27th 2013

In f1193c901eadee1e910af3e28e9a28e9397b2aae: Refs #4041, #4077, document SeriesPicker JS class.

@anonymous-matomo-user commented on August 27th 2013

In ed0f3d20d7ff4dc8ef4057cd4c7e608314ce3f69: Refs #4100, #4041, #4077, add minimal UI module inclusion/creation function and use for SeriesPicker. Also includes a documentation correction for SeriesPicker.

@anonymous-matomo-user commented on August 27th 2013

In 6aa3a44dd6d15aa2b4b455565fa84612d10e7dc8: Refs #4100, #4041, #4077, fix docs in last commit.

@anonymous-matomo-user commented on August 27th 2013

In c4b42a103c1551d6d02bb5e0f1d8ad6f47de9ab4: Refs #4041, fix bug in defaulting selectable columns.

@anonymous-matomo-user commented on August 27th 2013

In 6cb518d2ce294e4ba3febd376f997729e33432b9: Refs #4041, document some functions in Graph visualization class.

@anonymous-matomo-user commented on August 31st 2013

In 53f3d240d4415f7186c3f02acd0f1747cc684bf2: Refs #4041, refactored jqplot datatable visualizations (mainly the evolution graph),

Notes:

  • Fix bugs in DataTable class where getRowFromLabel would fail if summary row label is returned.
  • Fix regression caused by datatable visualization refactor (add_total_row property was effectively ignored).
  • Added x_axis_step_size property to jqplot graph.
@anonymous-matomo-user commented on August 31st 2013

In b674102c0cc6ea3435cf0525f6ead0b2aaef94f7: Refs #4041, small tweak to last commit.

@anonymous-matomo-user commented on September 1st 2013

In 42623a05f26bd153d65299ecfda0ee62c9d9d042: Refs #4041, refactored jqplot.js file by removing JQPlot class and creating JqplotGraph datatable class, and did more refactoring to jqplot data generating mechanism.

Notes:

  • Removed jqplot specific code from datatable_manager.js and moved to new JqplotGraph class.
  • Moved tooltip percentage calculating code to client.
@anonymous-matomo-user commented on September 1st 2013

In 7c3d5347a52e14eabb63b99b2bcb4b526ae48606: Refs #4041, split JqplotGraph datatable class into three: JqplotBarGraph, JqplotPieGraph & JqplotEvolutionGraph.

@anonymous-matomo-user commented on September 3rd 2013

In 09784e569760cd28a9488f083583d0016265e535: Refs #4041, add last visits graph to visitor profile (commented out) and highlight visit whose details are currently displayed.

@anonymous-matomo-user commented on September 5th 2013

In 3c11c23f3e8dc1c088a07b941d719229d6e58197: Refs #4041, moved & renamed actionDataTable JavaScript class to file in the Actions plugin.

@anonymous-matomo-user commented on September 14th 2013

In b1205a5db1a884e2e02a8d6845cd2566d05cc355: Refs #4041, force DataTable visualizations to specify which properties should be overridable and move some view properties to different visualizations.

@anonymous-matomo-user commented on September 14th 2013

In e36142a6a9a2e0f0b44019b546641fbd4c84ceb5: Refs #4041, default to HtmlTable if visualization ID is invalid and filled out a function doc.

@anonymous-matomo-user commented on September 15th 2013

In 6452d5989a98e9312f85b858654ebc2ed727b9c7: Refs #4041, Fix regression.

@anonymous-matomo-user commented on September 16th 2013

In d5d6c9e0a9b7c94ae7e5df3404e8da53608049e9: Refs #4041, use require() and UIControl in all DataTable JS classes.

@anonymous-matomo-user commented on September 16th 2013

In 83261e010ae9f5d2f9d39a7589eecd0b40b1b2bf: Refs #4041, #3317, #4077, allow different visualizations to specify their own loading logic (when the appropriate footer icon is clicked) and fix a couple UI bugs in treemap.

@anonymous-matomo-user commented on September 17th 2013

In 4bb2de9bac0a6d0cd2fb196725f072da9856d39f: Refs #4041, remove subtable_template property and _dataTableActions_subDataTable.twig file.

@anonymous-matomo-user commented on September 18th 2013

In c0768bf32a5bdccb8b50ac67c922e8c57b678dc9: Refs #4041, #3317, allow visualization ID to be whole class name, allow footer icons to be customized per report/visualization, made visitor log a new visualization and removed the datatable_template display property.

@anonymous-matomo-user commented on September 18th 2013

In e4c5269efa8bdd9976b87327f067b09b535b032f: Refs #4041, add default value to all visualization property docs.

@anonymous-matomo-user commented on September 19th 2013

In 6b906ed1444d904abc0f39cae0b7da5e5f22c74b: Refs #4041, make all DataTableVisualizations derive from Piwik\View.

@anonymous-matomo-user commented on September 19th 2013

In ce27579ab7ecf014b8327469cc9bda2eec867b23: Refs #4041, fix regression in tag cloud.

@anonymous-matomo-user commented on September 19th 2013

In c9356bb1a564e35e3fcddad27d12854f11c47a04: Refs #4041, rename javascriptVariablesToSet to clientSideParameters and fix regression in visitor log.

@anonymous-matomo-user commented on September 20th 2013

In 2b14ad2cbc4d06ac026bfc3e629877402a1c3bde: Refs #4041, allow datatable HTML to use JS namespace when specifying the client-side datatable type.

@anonymous-matomo-user commented on September 20th 2013

In 4d5d101f8243a10e669885d224dc1b4dcf317c6d: Refs #4041, remove DatatableManager class and replace with UIControl code.

@anonymous-matomo-user commented on September 20th 2013

In 4d7d1262493aacc42af632aed1888e45da1afc7c: Refs #4041, fix bug when switching to normal visualizations.

@anonymous-matomo-user commented on September 21st 2013

In ed569f20bbf74dd40ec33f9204bbbfd33358eba4: Refs #4041, #4077, make sure treemap subtable loading determines row limit dynamically, and allow visualizations to apply viewdatatable queued filters on their own time.

@anonymous-matomo-user commented on September 21st 2013

In c2061d4fd17875fba690b404c38bee30cde2fd31: Refs #4077, #4041, resize treemap on widget resize and fix regression in jqplot refactoring (export as image didn't work).

@anonymous-matomo-user commented on September 24th 2013

In b7bfa2b6367371fe0675d1c0d1fd673e6f8294c7: Refs #4041, fix bug where columns query parameter was not correctly overriding default value of columns_to_display display property.

@anonymous-matomo-user commented on October 2nd 2013

In 957b80e7f67efa9901760afe96340b0648f7f837: Refs #4041, fixing DBStats regression.

@tsteur commented on October 4th 2013 Member

it would be cool to set the ViewDataTable properties within the Visualization class ( $this->show_xyz=true) instead of the ViewDataTable ( $view->show_xyz=true). Would be also cool not to do everything in Visualization constructor but having different "hooks/methods" like " init", " beforeLoadDataTable", " afterLoadDataTable", " beforeRender". This way it is a bit clearer what is going on. I did not get it working but I'll attach two patches though for better understanding.

Would be cool if a developer could create a new visualization by just defining the template name and creating the template itself. If the developer wants to change some ViewDataTable properties (for instance disable search), he would just set theshow_search property to false within the init method. If he also wants to apply some filter or whatever, he could implement the before/afterLoadDataTable methods.

@diosmosis commented on October 4th 2013 Member

Some of these ideas are opposed to some fundamental ideas I used when refactoring, so I will just explain the relevant reasoning I used in my design. Matt will have to figure out what to do w/ the info.

Replying to tsteur:

it would be cool to set the ViewDataTable properties within the Visualization class ( $this->show_xyz=true) instead of the ViewDataTable ( $view->show_xyz=true).

Visualizations are not ViewDataTables in that they do not have, remove or fundamentally alter the footer. The idea here was that the footer controls would be constant in most visualizations, so the visualization concept was moved out of ViewDataTable. It could be possible to change the code to $this->, but that would be semantically incorrect.

Would be also cool not to do everything in Visualization constructor but having different "hooks/methods" like " init", " beforeLoadDataTable", " afterLoadDataTable", " beforeRender". This way it is a bit clearer what is going on. I did not get it working but I'll attach two patches though for better understanding.

This is understandable, the dataTable loading/rendering process is complicated and some things have to be done after some things and before other things. I didn't get that far into figuring out where hooks were necessary. I did purposefully avoid using methods as hooks. I made the choice to use 'properties' over methods since properties can be more easily (and clearly) used and defaulted, take up less code space and are conceptually more appropriate for views. Instead of methods like afterDataTableLoaded I added the after_data_loaded_functions property.

I also made an effort to avoid functions, so that there would be less for users to have to understand when creating visualizations. If the only thing you need to write is a constructor, that makes things a lot easier than having to know exactly when your code needs to execute. "When your visualization is created, it configures & overrides the ViewDataTable" is easier to deal w/ then "When your visualization has to do things before the datatable is loaded, write code here. When your visualization has to do things after the datatable is loaded, write code here. When your ... etc.".

As it stands, I would rather remove the need for after_data_loaded_functions/afterDataTableLoaded then add several hooks.

Would be cool if a developer could create a new visualization by just defining the template name and creating the template itself. If the developer wants to change some ViewDataTable properties (for instance disable search), he would just set theshow_search property to false within the init method. If he also wants to apply some filter or whatever, he could implement the before/afterLoadDataTable methods.

I don't understand what you mean. How would you specify the viewDataTableId & footer icon for a visualization w/ just a template? Or would the class still be there? If the class is there, then that's the same minimum amount of code needed currently.

Btw, is there a set of use cases you need some/all of these changes for?

@diosmosis commented on October 4th 2013 Member

Replying to tsteur:

it would be cool to set the ViewDataTable properties within the Visualization class ( $this->show_xyz=true) instead of the ViewDataTable ( $view->show_xyz=true).

I thought about this & your code a bit more, and I think your idea of using fields instead of CONSTs is a good one. I think there could be some changes though:

  • The fields should be public since they're just properties.
  • Instead of using @property on the class, these should be on the properties themselves, eg:
/**
 * ...
 * <a class='mention' href='https://github.com/property'>@property</a>
 */
public $show_evolution_values = false;

This way the code would know exactly which fields are properties.

  • You could also use annotations to determine if properties are client side properties/parameters:
/**
 * ...
 * <a class='mention' href='https://github.com/property'>@property</a>
 * <a class='mention' href='https://github.com/clientSideProperty'>@clientSideProperty</a>
 */
public $show_evolution_values = false;
  • The logic that deals w/ properties + passing them on to JavaScript could be implemented either in View itself or in a separate class that derived from View. This is part of an idea I had in #4116. I would've put the logic into a new class and called it UIControl.
  • Finally, I think that request_parameters_to_modify might be the only property that has to be set before the datatable is obtained. If that information were to be supplied differently (as in, not through a property), perhaps hooks would be unnecessary.
This Issue was closed on October 21st 2013
Powered by GitHub Issue Mirror