Skip to content

Commit a94051b

Browse files
JavierJimenezIEEricSoroos
authored andcommitted
Add default sort option to DataTables view
* Adds sort field, sort direction * Primarily useful when the data doesn't necessarily come in in a manner that makes sense for presentation
1 parent be1eede commit a94051b

4 files changed

Lines changed: 42 additions & 2 deletions

File tree

‎ckanext/datatablesview/assets/datatablesview.js‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,8 @@ this.ckan.module('datatables_view', function (jQuery) {
323323
const resourceurl = dtprv.data('resource-url')
324324
const defaultview = dtprv.data('default-view')
325325
const responsivemodal = dtprv.data('responsive-modal')
326+
const sortfield = dtprv.data('sort-field')
327+
const sortorder = dtprv.data('sort-order')
326328

327329
// get view mode setting from localstorage (table or list/responsive])
328330
const lastView = getWithExpiry('lastView-' + gresviewId)
@@ -479,6 +481,12 @@ this.ckan.module('datatables_view', function (jQuery) {
479481
})
480482
})
481483

484+
let defaultOrder = [[0, sortorder]]
485+
const sortIndex = dynamicCols.findIndex((e) => e.data === sortfield)
486+
if (sortIndex !== -1) {
487+
defaultOrder = [[sortIndex, sortorder]]
488+
}
489+
482490
// init the datatable
483491
$('#dtprv').on('preInit.dt', function (_event, _settings) {
484492
// show loading indicator when first painting data into the table.
@@ -514,6 +522,7 @@ this.ckan.module('datatables_view', function (jQuery) {
514522
}
515523
},
516524
columns: dynamicCols,
525+
order: defaultOrder,
517526
ajax: {
518527
url: ajaxurl,
519528
type: 'POST',

‎ckanext/datatablesview/plugin.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,7 @@ def info(self) -> dict[str, Any]:
100100
u'date_format': [default(self.date_format)],
101101
u'show_fields': [ignore_missing],
102102
u'filterable': [default(True), boolean_validator],
103+
u'sort_field': [ignore_missing],
104+
u'sort_order': [default(u'asc'), ignore_missing],
103105
}
104106
}

‎ckanext/datatablesview/templates/datatables/datatables_form.html‎

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,33 @@
2525
_('Moment.js date format to use for displaying dates (see <a href="https://devhints.io/moment#formatting-1" target="_blank">Moment.js cheatsheet</a>). If <b>NONE</b>, the raw timestamp value will be shown.', classes=['info-help-tight'])) }}
2626
{% endcall %}
2727

28+
{% set fields = h.datastore_dictionary(resource.id) or [] %}
29+
{% set sort_field_options = [{'value': '', 'text': _('None (use _id)')}] %}
30+
{% for f in fields %}
31+
{% set _ = sort_field_options.append({'value': f.id, 'text': f.id}) %}
32+
{% endfor %}
33+
{% call form.select(
34+
'sort_field',
35+
id='field-sort_field',
36+
label=_('Default sort field'),
37+
options=sort_field_options,
38+
selected=data.sort_field or '',
39+
) %}
40+
{{ form.info(
41+
_('Field to use for default sorting. If empty, _id will be used.', classes=['info-help-tight'])) }}
42+
{% endcall %}
43+
44+
{% call form.select(
45+
'sort_order',
46+
id='field-sort_order',
47+
label=_('Default sort order'),
48+
options=[{'value': 'asc', 'text': _('Ascending')}, {'value': 'desc', 'text': _('Descending')}],
49+
selected=data.sort_order or 'asc',
50+
) %}
51+
{{ form.info(
52+
_('Direction for default sorting: ascending or descending.', classes=['info-help-tight'])) }}
53+
{% endcall %}
54+
2855
<div class="control-group">
2956
<label class="form-label">{{ _('Show Columns') }}</label>
3057
<br/>
@@ -48,7 +75,7 @@
4875
</td>
4976
<td></td>
5077
</tr>
51-
{% for f in h.datastore_dictionary(resource.id) %}
78+
{% for f in fields %}
5279
<tr>
5380
<td>
5481
<label class="checkbox">

‎ckanext/datatablesview/templates/datatables/datatables_view.html‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
data-responsive-flag="{{ resource_view.get('responsive')|lower }}"
3535
data-page-length-choices="{{ page_length_choices }}"
3636
data-responsive-modal="{{ responsive_modal|lower }}"
37-
data-resource-url="{{ h.url_for(package.type ~ '_resource.read', id=package.name, resource_id=resource.id ) }}">
37+
data-resource-url="{{ h.url_for(package.type ~ '_resource.read', id=package.name, resource_id=resource.id ) }}"
38+
data-sort-field="{{ resource_view.get('sort_field', '') }}"
39+
data-sort-order="{{ resource_view.get('sort_order', 'asc') }}">
3840
<thead>
3941
<tr>
4042
<th class="all" data-name="_id">_id</th>

0 commit comments

Comments
 (0)