forked from retoor/devplacepy
Extend ALLOWED_UPLOAD_TYPES dict with audio formats (wav, flac, ogg, aac, wma, m4a), video formats (avi, mkv, flv, wmv, 3gp), document formats (doc, docx, xls, xlsx, ppt, pptx, odt, rtf), code formats (ts, java, cpp, c, h, rb, go, rs, sql, php, swift, kt), config formats (cfg, ini, log), archive formats (tar, gz, rar, 7z), and additional web formats (html, json, xml, yaml, yml, toml, sh, bat, svg). Add corresponding MIME_TO_EXT reverse mappings. Implement audio element rendering in ContentRenderer.js with audioExtRe regex and createAudioElement method. Add gallery-audio CSS class for audio player styling in attachments.css and media.css. Update _attachment_display.html and _media_gallery.html templates to render audio controls for is_audio attachments.
37 lines
2.2 KiB
HTML
37 lines
2.2 KiB
HTML
<div class="media-grid">
|
|
{% for item in media %}
|
|
<div class="media-tile" data-media-tile="{{ item['uid'] }}">
|
|
{% if item.get('is_image') and item.get('thumbnail_url') %}
|
|
<img src="{{ item['thumbnail_url'] }}" alt="{{ item.get('original_filename', '') }}" loading="lazy" class="gallery-thumb" data-lightbox data-full="{{ item['url'] }}">
|
|
{% elif item.get('is_image') %}
|
|
<img src="{{ item['url'] }}" alt="{{ item.get('original_filename', '') }}" loading="lazy" class="gallery-thumb" data-lightbox data-full="{{ item['url'] }}">
|
|
{% elif item.get('is_video') %}
|
|
<video src="{{ item['url'] }}" controls preload="metadata" class="gallery-video"></video>
|
|
{% elif item.get('is_audio') %}
|
|
<audio src="{{ item['url'] }}" controls preload="metadata" class="gallery-audio"></audio>
|
|
{% else %}
|
|
<a href="{{ item['url'] }}" target="_blank" rel="noopener" class="non-image" download="{{ item.get('original_filename', 'file') }}">
|
|
<span class="icon">{{ file_icon_emoji(item.get('original_filename', 'file')) }}</span>
|
|
<span class="name">{{ item.get('original_filename', 'file') }}</span>
|
|
<span class="size">{{ format_file_size(item.get('file_size', 0)) }}</span>
|
|
</a>
|
|
{% endif %}
|
|
<div class="media-tile-overlay">
|
|
{% if item.get('target_url') %}
|
|
<a href="{{ item['target_url'] }}" class="media-source-link">{{ item.get('target_type', 'source')|capitalize }}</a>
|
|
{% endif %}
|
|
{% if is_owner or viewer_is_admin %}
|
|
<button type="button" class="media-delete-btn" data-media-delete="{{ item['uid'] }}" data-confirm="Delete this media?" data-confirm-danger aria-label="Delete media">🗑️</button>
|
|
<noscript>
|
|
<form method="POST" action="/media/{{ item['uid'] }}/delete" class="media-delete-form">
|
|
<button type="submit" class="media-delete-btn" aria-label="Delete media">🗑️</button>
|
|
</form>
|
|
</noscript>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state">No media yet.</div>
|
|
{% endfor %}
|
|
</div>
|