bootstrap-vue
Version:
BootstrapVue, with over 40 plugins and more than 80 custom components, custom directives, and over 300 icons, provides one of the most comprehensive implementations of Bootstrap v4 components and grid system for Vue.js. With extensive and automated WAI-AR
74 lines (67 loc) • 2.25 kB
JavaScript
import identity from '../../../utils/identity'
import startCase from '../../../utils/startcase'
import { isArray, isFunction, isObject, isString } from '../../../utils/inspect'
import { clone, keys } from '../../../utils/object'
import { IGNORED_FIELD_KEYS } from './constants'
// Private function to massage field entry into common object format
const processField = (key, value) => {
let field = null
if (isString(value)) {
// Label shortcut
field = { key: key, label: value }
} else if (isFunction(value)) {
// Formatter shortcut
field = { key: key, formatter: value }
} else if (isObject(value)) {
field = clone(value)
field.key = field.key || key
} else if (value !== false) {
// Fallback to just key
/* istanbul ignore next */
field = { key: key }
}
return field
}
// We normalize fields into an array of objects
// [ { key:..., label:..., ...}, {...}, ..., {..}]
const normalizeFields = (origFields, items) => {
const fields = []
if (isArray(origFields)) {
// Normalize array Form
origFields.filter(identity).forEach(f => {
if (isString(f)) {
fields.push({ key: f, label: startCase(f) })
} else if (isObject(f) && f.key && isString(f.key)) {
// Full object definition. We use assign so that we don't mutate the original
fields.push(clone(f))
} else if (isObject(f) && keys(f).length === 1) {
// Shortcut object (i.e. { 'foo_bar': 'This is Foo Bar' }
const key = keys(f)[0]
const field = processField(key, f[key])
if (field) {
fields.push(field)
}
}
})
}
// If no field provided, take a sample from first record (if exits)
if (fields.length === 0 && isArray(items) && items.length > 0) {
const sample = items[0]
keys(sample).forEach(k => {
if (!IGNORED_FIELD_KEYS[k]) {
fields.push({ key: k, label: startCase(k) })
}
})
}
// Ensure we have a unique array of fields and that they have String labels
const memo = {}
return fields.filter(f => {
if (!memo[f.key]) {
memo[f.key] = true
f.label = isString(f.label) ? f.label : startCase(f.key)
return true
}
return false
})
}
export default normalizeFields