Skip to content

Commit 226386c

Browse files
committed
Add per-column default sort order to grid view columns
`GridViewColumn::sortable()` now accepts a `$defaultSortOrder` argument (ASC or DESC). When the user switches sorting to a different column, the column's default sort order is applied instead of always defaulting to ASC.
1 parent a42cbbe commit 226386c

30 files changed

Lines changed: 70 additions & 53 deletions

com.woltlab.wcf/templates/shared_gridView.tpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
class="gridView__headerColumn {$column->getClasses()} {if $view->isSortedBy($column)}active {$view->getSortOrder()}{/if}"
3939
data-id="{$column->getID()}"
4040
data-sortable="{$column->isSortable()}"
41+
{if $column->isSortable()}data-default-sort-order="{$column->getDefaultSortOrder()}"{/if}
4142
{if $column->isSortable()}
4243
{if $view->isSortedBy($column)}
4344
aria-sort="{if $view->getSortOrder() === 'ASC'}ascending{else}descending{/if}"

ts/WoltLabSuite/Core/Component/GridView/Sorting.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class Sorting extends EventTarget {
3535
.forEach((element) => {
3636
const button = element.querySelector<HTMLButtonElement>(".gridView__headerColumn__button");
3737
button?.addEventListener("click", () => {
38-
this.#sort(element.dataset.id!);
38+
this.#sort(element.dataset.id!, element.dataset.defaultSortOrder ?? "ASC");
3939
});
4040
});
4141

@@ -84,12 +84,12 @@ export class Sorting extends EventTarget {
8484
this.#renderActiveSorting();
8585
}
8686

87-
#sort(sortField: string): void {
88-
if (this.#sortField == sortField && this.#sortOrder == "ASC") {
89-
this.#sortOrder = "DESC";
87+
#sort(sortField: string, defaultSortOrder: string): void {
88+
if (this.#sortField === sortField) {
89+
this.#sortOrder = this.#sortOrder === "ASC" ? "DESC" : "ASC";
9090
} else {
9191
this.#sortField = sortField;
92-
this.#sortOrder = "ASC";
92+
this.#sortOrder = defaultSortOrder;
9393
}
9494

9595
this.#renderActiveSorting();

wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView/Sorting.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wcfsetup/install/files/lib/system/gridView/GridViewColumn.class.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ final class GridViewColumn
3030

3131
private bool $sortable = false;
3232
private string $sortByDatabaseColumn = '';
33+
private string $defaultSortOrder = 'ASC';
3334
private ?IViewFilter $filter = null;
3435
private bool $hidden = false;
3536
private bool $unsafeDisableEncoding = false;
@@ -117,10 +118,15 @@ public function label(string $languageItem): static
117118
/**
118119
* Sets the sortable state of this column.
119120
*/
120-
public function sortable(bool $sortable = true, string $sortByDatabaseColumn = ''): static
121+
public function sortable(bool $sortable = true, string $sortByDatabaseColumn = '', string $defaultSortOrder = 'ASC'): static
121122
{
123+
if ($defaultSortOrder !== 'ASC' && $defaultSortOrder !== 'DESC') {
124+
throw new \InvalidArgumentException("Invalid value '{$defaultSortOrder}' as default sort order given.");
125+
}
126+
122127
$this->sortable = $sortable;
123128
$this->sortByDatabaseColumn = $sortByDatabaseColumn;
129+
$this->defaultSortOrder = $defaultSortOrder;
124130

125131
return $this;
126132
}
@@ -167,6 +173,16 @@ public function getSortByDatabaseColumn(): string
167173
return $this->sortByDatabaseColumn;
168174
}
169175

176+
/**
177+
* Returns the default sort order used when the user switches to this column.
178+
*
179+
* @since 6.3
180+
*/
181+
public function getDefaultSortOrder(): string
182+
{
183+
return $this->defaultSortOrder;
184+
}
185+
170186
/**
171187
* Sets a filter for this column.
172188
*

wcfsetup/install/files/lib/system/gridView/admin/ACPSessionGridView.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function __construct(private readonly int $sessionLogID)
4343
->filter(IpAddressFilter::class),
4444
GridViewColumn::for('time')
4545
->label('wcf.acp.sessionLog.time')
46-
->sortable()
46+
->sortable(defaultSortOrder: 'DESC')
4747
->renderer(new TimeColumnRenderer())
4848
->filter(TimeFilter::class),
4949
GridViewColumn::for('className')

wcfsetup/install/files/lib/system/gridView/admin/ACPSessionLogGridView.class.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,17 @@ public function __construct()
6060
->filter(TextFilter::class),
6161
GridViewColumn::for('time')
6262
->label('wcf.acp.sessionLog.time')
63-
->sortable()
63+
->sortable(defaultSortOrder: 'DESC')
6464
->renderer(new TimeColumnRenderer())
6565
->filter(TimeFilter::class),
6666
GridViewColumn::for('lastActivityTime')
6767
->label('wcf.acp.sessionLog.lastActivityTime')
68-
->sortable()
68+
->sortable(defaultSortOrder: 'DESC')
6969
->renderer(new TimeColumnRenderer())
7070
->filter(TimeFilter::class),
7171
GridViewColumn::for('accesses')
7272
->label('wcf.acp.sessionLog.actions')
73-
->sortable(true, 'accesses')
73+
->sortable(true, 'accesses', 'DESC')
7474
->renderer(new NumberColumnRenderer()),
7575
]);
7676

wcfsetup/install/files/lib/system/gridView/admin/ArticleGridView.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,10 @@ public function render(mixed $value, DatabaseObject $row): string
170170
GridViewColumn::for('views')
171171
->label('wcf.acp.article.views')
172172
->renderer(new NumberColumnRenderer())
173-
->sortable(),
173+
->sortable(defaultSortOrder: 'DESC'),
174174
GridViewColumn::for('time')
175175
->label('wcf.acp.sessionLog.time')
176-
->sortable()
176+
->sortable(defaultSortOrder: 'DESC')
177177
->renderer(new TimeColumnRenderer())
178178
->filter(TimeFilter::class),
179179
]);

wcfsetup/install/files/lib/system/gridView/admin/AttachmentGridView.class.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,21 +154,21 @@ public function render(mixed $value, DatabaseObject $row): string
154154
->label('wcf.attachment.uploadTime')
155155
->renderer(new TimeColumnRenderer())
156156
->filter(TimeFilter::class)
157-
->sortable(),
157+
->sortable(defaultSortOrder: 'DESC'),
158158
GridViewColumn::for('downloads')
159159
->label('wcf.attachment.downloads')
160160
->filter(IntegerFilter::class)
161161
->renderer(new NumberColumnRenderer())
162-
->sortable(),
162+
->sortable(defaultSortOrder: 'DESC'),
163163
GridViewColumn::for('filesize')
164164
->label('wcf.attachment.filesize')
165165
->renderer(new FilesizeColumnRenderer())
166-
->sortable(sortByDatabaseColumn: 'file_table.filesize'),
166+
->sortable(sortByDatabaseColumn: 'file_table.filesize', defaultSortOrder: 'DESC'),
167167
GridViewColumn::for('lastDownloadTime')
168168
->label('wcf.attachment.lastDownloadTime')
169169
->renderer(new TimeColumnRenderer())
170170
->filter(TimeFilter::class)
171-
->sortable(),
171+
->sortable(defaultSortOrder: 'DESC'),
172172
]);
173173

174174
$this->addAvailableFilters([

wcfsetup/install/files/lib/system/gridView/admin/CaptchaQuestionGridView.class.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ public function __construct()
4545
->sortable(sortByDatabaseColumn: 'questionI18n'),
4646
GridViewColumn::for('views')
4747
->label('wcf.acp.captcha.question.views')
48-
->sortable()
48+
->sortable(defaultSortOrder: 'DESC')
4949
->filter(IntegerFilter::class),
5050
GridViewColumn::for('correctSubmissions')
5151
->label('wcf.acp.captcha.question.correctSubmissions')
52-
->sortable()
52+
->sortable(defaultSortOrder: 'DESC')
5353
->filter(IntegerFilter::class),
5454
GridViewColumn::for('incorrectSubmissions')
5555
->label('wcf.acp.captcha.question.incorrectSubmissions')
56-
->sortable()
56+
->sortable(defaultSortOrder: 'DESC')
5757
->filter(IntegerFilter::class),
5858
]);
5959

wcfsetup/install/files/lib/system/gridView/admin/CronjobGridView.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public function render(mixed $value, DatabaseObject $row): string
8787
->label('wcf.acp.cronjob.lastExec')
8888
->renderer(new TimeColumnRenderer())
8989
->filter(TimeFilter::class)
90-
->sortable(),
90+
->sortable(defaultSortOrder: 'DESC'),
9191
GridViewColumn::for('nextExec')
9292
->label('wcf.acp.cronjob.nextExec')
9393
->renderer(
@@ -106,7 +106,7 @@ public function render(mixed $value, DatabaseObject $row): string
106106
}
107107
)
108108
->filter(TimeFilter::class)
109-
->sortable(),
109+
->sortable(defaultSortOrder: 'DESC'),
110110
]);
111111

112112
$interaction = new CronjobInteractions();

0 commit comments

Comments
 (0)