waibu-db 1.1.12 → 1.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
async function formatRow ({ data, req, component, schema, options = {} }) {
|
|
2
|
+
const { get, find, isFunction, cloneDeep } = this.lib._
|
|
3
|
+
const { format, callHandler } = this.app.bajo
|
|
4
|
+
const fields = get(schema, 'view.fields', Object.keys(schema.properties))
|
|
5
|
+
const rec = cloneDeep(data)
|
|
6
|
+
for (const f of fields) {
|
|
7
|
+
if (f === '_rel') continue
|
|
8
|
+
let prop = find(schema.properties, { name: f })
|
|
9
|
+
if (!prop) prop = find(schema.view.calcFields, { name: f })
|
|
10
|
+
if (!prop) continue
|
|
11
|
+
const opts = {
|
|
12
|
+
lang: options.lang ?? (req ? req.lang : undefined),
|
|
13
|
+
longitude: ['lng', 'longitude'].includes(f),
|
|
14
|
+
latitude: ['lat', 'latitude'].includes(f),
|
|
15
|
+
speed: ['speed'].includes(f),
|
|
16
|
+
degree: ['course', 'heading'].includes(f),
|
|
17
|
+
distance: ['distance'].includes(f)
|
|
18
|
+
}
|
|
19
|
+
rec[f] = format(data[f], prop.type, opts)
|
|
20
|
+
const vf = get(schema, `view.valueFormatter.${f}`)
|
|
21
|
+
if (vf) {
|
|
22
|
+
if (isFunction(vf)) rec[f] = await vf.call(req ?? this, data[f], data)
|
|
23
|
+
else rec[f] = await callHandler(vf, req, data[f], data)
|
|
24
|
+
}
|
|
25
|
+
const formatter = get(schema, `view.formatter.${f}`)
|
|
26
|
+
if (formatter && component) {
|
|
27
|
+
if (isFunction(formatter)) rec[f] = await formatter.call(req ?? this, data[f], data)
|
|
28
|
+
else rec[f] = await callHandler(formatter, req, data[f], data)
|
|
29
|
+
rec[f] = await component.buildSentence(rec[f])
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return rec
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function formatRecord ({ data, req, schema, component, options = {} }) {
|
|
36
|
+
const { isArray } = this.lib._
|
|
37
|
+
if (!isArray(data)) return await formatRow.call(this, { data, req, schema, component, options })
|
|
38
|
+
const items = []
|
|
39
|
+
for (const d of data) {
|
|
40
|
+
const item = await formatRow.call(this, { data: d, req, schema, component, options })
|
|
41
|
+
items.push(item)
|
|
42
|
+
}
|
|
43
|
+
return items
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default formatRecord
|
|
@@ -2,36 +2,12 @@ import path from 'path'
|
|
|
2
2
|
|
|
3
3
|
const defReadonly = ['id', 'createdAt', 'updatedAt']
|
|
4
4
|
|
|
5
|
-
const defFormatter = {
|
|
6
|
-
lat: function (val, rec) {
|
|
7
|
-
const format = this.format ?? this.app.bajo.format
|
|
8
|
-
return format(val, 'double', { latitude: true })
|
|
9
|
-
},
|
|
10
|
-
lng: function (val, rec) {
|
|
11
|
-
const format = this.format ?? this.app.bajo.format
|
|
12
|
-
return format(val, 'double', { longitude: true })
|
|
13
|
-
},
|
|
14
|
-
speed: function (val, rec) {
|
|
15
|
-
const format = this.format ?? this.app.bajo.format
|
|
16
|
-
return format(val, 'float', { speed: true, withType: true })
|
|
17
|
-
},
|
|
18
|
-
course: function (val, rec) {
|
|
19
|
-
const format = this.format ?? this.app.bajo.format
|
|
20
|
-
return format(val, 'float', { degree: true })
|
|
21
|
-
},
|
|
22
|
-
heading: function (val, rec) {
|
|
23
|
-
const format = this.format ?? this.app.bajo.format
|
|
24
|
-
return format(val, 'float', { degree: true })
|
|
25
|
-
},
|
|
26
|
-
distance: function (val, rec) {
|
|
27
|
-
const format = this.format ?? this.app.bajo.format
|
|
28
|
-
return format(val, 'float', { distance: true })
|
|
29
|
-
}
|
|
30
|
-
}
|
|
5
|
+
const defFormatter = {}
|
|
31
6
|
|
|
32
7
|
function getCommons (action, schema, ext, opts = {}) {
|
|
33
8
|
const { merge, map, get, set, without, uniq } = this.lib._
|
|
34
9
|
const calcFields = get(ext, `view.${action}.calcFields`, get(ext, 'common.calcFields', []))
|
|
10
|
+
const noEscape = get(ext, `view.${action}.noEscape`, get(ext, 'common.noEscape', []))
|
|
35
11
|
const valueFormatter = get(ext, `view.${action}.valueFormatter`, get(ext, 'common.valueFormatter', {}))
|
|
36
12
|
const formatter = get(ext, `view.${action}.formatter`, get(ext, 'common.formatter', {}))
|
|
37
13
|
const label = get(ext, `view.${action}.label`, get(ext, 'common.label', {}))
|
|
@@ -44,6 +20,7 @@ function getCommons (action, schema, ext, opts = {}) {
|
|
|
44
20
|
const allFields = without(map(schema.properties, 'name'), ...hidden)
|
|
45
21
|
const forFields = get(ext, `view.${action}.fields`, get(ext, 'common.fields', allFields))
|
|
46
22
|
set(schema, 'view.calcFields', calcFields)
|
|
23
|
+
set(schema, 'view.noEscape', noEscape)
|
|
47
24
|
set(schema, 'view.valueFormatter', valueFormatter)
|
|
48
25
|
set(schema, 'view.formatter', merge({}, defFormatter, formatter))
|
|
49
26
|
set(schema, 'view.stat.aggregate', aggregate)
|
|
@@ -21,15 +21,17 @@ async function table () {
|
|
|
21
21
|
|
|
22
22
|
build = async () => {
|
|
23
23
|
const { req } = this.component
|
|
24
|
-
const { callHandler } = this.plugin.app.bajo
|
|
25
24
|
const { escape } = this.plugin.app.waibu
|
|
25
|
+
const { formatRecord } = this.plugin.app.waibuDb
|
|
26
26
|
const { attrToArray, groupAttrs } = this.plugin.app.waibuMpa
|
|
27
|
-
const { get, omit, set, find, isEmpty, without,
|
|
27
|
+
const { get, omit, set, find, isEmpty, without, merge } = this.plugin.app.bajo.lib._
|
|
28
28
|
const group = groupAttrs(this.params.attr, ['body', 'head', 'foot'])
|
|
29
29
|
this.params.attr = group._
|
|
30
30
|
const prettyUrl = this.params.attr.prettyUrl
|
|
31
31
|
|
|
32
|
+
const schema = get(this, 'component.locals.schema', {})
|
|
32
33
|
const data = get(this, 'component.locals.list.data', [])
|
|
34
|
+
const fdata = await formatRecord.call(this.plugin, { data, req, schema, component: this.component })
|
|
33
35
|
const filter = get(this, 'component.locals.list.filter', {})
|
|
34
36
|
const count = get(this, 'component.locals.list.count', 0)
|
|
35
37
|
if (count === 0) {
|
|
@@ -38,7 +40,6 @@ async function table () {
|
|
|
38
40
|
this.params.html = await this.component.buildSentence(alert)
|
|
39
41
|
return
|
|
40
42
|
}
|
|
41
|
-
const schema = get(this, 'component.locals.schema', {})
|
|
42
43
|
const disableds = get(schema, 'view.disabled', [])
|
|
43
44
|
if (disableds.includes('find')) {
|
|
44
45
|
this.params.html = ''
|
|
@@ -49,7 +50,7 @@ async function table () {
|
|
|
49
50
|
if (isEmpty(fields)) fields = schema.view.fields
|
|
50
51
|
if (!isEmpty(schema.view.hidden)) fields = without(fields, ...schema.view.hidden)
|
|
51
52
|
let sort = this.params.attr.sort ? attrToArray(this.params.attr.sort) : get(this, `component.locals._meta.query.${qsKey.sort}`, '')
|
|
52
|
-
if (isEmpty(sort)) {
|
|
53
|
+
if (isEmpty(sort) && filter.sort) {
|
|
53
54
|
const keys = Object.keys(filter.sort)
|
|
54
55
|
if (keys.length > 0) sort = `${keys[0]}:${filter.sort[keys[0]]}`
|
|
55
56
|
}
|
|
@@ -112,7 +113,9 @@ async function table () {
|
|
|
112
113
|
html.push(await this.component.buildTag({ tag: 'thead', attr: group.head, html: header }))
|
|
113
114
|
// body
|
|
114
115
|
items = []
|
|
115
|
-
for (const
|
|
116
|
+
for (const idx in data) {
|
|
117
|
+
const d = data[idx]
|
|
118
|
+
const fd = fdata[idx]
|
|
116
119
|
const lines = []
|
|
117
120
|
if (selection) {
|
|
118
121
|
const tag = selection === 'single' ? 'formRadio' : 'formCheck'
|
|
@@ -127,20 +130,17 @@ async function table () {
|
|
|
127
130
|
if (!prop) prop = find(schema.view.calcFields, { name: f })
|
|
128
131
|
if (!prop) continue
|
|
129
132
|
let dataValue = d[f] ?? ''
|
|
130
|
-
if (
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
if (!isEmpty(dataValue)) {
|
|
134
|
+
if (['datetime'].includes(prop.type)) dataValue = escape(dataValue.toISOString())
|
|
135
|
+
if (['string', 'text'].includes(prop.type)) dataValue = escape(dataValue)
|
|
136
|
+
if (['array', 'object'].includes(prop.type)) dataValue = escape(JSON.stringify(d[f]))
|
|
137
|
+
}
|
|
138
|
+
let value = fd[f]
|
|
135
139
|
if (prop.type === 'boolean') {
|
|
136
140
|
value = (await this.component.buildTag({ tag: 'icon', attr: { name: `circle${d[f] ? 'Check' : ''}` } })) +
|
|
137
141
|
' ' + (req.t(d[f] ? 'Yes' : 'No'))
|
|
138
|
-
} else
|
|
139
|
-
|
|
140
|
-
if (vf) {
|
|
141
|
-
if (isFunction(vf)) dataValue = escape(await vf.call(req, d[f], d))
|
|
142
|
-
else dataValue = await callHandler(vf, req, d[f], d)
|
|
143
|
-
value = dataValue
|
|
142
|
+
} else {
|
|
143
|
+
if (!get(schema, 'view.noEscape', []).includes(f)) value = escape(value)
|
|
144
144
|
}
|
|
145
145
|
const attr = { dataValue, dataKey: prop.name, dataType: prop.type }
|
|
146
146
|
if (!disableds.includes('get')) attr.style = { cursor: 'pointer' }
|
|
@@ -154,12 +154,6 @@ async function table () {
|
|
|
154
154
|
const item = find(lookup.values, set({}, lookup.id ?? 'id', d[f]))
|
|
155
155
|
if (item) value = req.t(item[lookup.field ?? 'name'])
|
|
156
156
|
}
|
|
157
|
-
const formatter = get(schema, `view.formatter.${f}`)
|
|
158
|
-
if (formatter) {
|
|
159
|
-
if (isFunction(formatter)) value = await formatter.call(req, d[f], d)
|
|
160
|
-
else value = await callHandler(formatter, req, d[f], d)
|
|
161
|
-
value = await this.component.buildSentence(value)
|
|
162
|
-
}
|
|
163
157
|
const line = await this.component.buildTag({ tag: 'td', attr, html: value })
|
|
164
158
|
lines.push(line)
|
|
165
159
|
}
|