summaryrefslogtreecommitdiff
path: root/app/client/common/fileList.component.js
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2018-06-03 00:13:02 +0200
committerJules Laplace <julescarbon@gmail.com>2018-06-03 00:13:02 +0200
commit2149eb581c35a93d41dbad6e3409c498b4bed804 (patch)
treea4d489ca73b2309654faece1322ea15045c0a8af /app/client/common/fileList.component.js
parentcf6f1c58a7298b0af1c13bb701032017563a6ed8 (diff)
sort files
Diffstat (limited to 'app/client/common/fileList.component.js')
-rw-r--r--app/client/common/fileList.component.js95
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>
}