waibu-db 2.6.1 → 2.7.0
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/extend/bajo/intl/en-US.json +1 -0
- package/extend/bajo/intl/id.json +1 -0
- package/extend/waibuBootstrap/theme/component/widget/btn-columns.js +2 -0
- package/extend/waibuBootstrap/theme/component/widget/btn-delete.js +2 -2
- package/extend/waibuBootstrap/theme/component/widget/table.js +14 -1
- package/lib/method/get-schema-ext.js +2 -1
- package/lib/util.js +5 -1
- package/package.json +1 -1
- package/wiki/CHANGES.md +8 -0
package/extend/bajo/intl/id.json
CHANGED
|
@@ -26,10 +26,12 @@ async function btnColumns () {
|
|
|
26
26
|
let prop = find(schema.properties, { name: f })
|
|
27
27
|
if (!prop) prop = find(schema.view.calcFields, { name: f })
|
|
28
28
|
if (!prop) continue
|
|
29
|
+
/*
|
|
29
30
|
if (f === 'id') {
|
|
30
31
|
items.push(await this.component.buildTag({ tag: 'formCheck', attr: { checked: true, label: req.t('ID'), value: f, disabled: true } }))
|
|
31
32
|
continue
|
|
32
33
|
}
|
|
34
|
+
*/
|
|
33
35
|
const attr = { 'x-model': 'selected', label: req.t(get(schema, `view.label.${f}`, `field.${f}`)), value: f }
|
|
34
36
|
if (fields.includes(f)) attr.checked = true
|
|
35
37
|
items.push(await this.component.buildTag({ tag: 'formCheck', attr }))
|
|
@@ -47,8 +47,8 @@ async function btnDelete () {
|
|
|
47
47
|
ok: '${this.params.attr.id}:remove',
|
|
48
48
|
close: 'y',
|
|
49
49
|
opts: selected,
|
|
50
|
-
theme: '${this
|
|
51
|
-
iconset: '${this
|
|
50
|
+
theme: '${get(this, 'component.theme.name', 'default')}',
|
|
51
|
+
iconset: '${get(this, 'component.iconset.name', 'default')}'
|
|
52
52
|
})
|
|
53
53
|
`
|
|
54
54
|
this.params.html = await this.component.buildTag({ tag: 'btn', attr: this.params.attr, html: this.params.html })
|
|
@@ -4,6 +4,8 @@ async function table () {
|
|
|
4
4
|
const WdbBase = await wdbBase.call(this)
|
|
5
5
|
|
|
6
6
|
return class WdbTable extends WdbBase {
|
|
7
|
+
propValues = {}
|
|
8
|
+
|
|
7
9
|
isRightAligned = (field, schema) => {
|
|
8
10
|
const { get, find } = this.app.lib._
|
|
9
11
|
const prop = find(schema.properties, { name: field })
|
|
@@ -20,13 +22,19 @@ async function table () {
|
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
_defFormatter = async ({ req, key, value, data, schema }) => {
|
|
23
|
-
const { get, find } = this.app.lib._
|
|
25
|
+
const { get, find, camelCase, isEmpty } = this.app.lib._
|
|
24
26
|
const { escape } = this.app.waibu
|
|
25
27
|
const prop = find(schema.properties, { name: key })
|
|
26
28
|
if (!prop) return value
|
|
27
29
|
if (prop.type === 'boolean') {
|
|
28
30
|
value = (await this.component.buildTag({ tag: 'icon', attr: { name: `circle${data[key] ? 'Check' : 'Cross'}` } })) +
|
|
29
31
|
' ' + (req.t(data[key] ? 'Yes' : 'No'))
|
|
32
|
+
} else if (prop.values) {
|
|
33
|
+
const values = typeof prop.values === 'string' ? this.propValues[key] : prop.values
|
|
34
|
+
const item = find(values, { value }) ?? {}
|
|
35
|
+
const ttext = camelCase(`${prop.name} ${item.text}`)
|
|
36
|
+
value = escape(req.format(!isEmpty(item) ? (req.te(ttext) ? req.t(ttext) : item.text) : value, prop.type))
|
|
37
|
+
if (item) value += ` <sup><a href="#" title="${req.t('dataValue')}: ${data[key]}">*</a></sup>`
|
|
30
38
|
} else if (['string', 'text'].includes(prop.type)) {
|
|
31
39
|
if (!get(schema, 'view.noEscape', []).includes(key)) value = escape(value)
|
|
32
40
|
}
|
|
@@ -34,6 +42,7 @@ async function table () {
|
|
|
34
42
|
}
|
|
35
43
|
|
|
36
44
|
build = async () => {
|
|
45
|
+
const { callHandler } = this.app.bajo
|
|
37
46
|
const { req } = this.component
|
|
38
47
|
const { escape, attrToArray } = this.app.waibu
|
|
39
48
|
const { formatRecord } = this.app.waibuDb
|
|
@@ -48,6 +57,10 @@ async function table () {
|
|
|
48
57
|
const fdata = await formatRecord.call(this.plugin, { data, req, schema })
|
|
49
58
|
const filter = get(this, 'component.locals.list.filter', {})
|
|
50
59
|
const count = get(this, 'component.locals.list.count', 0)
|
|
60
|
+
// collect prop.values for later use
|
|
61
|
+
for (const prop of schema.properties) {
|
|
62
|
+
if (typeof prop.values === 'string') this.propValues[prop.name] = await callHandler(prop.values)
|
|
63
|
+
}
|
|
51
64
|
if (count === 0) {
|
|
52
65
|
const alert = '<c:alert color="warning" t:content="noRecordFound" margin="top-4"/>'
|
|
53
66
|
this.params.noTag = true
|
|
@@ -115,7 +115,8 @@ function applyLayout (action, schema, ext) {
|
|
|
115
115
|
}
|
|
116
116
|
if (prop.values) {
|
|
117
117
|
result.component = result.component ?? 'form-select'
|
|
118
|
-
result.attr.options = prop.values
|
|
118
|
+
if (typeof prop.values === 'string') result.attr.options = prop.values
|
|
119
|
+
else result.attr.options = prop.values.map(item => `${item.value}:${item.text}`).join(';')
|
|
119
120
|
}
|
|
120
121
|
if (['string', 'text'].includes(prop.type) && prop.maxLength) set(result, 'attr.maxlength', prop.maxLength)
|
|
121
122
|
if (readonly.includes(f)) result.component = 'form-plaintext'
|
package/lib/util.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export async function prepCrud ({ model, body, id, req, reply, options = {}, args }) {
|
|
2
2
|
const { isSet } = this.app.lib.aneka
|
|
3
|
+
const { importModule } = this.app.bajo
|
|
3
4
|
const { parseFilter } = this.app.waibu
|
|
4
5
|
const { pascalCase } = this.app.lib.aneka
|
|
5
6
|
const { cloneDeep, has, isString } = this.app.lib._
|
|
6
7
|
const { parseObject } = this.app.lib
|
|
8
|
+
const { buildFilterQuery } = await importModule('dobo:/lib/factory/model/_util.js', { asDefaultImport: false })
|
|
9
|
+
|
|
7
10
|
const cfgWeb = this.app.waibu.getConfig()
|
|
8
11
|
const opts = cloneDeep(options)
|
|
9
12
|
const params = this.getParams(req, ...args)
|
|
@@ -37,7 +40,8 @@ export async function prepCrud ({ model, body, id, req, reply, options = {}, arg
|
|
|
37
40
|
|
|
38
41
|
opts.bboxLatField = req.query[cfgWeb.qsKey.bboxLatField]
|
|
39
42
|
opts.bboxLngField = req.query[cfgWeb.qsKey.bboxLngField]
|
|
40
|
-
|
|
43
|
+
let filter = parseFilter(req)
|
|
44
|
+
filter = buildFilterQuery.call(mdl, filter)
|
|
41
45
|
if (options.query) filter.query = cloneDeep(options.query)
|
|
42
46
|
if (options.limit) filter.limit = options.limit
|
|
43
47
|
if (options.sort) filter.sort = options.sort
|
package/package.json
CHANGED
package/wiki/CHANGES.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changes
|
|
2
2
|
|
|
3
|
+
## 2026-02-20
|
|
4
|
+
|
|
5
|
+
- [2.7.0] Update ```WdbBtnColumns``` to allow untick ID field too
|
|
6
|
+
- [2.7.0] Bug fix on theme & iconset resolver
|
|
7
|
+
- [2.7.0] Add capability to set value from ```prop.values``` in ```WdbTable```
|
|
8
|
+
- [2.7.0] Bug fix on query builder
|
|
9
|
+
- [2.7.0] Add capability to handle value from ```prop.values``` in ```getSchemaExt()```
|
|
10
|
+
|
|
3
11
|
## 2026-02-18
|
|
4
12
|
|
|
5
13
|
- [2.6.0] Update attribute functions from ```waibu```
|