bootstrap-vue
Version:
With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens
72 lines (66 loc) • 2.22 kB
JavaScript
import { identity } from '../../../utils/identity'
import { isArray, isFunction, isObject, isString } from '../../../utils/inspect'
import { clone, keys } from '../../../utils/object'
import { startCase } from '../../../utils/string'
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, label: value }
} else if (isFunction(value)) {
// Formatter shortcut
field = { 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 }
}
return field
}
// We normalize fields into an array of objects
// [ { key:..., label:..., ...}, {...}, ..., {..}]
export 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
})
}