Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions modules/backend/assets/less/controls/file-icon.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
.file-icon {
fill-rule: evenodd;
clip-rule: evenodd;
stroke-linejoin: round;
stroke-miterlimit: 2;
display: inline-block;

&-extension {
font-family: 'ArialMT','Arial',sans-serif;
font-size: 4em;
font-weight: 900;
fill: #fff;
}

&-label {
fill: #576D7E; /* Default color */
fill-rule: nonzero;
}

&-css,
&-less,
&-scss {
fill: #B73FD9;
}
&-html,
&-xml {
fill: #EA9B47;
}
&-js,
&-json {
fill: #A9A9A9;
}
&-pdf {
fill: #E30713;
}
&-txt {
fill: #248BD0;
}
&-ai {
fill: #F29200;
}
&-eps {
fill: #F9B234;
}
&-psd {
fill: #2DAAE2;
}
&-ttf,
&-otf,
&-woff,
&-woff2 {
fill: #C4CA10;
}
&-doc,
&-docx,
&-rtf,
&-odt {
fill: #0F70B7;
}
&-csv,
&-ods,
&-xls,
&-xlsx {
fill: #3BAA34;
}
&-odp,
&-ppt,
&-pptx {
fill: #D04526;
}
&-rar,
&-tar,
&-zip {
fill: #363A56;
}
}
23 changes: 23 additions & 0 deletions modules/backend/formwidgets/FileUpload.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,11 @@ class FileUpload extends FormWidgetBase
*/
protected $configFormWidget;

/**
* @var array Extensions of image files that browsers can display, other files are shown with a file icon.
*/
protected $displayableImageExtensions = ['avif', 'bmp', 'gif', 'ico', 'jpeg', 'jpg', 'png', 'svg', 'webp'];

/**
* @inheritDoc
*/
Expand Down Expand Up @@ -511,6 +516,7 @@ public function onUpload()
$result = [
'id' => $file->id,
'thumb' => $file->thumbUrl,
'icon' => $this->makeFileIcon($file),
'path' => $file->pathUrl
];

Expand Down Expand Up @@ -543,6 +549,23 @@ protected function decorateFileAttributes($file)
return $file;
}

/**
* Renders a file extension icon for files that cannot be displayed as an image,
* returns null for image files.
*/
protected function makeFileIcon($file): ?string
{
$extension = strtolower($file->getExtension());

if (in_array($extension, $this->displayableImageExtensions)) {
return null;
}

return $this->makePartial('~/modules/backend/partials/_file_icon.php', [
'extension' => $extension,
]);
}

/**
* Return max upload filesize in Mb
* @return integer
Expand Down
35 changes: 35 additions & 0 deletions modules/backend/formwidgets/fileupload/assets/css/fileupload.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,36 @@
.file-icon{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;display:inline-block}
.file-icon-extension{font-family:'ArialMT','Arial',sans-serif;font-size:4em;font-weight:900;fill:#fff}
.file-icon-label{fill:#576D7E;fill-rule:nonzero}
.file-icon-css,
.file-icon-less,
.file-icon-scss{fill:#B73FD9}
.file-icon-html,
.file-icon-xml{fill:#EA9B47}
.file-icon-js,
.file-icon-json{fill:#A9A9A9}
.file-icon-pdf{fill:#E30713}
.file-icon-txt{fill:#248BD0}
.file-icon-ai{fill:#F29200}
.file-icon-eps{fill:#F9B234}
.file-icon-psd{fill:#2DAAE2}
.file-icon-ttf,
.file-icon-otf,
.file-icon-woff,
.file-icon-woff2{fill:#C4CA10}
.file-icon-doc,
.file-icon-docx,
.file-icon-rtf,
.file-icon-odt{fill:#0F70B7}
.file-icon-csv,
.file-icon-ods,
.file-icon-xls,
.file-icon-xlsx{fill:#3BAA34}
.file-icon-odp,
.file-icon-ppt,
.file-icon-pptx{fill:#D04526}
.file-icon-rar,
.file-icon-tar,
.file-icon-zip{fill:#363A56}
.field-fileupload .upload-object{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;position:relative;outline:none;overflow:hidden;display:inline-block;vertical-align:top}
.field-fileupload .upload-object img{width:100%;height:100%}
.field-fileupload .upload-object .icon-container{display:table;opacity:0.6}
Expand Down Expand Up @@ -65,6 +98,7 @@
.field-fileupload.style-image-multi .upload-object .progress-bar .upload-progress{float:left;width:0%;height:100%;line-height:5px;color:#fff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-image-multi .upload-object .icon-container{border-right:1px solid #f6f8f9;float:left;overflow:hidden;width:75px;height:75px;display:flex;align-items:center;justify-content:center}
.field-fileupload.style-image-multi .upload-object .icon-container i{font-size:35px}
.field-fileupload.style-image-multi .upload-object .icon-container .file-icon{width:44px;height:44px}
.field-fileupload.style-image-multi .upload-object .icon-container.image img{border-bottom-left-radius:3px;border-top-left-radius:3px;width:auto;height:auto;max-height:100%}
.field-fileupload.style-image-multi .upload-object .info{margin-left:90px}
.field-fileupload.style-image-multi .upload-object .info h4{padding-right:15px}
Expand Down Expand Up @@ -97,6 +131,7 @@
.field-fileupload.style-image-single .upload-object{padding-bottom:66px}
.field-fileupload.style-image-single .upload-object .icon-container{border:1px solid #f6f8f9;background:rgba(255,255,255,0.5)}
.field-fileupload.style-image-single .upload-object .icon-container.image img{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:block;max-width:100%;height:auto;min-height:100px;min-width:100px}
.field-fileupload.style-image-single .upload-object .icon-container .file-icon{display:block;width:100px;height:100px}
.field-fileupload.style-image-single .upload-object .progress-bar{display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;bottom:10px;left:0}
.field-fileupload.style-image-single .upload-object .progress-bar .upload-progress{float:left;width:0%;height:100%;line-height:5px;color:#fff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-image-single .upload-object .info{position:absolute;left:0;right:0;bottom:0;height:66px}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,13 @@
$preview.data('id', response.id)
$preview.data('path', response.path)
$('.upload-remove-button', $preview).data('request-data', { file_id: response.id })
$img.attr('src', response.thumb)

if (response.icon) {
$img.replaceWith(response.icon)
}
else {
$img.attr('src', response.thumb)
}
}

this.triggerChange();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
font-size: 35px;
}

.file-icon {
width: 44px;
height: 44px;
}

&.image img {
.border-left-radius(3px);
width: auto;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
min-height: 100px;
min-width: 100px;
}

.file-icon {
display: block;
width: 100px;
height: 100px;
}
}

.progress-bar {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@import "../../../../assets/less/core/boot.less";
@import "../../../../assets/less/controls/file-icon.less";

@fileupload-progress-bar-height: 5px;
@fileupload-progress-bar-color: #fff;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ class="field-fileupload style-image-multi is-sortable is-multi <?= count($fileLi
<?php foreach ($fileList as $file): ?>
<div class="upload-object is-success" data-id="<?= $file->id ?>" data-path="<?= $file->pathUrl ?>">
<div class="icon-container image">
<img src="<?= $file->thumbUrl ?>" alt="" />
<?php if ($fileIcon = $this->makeFileIcon($file)): ?>
<?= $fileIcon ?>
<?php else: ?>
<img src="<?= $file->thumbUrl ?>" alt="" />
<?php endif ?>
</div>
<div class="info">
<h4 class="filename">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ class="upload-button">
<?php if ($singleFile): ?>
<div class="upload-object is-success" data-id="<?= $singleFile->id ?>" data-path="<?= $singleFile->pathUrl ?>">
<div class="icon-container image">
<img src="<?= $singleFile->thumbUrl ?>" alt="" />
<?php if ($fileIcon = $this->makeFileIcon($singleFile)): ?>
<?= $fileIcon ?>
<?php else: ?>
<img src="<?= $singleFile->thumbUrl ?>" alt="" />
<?php endif ?>
</div>
<div class="info">
<h4 class="filename">
Expand Down
13 changes: 13 additions & 0 deletions modules/backend/partials/_file_icon.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
$extension = e(substr(strtolower($extension ?? ''), 0, 4));
?>
<svg class="file-icon" viewBox="0 0 250 250" xml:space="preserve">
<path d="M62.5,0c-8.594,0 -15.625,7.031 -15.625,15.625l0,218.75c0,8.594 7.031,15.625 15.625,15.625l156.25,0c8.594,0 15.625,-7.031 15.625,-15.625l0,-171.875l-62.5,-62.5l-109.375,0Z" style="fill:#e2e5e7;fill-rule:nonzero;"/>
<path d="M187.5,62.5l46.875,0l-62.5,-62.5l0,46.875c0,8.594 7.031,15.625 15.625,15.625Z" style="fill:#b0b7bd;fill-rule:nonzero;"/>
<path d="M234.375,109.375l-46.875,-46.875l46.875,0l0,46.875Z" style="fill:#cad1d8;fill-rule:nonzero;"/>
<path d="M195.313,210.938l-148.438,-0.001l0,7.813l148.438,0c4.296,0 7.812,-3.516 7.812,-7.813l-0,-7.812c-0,4.297 -3.516,7.813 -7.813,7.813Z" style="fill:#cad1d8;fill-rule:nonzero;"/>
<!-- Colour label -->
<path class="file-icon-label file-icon-<?= $extension ?>" d="M203.125,203.125c0,4.297 -3.516,7.813 -7.813,7.813l-171.875,-0c-4.296,-0 -7.812,-3.516 -7.812,-7.813l-0,-78.125c-0,-4.297 3.516,-7.813 7.812,-7.813l171.875,0.001c4.297,-0.001 7.813,3.515 7.813,7.812l0,78.125Z"/>
<!-- Extension text node -->
<text class="file-icon-extension" x="43%" y="170px" dominant-baseline="middle" text-anchor="middle"><?= strtoupper($extension) ?></text>
</svg>
66 changes: 33 additions & 33 deletions modules/backend/widgets/mediamanager/assets/css/mediamanager.css
Original file line number Diff line number Diff line change
@@ -1,40 +1,40 @@
.file-icon{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;display:inline-block}
.file-icon-extension{font-family:'ArialMT','Arial',sans-serif;font-size:4em;font-weight:900;fill:#fff}
.file-icon-label{fill:#576D7E;fill-rule:nonzero}
.file-icon-css,
.file-icon-less,
.file-icon-scss{fill:#B73FD9}
.file-icon-html,
.file-icon-xml{fill:#EA9B47}
.file-icon-js,
.file-icon-json{fill:#A9A9A9}
.file-icon-pdf{fill:#E30713}
.file-icon-txt{fill:#248BD0}
.file-icon-ai{fill:#F29200}
.file-icon-eps{fill:#F9B234}
.file-icon-psd{fill:#2DAAE2}
.file-icon-ttf,
.file-icon-otf,
.file-icon-woff,
.file-icon-woff2{fill:#C4CA10}
.file-icon-doc,
.file-icon-docx,
.file-icon-rtf,
.file-icon-odt{fill:#0F70B7}
.file-icon-csv,
.file-icon-ods,
.file-icon-xls,
.file-icon-xlsx{fill:#3BAA34}
.file-icon-odp,
.file-icon-ppt,
.file-icon-pptx{fill:#D04526}
.file-icon-rar,
.file-icon-tar,
.file-icon-zip{fill:#363A56}
div[data-control="media-manager"]:focus{outline:none}
div[data-control="media-manager"] audio,
div[data-control="media-manager"] video{width:100%}
div[data-control="media-manager"] video{background:#ecf0f1;max-height:225px}
div[data-control="media-manager"] .file-icon{fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;display:inline-block}
div[data-control="media-manager"] .file-icon-extension{font-family:'ArialMT','Arial',sans-serif;font-size:4em;font-weight:900;fill:#fff}
div[data-control="media-manager"] .file-icon-label{fill:#576D7E;fill-rule:nonzero}
div[data-control="media-manager"] .file-icon-css,
div[data-control="media-manager"] .file-icon-less,
div[data-control="media-manager"] .file-icon-scss{fill:#B73FD9}
div[data-control="media-manager"] .file-icon-html,
div[data-control="media-manager"] .file-icon-xml{fill:#EA9B47}
div[data-control="media-manager"] .file-icon-js,
div[data-control="media-manager"] .file-icon-json{fill:#A9A9A9}
div[data-control="media-manager"] .file-icon-pdf{fill:#E30713}
div[data-control="media-manager"] .file-icon-txt{fill:#248BD0}
div[data-control="media-manager"] .file-icon-ai{fill:#F29200}
div[data-control="media-manager"] .file-icon-eps{fill:#F9B234}
div[data-control="media-manager"] .file-icon-psd{fill:#2DAAE2}
div[data-control="media-manager"] .file-icon-ttf,
div[data-control="media-manager"] .file-icon-otf,
div[data-control="media-manager"] .file-icon-woff,
div[data-control="media-manager"] .file-icon-woff2{fill:#C4CA10}
div[data-control="media-manager"] .file-icon-doc,
div[data-control="media-manager"] .file-icon-docx,
div[data-control="media-manager"] .file-icon-rtf,
div[data-control="media-manager"] .file-icon-odt{fill:#0F70B7}
div[data-control="media-manager"] .file-icon-csv,
div[data-control="media-manager"] .file-icon-ods,
div[data-control="media-manager"] .file-icon-xls,
div[data-control="media-manager"] .file-icon-xlsx{fill:#3BAA34}
div[data-control="media-manager"] .file-icon-odp,
div[data-control="media-manager"] .file-icon-ppt,
div[data-control="media-manager"] .file-icon-pptx{fill:#D04526}
div[data-control="media-manager"] .file-icon-rar,
div[data-control="media-manager"] .file-icon-tar,
div[data-control="media-manager"] .file-icon-zip{fill:#363A56}
div[data-control="media-manager"] .media-player-fallback{font-size:13px;color:#95a5a6;background:#ecf0f1;line-height:180%}
div[data-control="media-manager"] .media-player-fallback.panel-embedded{padding:20px;margin:-20px -20px 0 -20px}
div[data-control="media-manager"] .empty-library{padding:20px;text-align:center}
Expand Down
Loading
Loading