diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2018-06-03 00:13:02 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2018-06-03 00:13:02 +0200 |
| commit | 2149eb581c35a93d41dbad6e3409c498b4bed804 (patch) | |
| tree | a4d489ca73b2309654faece1322ea15045c0a8af /app/client/common/fileList.component.js | |
| parent | cf6f1c58a7298b0af1c13bb701032017563a6ed8 (diff) | |
sort files
Diffstat (limited to 'app/client/common/fileList.component.js')
| -rw-r--r-- | app/client/common/fileList.component.js | 95 |
1 files changed, 77 insertions, 18 deletions
diff --git a/app/client/common/fileList.component.js b/app/client/common/fileList.component.js index 0b69b62..13eb300 100644 --- a/app/client/common/fileList.component.js +++ b/app/client/common/fileList.component.js @@ -7,16 +7,29 @@ import * as util from '../util' const defaultFields = new Set(['date', 'size']) -export const FileList = (props) => { - const { files, fields, linkFiles, title, onClick, className="" } = props - const fileList = (files || []).map(file => - <FileRow - file={file} - fields={fields || defaultFields} - linkFiles - onClick - /> - ) +export const FileList = props => { + const { + files, + fields, sort, title, + linkFiles, onClick, + orderBy='name asc', + className='', + fileListClassName='filelist', + rowClassName='row file' + } = props + const { mapFn, sortFn } = orderByFn(orderBy) + const fileList = (files || []) + .map(mapFn) + .sort(sortFn) + .map(pair => + <FileRow + file={pair[1]} + fields={fieldSet(fields)} + className={rowClassName} + linkFiles + onClick + /> + ) return ( <div className={'rows ' + className}> <div class='row heading'> @@ -25,23 +38,69 @@ export const FileList = (props) => { : <h4>No files</h4>} </div> - <div className={'filelist rows'}> + <div className={'rows ' + fileListClassName}> {fileList} </div> </div> ) } -export const FileRow = (props) => { - const { file, linkFiles, onClick } = props - const fields = props.fields || defaultFields +const numericSort = { + asc: (a,b) => a[0] - b[0], + desc: (a,b) => b[0] - a[0], +} +const stringSort = { + asc: (a,b) => a[0].localeCompare(b[0]), + desc: (a,b) => b[0].localeCompare(a[0]), +} +export const orderByFn = (s='name asc') => { + const [field='name', direction='asc'] = s.split(' ') + let mapFn, sortFn + switch (field) { + case 'epoch': + mapFn = a => [a.epoch || a.epochs, a] + sortFn = numericSort[direction] + break + case 'size': + mapFn = a => [a.size, a] + sortFn = numericSort[direction] + break + case 'date': + mapFn = a => [+new Date(a.date || a.created_at), a] + sortFn = numericSort[direction] + break + case 'name': + default: + mapFn = a => [a.id || a.name, a] + sortFn = stringSort[direction] + break + } + return { mapFn, sortFn } +} + +export const fieldSet = fields => { + if (fields) { + if (fields instanceof Set) { + return fields + } + return new Set(fields.split(' ')) + } + return defaultFields +} + +export const FileRow = props => { + const { file, linkFiles, onClick, className='row file', username='' } = props + const fields = fieldSet(props.fields) + const size = util.hush_size(file.size) - const date = file.created_at - const username = file.username || "" + const date = file.date || file.created_at + return ( - <div class='row file' key={file.name}> + <div class={className} key={file.name}> <div className="filename" title={file.name || file.url}> - {(linkFiles && file.url) + {file.persisted === false + ? <span>{file.name || file.url}</span> + : (linkFiles && file.url) ? <a target='_blank' href={file.url}>{file.name || file.url}</a> : <span class='link' onClick={() => onClick(file)}>{file.name || file.url}</span> } |
