Skip to content

Commit 6a4172c

Browse files
committed
Simplify filename column
1 parent 38ec383 commit 6a4172c

File tree

5 files changed

+68
-33
lines changed

5 files changed

+68
-33
lines changed

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace wcf\system\gridView;
44

55
use wcf\data\DatabaseObject;
6+
use wcf\data\DatabaseObjectDecorator;
7+
use wcf\data\ILinkableObject;
68
use wcf\system\request\LinkHandler;
79
use wcf\util\StringUtil;
810

@@ -19,7 +21,8 @@ class GridViewRowLink
1921
public function __construct(
2022
private readonly string $controllerClass = '',
2123
private readonly array $parameters = [],
22-
private readonly string $cssClass = ''
24+
private readonly string $cssClass = '',
25+
private readonly bool $isLinkableObject = false,
2326
) {}
2427

2528
/**
@@ -29,10 +32,12 @@ public function render(mixed $value, DatabaseObject $row, bool $isPrimaryColumn
2932
{
3033
$href = '';
3134
if ($this->controllerClass) {
32-
$href = LinkHandler::getInstance()->getControllerLink(
35+
$href = StringUtil::encodeHTML(LinkHandler::getInstance()->getControllerLink(
3336
$this->controllerClass,
3437
\array_merge($this->parameters, ['object' => $row])
35-
);
38+
));
39+
} else if ($this->isLinkableObject) {
40+
$href = StringUtil::encodeHTML($this->getLink($row));
3641
}
3742

3843
$attributes = [];
@@ -54,4 +59,20 @@ public function render(mixed $value, DatabaseObject $row, bool $isPrimaryColumn
5459
. '</a>';
5560
}
5661
}
62+
63+
private function getLink(DatabaseObject $object): string
64+
{
65+
if ($object instanceof ILinkableObject) {
66+
return $object->getLink();
67+
}
68+
69+
if ($object instanceof DatabaseObjectDecorator) {
70+
$decoratedObject = $object->getDecoratedObject();
71+
if ($decoratedObject instanceof ILinkableObject) {
72+
return $decoratedObject->getLink();
73+
}
74+
}
75+
76+
throw new \BadMethodCallException("GridViewRowLink expects object to be an implementation of ILinkableObject.");
77+
}
5778
}

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

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@
1717
use wcf\system\gridView\filter\TimeFilter;
1818
use wcf\system\gridView\filter\UserFilter;
1919
use wcf\system\gridView\GridViewColumn;
20+
use wcf\system\gridView\GridViewRowLink;
2021
use wcf\system\gridView\renderer\AbstractColumnRenderer;
2122
use wcf\system\gridView\renderer\FilesizeColumnRenderer;
23+
use wcf\system\gridView\renderer\ILinkColumnRenderer;
2224
use wcf\system\gridView\renderer\ObjectIdColumnRenderer;
2325
use wcf\system\gridView\renderer\TimeColumnRenderer;
26+
use wcf\system\gridView\renderer\TruncatedTextColumnRenderer;
2427
use wcf\system\interaction\admin\AttachmentInteractions;
2528
use wcf\system\interaction\bulk\admin\AttachmentBulkInteractions;
2629
use wcf\system\request\LinkHandler;
@@ -46,55 +49,41 @@ public function __construct()
4649
->renderer(new ObjectIdColumnRenderer())
4750
->filter(new ObjectIdFilter())
4851
->sortable(),
49-
GridViewColumn::for('filename')
50-
->label('wcf.attachment.filename')
51-
->titleColumn()
52-
->filter(new TextFilter('file_table.filename'))
52+
53+
GridViewColumn::for('preview')
54+
->label('wcf.attachment.preview')
5355
->renderer(
54-
new class extends AbstractColumnRenderer {
56+
new class extends AbstractColumnRenderer implements ILinkColumnRenderer {
5557
#[\Override]
5658
public function render(mixed $value, DatabaseObject $row): string
5759
{
5860
\assert($row instanceof AdministrativeAttachment);
5961

6062
$isImage = $row->isImage;
61-
$link = $row->getLink();
62-
$fancyBox = $isImage ? ' data-fancybox="attachments" data-caption="' . $row->filename . '"' : '';
63+
$link = StringUtil::encodeHTML($row->getLink());
64+
$fancyBox = $isImage ? ' data-fancybox="attachments" data-caption="' . StringUtil::encodeHTML($row->filename) . '"' : '';
6365
if ($row->tinyThumbnailType) {
6466
$thumbnailLink = \sprintf(
6567
'<img src="%s" class="attachmentTinyThumbnail" alt="">',
66-
$row->getThumbnailLink('tiny')
68+
StringUtil::encodeHTML($row->getThumbnailLink('tiny'))
6769
);
6870
} else {
6971
$thumbnailLink = FontAwesomeIcon::fromValues($row->getIconName())->toHtml(64);
7072
}
71-
$filename = StringUtil::wordwrap($row->filename, 30, "\xE2\x80\x8B");
72-
if ($row->getContainerObject()) {
73-
$containerObject = \sprintf(
74-
'<p><small><a href="%s">%s</a></small></p>',
75-
$row->getContainerObject()->getLink(),
76-
StringUtil::encodeHTML(
77-
StringUtil::wordwrap($row->getContainerObject()->getTitle(), 30, "\xE2\x80\x8B")
78-
)
79-
);
80-
} else {
81-
$containerObject = "";
82-
}
8373

8474
return <<<HTML
85-
<div class="box64">
86-
<a href="{$link}"{$fancyBox}>
87-
{$thumbnailLink}
88-
</a>
89-
<div>
90-
<p><a href="{$link}">{$filename}</a></p>
91-
{$containerObject}
92-
</div>
93-
</div>
75+
<a href="{$link}"{$fancyBox}>
76+
{$thumbnailLink}
77+
</a>
9478
HTML;
9579
}
9680
}
97-
)
81+
),
82+
GridViewColumn::for('filename')
83+
->label('wcf.attachment.filename')
84+
->titleColumn()
85+
->filter(new TextFilter('file_table.filename'))
86+
->renderer(new TruncatedTextColumnRenderer())
9887
->sortable(sortByDatabaseColumn: 'file_table.filename'),
9988
GridViewColumn::for('fileType')
10089
->label('wcf.attachment.fileType')
@@ -152,6 +141,7 @@ public function render(mixed $value, DatabaseObject $row): string
152141
$interaction = new AttachmentInteractions();
153142
$this->setInteractionProvider($interaction);
154143
$this->setBulkInteractionProvider(new AttachmentBulkInteractions());
144+
$this->addRowLink(new GridViewRowLink(isLinkableObject: true));
155145

156146
$this->setSortOrder('DESC');
157147
$this->setSortField('uploadTime');

wcfsetup/install/files/lib/system/interaction/admin/AttachmentInteractions.class.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
namespace wcf\system\interaction\admin;
44

55
use wcf\data\attachment\AdministrativeAttachment;
6+
use wcf\data\DatabaseObject;
67
use wcf\event\interaction\admin\AttachmentInteractionCollecting;
78
use wcf\system\event\EventHandler;
9+
use wcf\system\interaction\AbstractInteraction;
810
use wcf\system\interaction\AbstractInteractionProvider;
911
use wcf\system\interaction\DeleteInteraction;
12+
use wcf\system\WCF;
13+
use wcf\util\StringUtil;
1014

1115
/**
1216
* Interaction provider for attachments.
@@ -22,6 +26,22 @@ public function __construct()
2226
{
2327
$this->addInteractions([
2428
new DeleteInteraction('core/attachments/%s'),
29+
new class(
30+
'goToContent',
31+
static fn(AdministrativeAttachment $object) => $object->getContainerObject() !== null
32+
) extends AbstractInteraction {
33+
#[\Override]
34+
public function render(DatabaseObject $object): string
35+
{
36+
\assert($object instanceof AdministrativeAttachment);
37+
38+
return \sprintf(
39+
'<a href="%s">%s</a>',
40+
StringUtil::encodeHTML($object->getContainerObject()->getLink()),
41+
WCF::getLanguage()->get('wcf.acp.attachment.button.goToContent')
42+
);
43+
}
44+
}
2545
]);
2646

2747
EventHandler::getInstance()->fire(

wcfsetup/install/lang/de.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
<category name="wcf.acp.attachment">
113113
<item name="wcf.acp.attachment.list"><![CDATA[Dateianhänge]]></item>
114114
<item name="wcf.acp.attachment.stats"><![CDATA[<ul class="inlineList dotSeparated"><li>{#$stats.count} {if $stats.count == 1}Dateianhang{else}Dateianhänge{/if}</li><li>{@$stats.size|filesize}</li><li>{#$stats.downloads} Download{if $stats.downloads != 1}s{/if}</li></ul>]]></item>
115+
<item name="wcf.acp.attachment.button.goToContent"><![CDATA[Zum Inhalt gehen]]></item>
115116
</category>
116117
<category name="wcf.acp.bbcode">
117118
<item name="wcf.acp.bbcode.add"><![CDATA[BBCode hinzufügen]]></item>
@@ -3372,6 +3373,7 @@ Erlaubte Dateiendungen: {', '|implode:$attachmentHandler->getFormattedAllowedExt
33723373
<item name="wcf.attachment.dragAndDrop.dropHere"><![CDATA[Hierhin ziehen und loslassen, um Dateien hochzuladen]]></item>
33733374
<item name="wcf.attachment.dragAndDrop.dropNow"><![CDATA[Jetzt loslassen, um Dateien hochzuladen]]></item>
33743375
<item name="wcf.attachment.moreOptions"><![CDATA[Weitere Aktionen]]></item>
3376+
<item name="wcf.attachment.preview"><![CDATA[Vorschau]]></item>
33753377
</category>
33763378
<category name="wcf.bbcode">
33773379
<item name="wcf.bbcode.button.collapse"><![CDATA[Weniger anzeigen]]></item>

wcfsetup/install/lang/en.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
<category name="wcf.acp.attachment">
113113
<item name="wcf.acp.attachment.list"><![CDATA[Attachments]]></item>
114114
<item name="wcf.acp.attachment.stats"><![CDATA[<ul class="inlineList dotSeparated"><li>{#$stats.count} Attachment{if $stats.count != 1}s{/if}</li><li>{@$stats.size|filesize}</li><li>{#$stats.downloads} Download{if $stats.downloads != 1}s{/if}</li></ul>]]></item>
115+
<item name="wcf.acp.attachment.button.goToContent"><![CDATA[Go to Related Content]]></item>
115116
</category>
116117
<category name="wcf.acp.bbcode">
117118
<item name="wcf.acp.bbcode.add"><![CDATA[Add BBCode]]></item>
@@ -3297,6 +3298,7 @@ Allowed extensions: {', '|implode:$attachmentHandler->getFormattedAllowedExtensi
32973298
<item name="wcf.attachment.dragAndDrop.dropHere"><![CDATA[Drag and Drop here to upload]]></item>
32983299
<item name="wcf.attachment.dragAndDrop.dropNow"><![CDATA[Drop now to upload]]></item>
32993300
<item name="wcf.attachment.moreOptions"><![CDATA[More Options]]></item>
3301+
<item name="wcf.attachment.preview"><![CDATA[Preview]]></item>
33003302
</category>
33013303
<category name="wcf.bbcode">
33023304
<item name="wcf.bbcode.button.collapse"><![CDATA[Display Less]]></item>

0 commit comments

Comments
 (0)