Skip to content

Commit

Permalink
Merge pull request GEOLYTIX#1021 from dbauszus-glx/csv-download
Browse files Browse the repository at this point in the history
csvDownload params; toLocaleString
  • Loading branch information
RobAndrewHurst authored Dec 4, 2023
2 parents fb8e699 + 79f9cb4 commit a48f185
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 34 deletions.
13 changes: 1 addition & 12 deletions lib/ui/elements/toolbar_el.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,7 @@ function download_csv(dataview) {
// download_csv is an object with
if (dataview.toolbar.download_csv instanceof Object) {
// Parse data from download_csv.fields
const data = dataview.data.map(record => {
// Check whether string values should be escaped.
return dataview.toolbar.download_csv.fields.map(field => (record[field.field] && field.string) ?
`"${record[field.field].replace(`"`, `\\"`)}"` : record[field.field])
})
// Unshift the header row with either the title or field names.
data.unshift(dataview.toolbar.download_csv.fields.map(field => field.title || field.field))
mapp.utils.csvDownload(data, dataview.toolbar.download_csv)
mapp.utils.csvDownload(dataview.data, dataview.toolbar.download_csv)
return;
}
Expand Down
11 changes: 5 additions & 6 deletions lib/ui/utils/tabulatorUtils.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export default {
date: dateFilter
},
formatter: {
toLocalString,
toLocaleString,
date
},
select,
Expand Down Expand Up @@ -37,8 +37,7 @@ function columns(_this) {
}

// Check for custom formatter in the ui utils.
if (typeof col.formatter === 'string'
&& mapp.ui.utils.tabulator.formatter[col.formatter]) {
if (Object.hasOwn(mapp.ui.utils.tabulator.formatter, col.formatter)) {

// Assign custom formatter from ui utils.
col.formatter =
Expand Down Expand Up @@ -397,15 +396,15 @@ function select(_this, params = {}) {
}
}

function toLocalString(_this) {
function toLocaleString(_this) {

return (cell, formatterParams, onRendered) => {

let val = parseFloat(cell.getValue())

if (isNaN(val)) return;

return val.toLocaleString(formatterParams?.locale || 'en-GB', formatterParams?.options)
return val.toLocaleString(formatterParams?.locale || navigator.language, formatterParams?.options)
}
}

Expand All @@ -417,7 +416,7 @@ function date(_this) {

if (isNaN(val)) return;

let str = new Date(val * 1000).toLocaleString(formatterParams?.locale || 'en-GB', formatterParams?.options)
let str = new Date(val * 1000).toLocaleString(formatterParams?.locale || navigator.language, formatterParams?.options)

return str
}
Expand Down
79 changes: 63 additions & 16 deletions lib/utils/csvDownload.mjs
Original file line number Diff line number Diff line change
@@ -1,24 +1,71 @@
export default function csvDownload(arr, params = {}) {
export default function csvDownload(data, params = {}) {

if (!Array.isArray(arr)) {
console.warn('Array argument for csvDownload must be an array')
return;
if (!Array.isArray(data)) {
console.warn('Array argument for csvDownload must be an array')
return;
}

// Set comma as default separator.
params.separator ??= ','

const rows = data.map(record => {

let row = Array.isArray(params.fields)
? fieldsFunction(record, params.fields)
: Object.values(record)

return row.join(params.separator)
})

// Set default type for the blob.
params.type ??= 'text/csv;charset=utf-8;'

params.join ??= '\r\n'

params.title ??= 'file'

if (params.header && Array.isArray(params.fields)) {

// Unshift the header row with either the title or field names.
rows.unshift(params.fields.map(field => field.title || field.field))
}

const blob = new Blob([rows.join(params.join)], { type: params.type })

const link = document.createElement('a')

link.download = `${params.title}.csv`
link.href = URL.createObjectURL(blob)
link.dataset.downloadurl = ['csv', link.download, link.href].join(':')
link.style.display = 'none'
document.body.append(link)
link.click()
link.remove()
}

function fieldsFunction(record, fields) {

return fields.map(field => {

if (!field.field) return;

// Escape quotes in string value.
if (typeof record[field.field] === 'string' && field.string) {

return `"${record[field.field].replaceAll('"', '\\"')}"`
}

const rows = arr.map(record => {
// Format number toLocaleString
if (field.formatter === 'toLocaleString') {

return Object.values(record).join(',')
})
let val = parseFloat(record[field.field])

const blob = new Blob([rows.join('\r\n')], { type: 'text/csv;charset=utf-8;' })
if (isNaN(val)) return;

return `"${val.toLocaleString(field.locale || navigator.language, field.options)}"`
}

const link = document.createElement('a')
return record[field.field]

link.download = `${params.title || 'file'}.csv`
link.href = URL.createObjectURL(blob)
link.dataset.downloadurl = ['csv', link.download, link.href].join(':')
link.style.display = 'none'
document.body.append(link)
link.click()
link.remove()
})
}

0 comments on commit a48f185

Please sign in to comment.