@@ -4,11 +4,13 @@ mod http_utils;
4
4
mod query_params;
5
5
mod scoped_file_system;
6
6
7
+ use chrono:: { DateTime , Local } ;
8
+
7
9
pub use file:: { File , FILE_BUFFER_SIZE } ;
8
10
pub use scoped_file_system:: { Directory , Entry , ScopedFileSystem } ;
9
11
10
12
use anyhow:: { Context , Result } ;
11
- use handlebars:: Handlebars ;
13
+ use handlebars:: { handlebars_helper , Handlebars } ;
12
14
use http:: response:: Builder as HttpResponseBuilder ;
13
15
use http:: { StatusCode , Uri } ;
14
16
use hyper:: { Body , Response } ;
@@ -18,10 +20,10 @@ use std::path::{Component, Path, PathBuf};
18
20
use std:: str:: FromStr ;
19
21
use std:: sync:: Arc ;
20
22
21
- use crate :: utils:: fmt:: { format_bytes, format_system_date } ;
23
+ use crate :: utils:: fmt:: format_bytes;
22
24
use crate :: utils:: url_encode:: { decode_uri, encode_uri, PERCENT_ENCODE_SET } ;
23
25
24
- use self :: directory_entry:: { BreadcrumbItem , DirectoryEntry , DirectoryIndex } ;
26
+ use self :: directory_entry:: { BreadcrumbItem , DirectoryEntry , DirectoryIndex , Sort } ;
25
27
use self :: http_utils:: { make_http_file_response, CacheControlDirective } ;
26
28
use self :: query_params:: { QueryParams , SortBy } ;
27
29
@@ -58,6 +60,26 @@ impl<'a> FileServer {
58
60
. register_template_string ( EXPLORER_TEMPLATE , template)
59
61
. unwrap ( ) ;
60
62
63
+ handlebars_helper ! ( date: |d: Option <DateTime <Local >>| {
64
+ match d {
65
+ Some ( d) => d. format( "%Y/%m/%d %H:%M:%S" ) . to_string( ) ,
66
+ None => "-" . to_owned( ) ,
67
+ }
68
+ } ) ;
69
+ handlebars. register_helper ( "date" , Box :: new ( date) ) ;
70
+
71
+ handlebars_helper ! ( sort_name: |sort: Sort | sort == Sort :: Name ) ;
72
+ handlebars. register_helper ( "sort_name" , Box :: new ( sort_name) ) ;
73
+
74
+ handlebars_helper ! ( sort_size: |sort: Sort | sort == Sort :: Size ) ;
75
+ handlebars. register_helper ( "sort_size" , Box :: new ( sort_size) ) ;
76
+
77
+ handlebars_helper ! ( sort_date_created: |sort: Sort | sort == Sort :: DateCreated ) ;
78
+ handlebars. register_helper ( "sort_date_created" , Box :: new ( sort_date_created) ) ;
79
+
80
+ handlebars_helper ! ( sort_date_modified: |sort: Sort | sort == Sort :: DateModified ) ;
81
+ handlebars. register_helper ( "sort_date_modified" , Box :: new ( sort_date_modified) ) ;
82
+
61
83
Arc :: new ( handlebars)
62
84
}
63
85
@@ -224,15 +246,15 @@ impl<'a> FileServer {
224
246
for entry in entries {
225
247
let entry = entry. context ( "Unable to read entry" ) ?;
226
248
let metadata = entry. metadata ( ) ?;
227
- let created_at = if let Ok ( time) = metadata. created ( ) {
228
- format_system_date ( time)
249
+ let date_created = if let Ok ( time) = metadata. created ( ) {
250
+ Some ( time. into ( ) )
229
251
} else {
230
- String :: default ( )
252
+ None
231
253
} ;
232
- let updated_at = if let Ok ( time) = metadata. modified ( ) {
233
- format_system_date ( time)
254
+ let date_modified = if let Ok ( time) = metadata. modified ( ) {
255
+ Some ( time. into ( ) )
234
256
} else {
235
- String :: default ( )
257
+ None
236
258
} ;
237
259
238
260
directory_entries. push ( DirectoryEntry {
@@ -245,8 +267,8 @@ impl<'a> FileServer {
245
267
size : format_bytes ( metadata. len ( ) as f64 ) ,
246
268
len : metadata. len ( ) ,
247
269
entry_path : FileServer :: make_dir_entry_link ( & root_dir, & entry. path ( ) ) ,
248
- created_at ,
249
- updated_at ,
270
+ date_created ,
271
+ date_modified ,
250
272
} ) ;
251
273
}
252
274
@@ -255,25 +277,28 @@ impl<'a> FileServer {
255
277
match sort_by {
256
278
SortBy :: Name => {
257
279
directory_entries. sort_by_key ( |entry| entry. display_name . clone ( ) ) ;
258
-
259
- return Ok ( DirectoryIndex {
260
- entries : directory_entries,
261
- breadcrumbs,
262
- sort_by_name : true ,
263
- sort_by_size : false ,
264
- } ) ;
265
280
}
266
- SortBy :: Size => {
267
- directory_entries. sort_by_key ( |entry| entry. len ) ;
268
-
269
- return Ok ( DirectoryIndex {
270
- entries : directory_entries,
271
- breadcrumbs,
272
- sort_by_name : false ,
273
- sort_by_size : true ,
274
- } ) ;
281
+ SortBy :: Size => directory_entries. sort_by_key ( |entry| entry. len ) ,
282
+ SortBy :: DateCreated => {
283
+ directory_entries. sort_by_key ( |entry| entry. date_created )
275
284
}
276
- }
285
+ SortBy :: DateModified => {
286
+ directory_entries. sort_by_key ( |entry| entry. date_modified )
287
+ }
288
+ } ;
289
+
290
+ let sort_enum = match sort_by {
291
+ SortBy :: Name => Sort :: Name ,
292
+ SortBy :: Size => Sort :: Size ,
293
+ SortBy :: DateCreated => Sort :: DateCreated ,
294
+ SortBy :: DateModified => Sort :: DateModified ,
295
+ } ;
296
+
297
+ return Ok ( DirectoryIndex {
298
+ entries : directory_entries,
299
+ breadcrumbs,
300
+ sort : sort_enum,
301
+ } ) ;
277
302
}
278
303
}
279
304
@@ -282,8 +307,7 @@ impl<'a> FileServer {
282
307
Ok ( DirectoryIndex {
283
308
entries : directory_entries,
284
309
breadcrumbs,
285
- sort_by_name : false ,
286
- sort_by_size : false ,
310
+ sort : Sort :: Directory ,
287
311
} )
288
312
}
289
313
0 commit comments