===== Table ===== The table class can render a table like used in the folder contents view. It is abstracted into a seperate class for reuse with other views like the review list. A table can be parameterized at creation time. >>> from plone.app.content.browser.tableview import Table >>> view_url = 'http://plone/view' >>> base_url = 'http://plone' >>> table = Table(request={}, base_url=base_url, view_url=view_url, ... items=[], show_sort_column=False, buttons=[]) The most important argument is items. This must provide a list of dictionaries because the table will add more information to them for rendering. Batching and selecting ---------------------- One of the table's main virtues is that it batches. A template can use the `batch` attribute for accessing the current batch. >>> items = [{'id': i} for i in range(100)] >>> table = Table({}, base_url, view_url, items=items) >>> from plone.batching.interfaces import IBatch >>> IBatch.providedBy(table.batch) True The table automatically adds keys for making layout easier. One of these is indication wheter an item is `checked`. >>> list(table.batch)[0]['checked'] Wheter or not an item is checked depends on request variables. If either the whole batch or the current screen is selected the item we be marked as checked. Below we will demonstrate this by selecting the items on screen. >>> table = Table({'select': 'screen'}, base_url, view_url, items=items) >>> list(table.batch)[0]['checked'] 'checked' Another is the `table_row_class`. The table will append `selected` to it if it already exists, otherwise it will create it. >>> items = [{'id': i} for i in range(100)] >>> table = Table({}, base_url, view_url, items=items) >>> list(table.batch)[0]['table_row_class'] '' If the row is `checked` this will also be reflected in the row class. >>> table = Table({'select': 'screen'}, base_url, view_url, items=items) >>> list(table.batch)[0]['table_row_class'] ' selected' The table will indicate in which selection mode it is in. You can use two interlinked variables for this. The `selectcurrentbatch` attribute will be true in case the current screen is selected or the whole batch is selected. >>> table = Table({}, base_url, view_url, items=items) >>> table.selectcurrentbatch False >>> table = Table({'select': 'screen'}, base_url, view_url, items=items) >>> table.selectcurrentbatch True >>> table = Table({'select': 'all'}, base_url, view_url, items=items) >>> table.selectcurrentbatch True You can also check specifically if the whole batch has been selected. >>> table = Table({}, base_url, view_url, items=items) >>> table.selectall False >>> table = Table({'select': 'all'}, base_url, view_url, items=items) >>> table.selectall True When you select all items on the screen and there are no further pages it will set both the whole `selectcurrentbatch` and `selectall` properties. >>> small_numnber_of_items = [{'id': i} for i in range(3)] >>> table = Table({'select': 'screen'}, base_url, view_url, items=small_numnber_of_items) >>> table.selectcurrentbatch True >>> table.selectall True Sort column ----------- Some tables may be made sortable by indicating so at table creation time. This will toggle a boolean which will be read by the rendering template. By default sorting is turned off. >>> table = Table({}, base_url, view_url, items=items) >>> table.show_sort_column False >>> table = Table({}, base_url, view_url, items=items, show_sort_column=True) >>> table.show_sort_column True Selection urls -------------- The table provides the template with urls for selecting or deselecting items in the batch. These urls are based on the url passed in at creation time. >>> table.selectnone_url 'http://plone/view?pagenumber=1&pagesize=20' You can see how it automatically adds the current page to the url. >>> table.selectscreen_url 'http://plone/view?pagenumber=1&pagesize=20&select=screen' The same goes for selecting the screen and the whole batch. >>> table.selectall_url 'http://plone/view?pagenumber=1&pagesize=20&select=all' A template may want to display only one of these urls at the same time. Therefore the table has a boolean property to query wheter or not to show the select all option. The display of this depends on wheter the whole batch is selected (don't show) or the screen has not been selected (don't show then). >>> table = Table({}, base_url, view_url, items=items) >>> table.show_select_all_items False >>> table = Table({'select': 'screen'}, base_url, view_url, items=items) >>> table.show_select_all_items True >>> table = Table({'select': 'all'}, base_url, view_url, items=items) >>> table.show_select_all_items False