0
0
mirror of https://github.com/wagtail/wagtail.git synced 2024-12-01 11:41:20 +01:00

Add caption field to TableBlock

* Create caption field added to table block widget

Caption allows for users users with screen readers to be
able to understand the contents of a table.

* Fixed bugs in javascript and typos

* Updated documentation and change log

* Fixed table caption bug and requested pr edits

* Fixed table caption bug and request pr edits

* Removed changes in changelog.txt

* Fixed bug and requested PR edits
This commit is contained in:
rjpruitt16 2019-08-14 15:17:25 -05:00 committed by Coen van der Kamp
parent 0ee07dddff
commit f7ff6d39c4
7 changed files with 58 additions and 3 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

@ -2,7 +2,7 @@
TableBlock
==========
The TableBlock module provides an HTML table block type for StreamField. This module uses `handsontable 6.2.2 <https://handsontable.com/>`_ to provide users with the ability to create and edit HTML tables in Wagtail.
The TableBlock module provides an HTML table block type for StreamField. This module uses `handsontable 6.2.2 <https://handsontable.com/>`_ to provide users with the ability to create and edit HTML tables in Wagtail. Table blocks provides a caption field for accessibility.
.. image:: ../../_static/images/screen40_table_block.png
@ -83,7 +83,7 @@ Every key in the ``table_options`` dictionary maps to a `handsontable <https://h
* `startCols <https://handsontable.com/docs/6.2.2/Options.html#startCols>`_ - The default number of columns for new tables.
* `colHeaders <https://handsontable.com/docs/6.2.2/Options.html#colHeaders>`_ - Can be set to ``True`` or ``False``. This setting designates if new tables should be created with column headers. **Note:** this only sets the behaviour for newly created tables. Page editors can override this by checking the the “Column header” checkbox in the table editor in the Wagtail admin.
* `rowHeaders <https://handsontable.com/docs/6.2.2/Options.html#rowHeaders>`_ - Operates the same as ``colHeaders`` to designate if new tables should be created with the first column as a row header. Just like ``colHeaders`` this option can be overridden by the page editor in the Wagtail admin.
* `contextMenu <https://handsontable.com/docs/6.2.2/Options.html#contextMenu>`_ - Enables or disables the Handsontable right-click menu. By default this is set to ``True``. Alternatively you can provide a list or a dictionary with [specific options](https://handsontable.com/docs/6.2.2/demo-context-menu.html#page-specific).
* `contextMenu <https://handsontable.com/docs/6.2.2/Options.html#contextMenu>`_ - Enables or disables the Handsontable right-click menu. By default this is set to ``True``. Alternatively you can provide a list or a dictionary with [specific options](https://handsontable.com/docs/6.2.2/demo-context-menu.html#page-specific).
* `editor <https://handsontable.com/docs/6.2.2/Options.html#editor>`_ - Defines the editor used for table cells. The default setting is text.
* `stretchH <https://handsontable.com/docs/6.2.2/Options.html#stretchH>`_ - Sets the default horizontal resizing of tables. Options include, 'none', 'last', and 'all'. By default TableBlock uses 'all' for the even resizing of columns.
* `height <https://handsontable.com/docs/6.2.2/Options.html#height>`_ - The default height of the grid. By default TableBlock sets the height to ``108`` for the optimal appearance of new tables in the editor. This is optimized for tables with ``startRows`` set to ``3``. If you change the number of ``startRows`` in the configuration, you might need to change the ``height`` setting to improve the default appearance in the editor.

View File

@ -43,7 +43,12 @@ class TableInput(forms.HiddenInput):
def get_context(self, name, value, attrs=None):
context = super().get_context(name, value, attrs)
table_caption = ''
if value and value != 'null':
table_caption = json.loads(value).get('table_caption', '')
context['widget']['table_options_json'] = json.dumps(self.table_options)
context['widget']['table_caption'] = table_caption
return context
@ -59,6 +64,7 @@ class TableBlock(FieldBlock):
"""
self.table_options = self.get_table_options(table_options=table_options)
self.field_options = {'required': required, 'help_text': help_text}
super().__init__(**kwargs)
@cached_property
@ -97,6 +103,7 @@ class TableBlock(FieldBlock):
'table_header': table_header,
'first_col_is_header': first_col_is_header,
'html_renderer': self.is_html_renderer(),
'table_caption': value.get('table_caption'),
'data': value['data'][1:] if table_header else value.get('data', [])
})

View File

@ -4,9 +4,11 @@ function initTable(id, tableOptions) {
var containerId = id + '-handsontable-container';
var tableHeaderCheckboxId = id + '-handsontable-header';
var colHeaderCheckboxId = id + '-handsontable-col-header';
var tableCaptionId = id + '-handsontable-col-caption';
var hiddenStreamInput = $('#' + id);
var tableHeaderCheckbox = $('#' + tableHeaderCheckboxId);
var colHeaderCheckbox = $('#' + colHeaderCheckboxId);
var tableCaption = $('#' + tableCaptionId);
var hot;
var defaultOptions;
var finalOptions = {};
@ -18,6 +20,7 @@ function initTable(id, tableOptions) {
var structureEvent;
var dataForForm = null;
var isInitialized = false;
var getWidth = function() {
return $('.widget-table_input').closest('.sequence-member-inner').width();
};
@ -55,6 +58,9 @@ function initTable(id, tableOptions) {
if (dataForForm.hasOwnProperty('first_col_is_header')) {
colHeaderCheckbox.prop('checked', dataForForm.first_col_is_header);
}
if (dataForForm.hasOwnProperty('table_caption')) {
tableCaption.prop('value', dataForForm.table_caption);
}
}
if (!tableOptions.hasOwnProperty('width') || !tableOptions.hasOwnProperty('height')) {
@ -88,7 +94,8 @@ function initTable(id, tableOptions) {
data: hot.getData(),
cell: getCellsClassnames(),
first_row_is_table_header: tableHeaderCheckbox.prop('checked'),
first_col_is_header: colHeaderCheckbox.prop('checked')
first_col_is_header: colHeaderCheckbox.prop('checked'),
table_caption: tableCaption.val()
}));
};
@ -123,6 +130,10 @@ function initTable(id, tableOptions) {
persist();
});
tableCaption.on('change', function() {
persist();
});
defaultOptions = {
afterChange: cellEvent,
afterCreateCol: structureEvent,

View File

@ -1,6 +1,9 @@
{% load table_block_tags %}
<table>
{% if table_caption %}
<caption>{{ table_caption }}</caption>
{% endif %}
{% if table_header %}
<thead>
<tr>

View File

@ -19,6 +19,16 @@
</div>
</div>
<br/>
<div class="field">
<label for="{{ widget.attrs.id }}-handsontable-col-caption">{% trans 'Table caption' %}</label>
<div class="field-content">
<div class="input">
<input type="text" id="{{ widget.attrs.id }}-handsontable-col-caption" name="handsontable-col-caption" value="{{ widget.table_caption }}"/>
</div>
<p class="help">{% trans 'A heading that identifies the overall topic of the table, and is useful for screen reader users' %}</p>
</div>
</div>
<br/>
<div id="{{ widget.attrs.id }}-handsontable-container"></div>
{% include 'django/forms/widgets/hidden.html' %}
<script>initTable("{{ widget.attrs.id|escapejs }}", {{ widget.table_options_json|safe }});</script>

View File

@ -241,6 +241,30 @@ class TestTableBlock(TestCase):
self.assertIn("<div>A fascinating table.</div>", result)
def test_table_block_caption_render(self):
"""
Test a generic render with caption.
"""
value = {'table_caption': 'caption', 'first_row_is_table_header': False,
'first_col_is_header': False,
'data': [['Test 1', 'Test 2', 'Test 3'], [None, None, None],
[None, None, None]]}
block = TableBlock()
result = block.render(value)
expected = """
<table>
<caption>caption</caption>
<tbody>
<tr><td>Test 1</td><td>Test 2</td><td>Test 3</td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td></tr>
</tbody>
</table>
"""
self.assertHTMLEqual(result, expected)
self.assertIn('Test 2', result)
class TestTableBlockForm(WagtailTestUtils, SimpleTestCase):
def setUp(self):