Skip to content

Commit 28bee5c

Browse files
committed
WiP on filtering by mime types
1 parent ed42f9f commit 28bee5c

File tree

7 files changed

+24
-12
lines changed

7 files changed

+24
-12
lines changed

client/browser/FileSelectDialog.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ const FilesList = memo((props: any) => {
9191

9292

9393
const FileSelectDialog = forwardRef((props: any, forwardedRef) => {
94-
const {realm, baseUrl, csrfToken} = props;
94+
const {realm, baseUrl, mimeTypes, csrfToken} = props;
9595
const [structure, setStructure] = useState({
9696
root_folder: null,
9797
last_folder: null,
@@ -188,6 +188,7 @@ const FileSelectDialog = forwardRef((props: any, forwardedRef) => {
188188
async function fetchFiles() {
189189
const fetchUrl = (() => {
190190
const params = new URLSearchParams();
191+
mimeTypes.forEach(type => params.append('mimetypes', type));
191192
if (structure.recursive) {
192193
params.set('recursive', '');
193194
}

client/browser/FinderFileSelect.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
1-
import React, {RefObject, useEffect, useRef, useState} from 'react';
1+
import React, {useEffect, useRef, useState} from 'react';
22
import FileSelectDialog from './FileSelectDialog';
33

44

55
export default function FinderFileSelect(props) {
66
const shadowRoot = props.container;
7-
const hostRef = useRef(shadowRoot.host);
87
const baseUrl = props['base-url'];
98
const styleUrl = props['style-url'];
9+
const mimeTypes = props['mime-types'] ? props['mime-types'].split(',') : [];
1010
const selectRef = useRef(null);
1111
const slotRef = useRef(null);
1212
const dialogRef = useRef(null);
1313
const [selectedFile, setSelectedFile] = useState({});
1414
const csrfToken = getCSRFToken();
1515
const uuid5Regex = new RegExp(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
1616

17-
useMutationObserver(hostRef, (mutationList) => {
18-
for (const mutation of mutationList) {
19-
console.log(`The ${mutation.attributeName} attribute was modified.`);
20-
}
21-
}, {attributes: true});
22-
2317
useEffect(() => {
2418
// Create a styles element for the shadow DOM
2519
const link = document.createElement('link');
@@ -147,6 +141,7 @@ export default function FinderFileSelect(props) {
147141
ref={selectRef}
148142
realm={props.realm}
149143
baseUrl={baseUrl}
144+
mimeTypes={mimeTypes}
150145
csrfToken={csrfToken}
151146
selectFile={selectFile}
152147
dialogRef={dialogRef}

client/finder-select.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ window.addEventListener('DOMContentLoaded', (event) => {
66
window.customElements.define(
77
'finder-file-select',
88
r2wc(FinderFileSelect, {
9-
props: {'base-url': 'string', 'style-url': 'string', realm: 'string'},
9+
props: {'base-url': 'string', 'style-url': 'string', realm: 'string', 'mime-types': 'string'},
1010
shadow: 'open',
1111
}),
1212
);

finder/browser/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from django.utils.html import strip_spaces_between_tags
77
from django.utils.safestring import mark_safe
88
from django.views import View
9-
from django.views.decorators.http import last_modified
109

1110
from finder.lookups import annotate_unified_queryset, lookup_by_label, sort_by_attribute
1211
from finder.models.file import FileModel
@@ -154,6 +153,8 @@ def list(self, request, folder_id):
154153
offset = int(request.GET.get('offset', 0))
155154
recursive = 'recursive' in request.GET
156155
lookup = lookup_by_label(request)
156+
if mime_types := request.GET.getlist('mimetypes'):
157+
lookup['mime_types'] = mime_types
157158
if recursive:
158159
descendants = FolderModel.objects.get(id=folder_id).descendants
159160
if isinstance(descendants, QuerySet):

finder/forms/fields.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@
66

77
class FinderFileField(UUIDField):
88
widget = FinderFileSelect
9+
mime_types = None
10+
realm = 'admin'
11+
12+
def __init__(self, mime_types=None, *args, **kwargs):
13+
if isinstance(mime_types, (list, tuple)):
14+
self.mime_types = mime_types
15+
super().__init__(*args, **kwargs)
16+
17+
def widget_attrs(self, widget):
18+
widget.mime_types = self.mime_types
19+
return super().widget_attrs(widget)
920

1021

1122
class LabelsChoiceField(ModelMultipleChoiceField):

finder/forms/widgets.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
class FinderFileSelect(TextInput):
1414
template_name = 'finder/widgets/finder_file_select.html'
15+
mime_types = None
16+
realm = 'admin'
1517

1618
class Media:
1719
css = {'all': ['finder/css/finder-select.css']}
@@ -39,6 +41,8 @@ def get_context(self, name, value, attrs):
3941
realm='admin',
4042
style_url=static('finder/css/finder-browser.css'),
4143
)
44+
if isinstance(self.mime_types, (list, tuple)) and self.mime_types:
45+
context['mime_types'] = ','.join(self.mime_types)
4246
return context
4347

4448
def format_value(self, value):
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<finder-file-select base-url="{{ base_url }}" style-url="{{ style_url }}" realm="{{ realm }}">{% include "django/forms/widgets/input.html" %}</finder-file-select>
1+
<finder-file-select base-url="{{ base_url }}" style-url="{{ style_url }}" realm="{{ realm }}"{% if mime_types %} mime-types="{{ mime_types }}"{% endif %}>{% include "django/forms/widgets/input.html" %}</finder-file-select>

0 commit comments

Comments
 (0)