waibu-bootstrap 1.1.5 → 1.1.7
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 +1 -1
- package/plugin/factory.js +21 -0
- package/waibuMpa/theme/component/factory/accordion-item.js +6 -5
- package/waibuMpa/theme/component/factory/app-launcher-trigger.js +13 -8
- package/waibuMpa/theme/component/factory/app-launcher.js +45 -19
- package/waibuMpa/theme/component/factory/card.js +1 -0
- package/waibuMpa/theme/component/factory/form-date.js +3 -6
- package/waibuMpa/theme/component/factory/form-datetime.js +3 -6
- package/waibuMpa/theme/component/factory/form-select-ext.js +0 -9
- package/waibuMpa/theme/component/factory/form-time.js +3 -6
- package/waibuMpa/theme/component/factory/list-item.js +1 -1
- package/waibuMpa/theme/component/factory/nav-dropdown-darkmode.js +4 -7
- package/waibuMpa/theme/component/factory/nav-dropdown-language.js +5 -8
- package/waibuMpa/theme/component/factory/nav-dropdown-setting.js +3 -3
- package/waibuMpa/theme/component/factory/nav-dropdown-user.js +9 -13
- package/waibuMpa/theme/component/factory/nav-item.js +1 -1
- package/waibuMpa/theme/component/factory/nav-toggle-fullscreen.js +6 -10
- package/waibuMpa/theme/component/method/after-build-tag/_lib.js +1 -1
- package/waibuStatic/asset/js/wbs.js +3 -2
- package/plugin/.alias +0 -1
- package/plugin/.dependencies +0 -2
- package/plugin/config.json +0 -8
package/package.json
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
async function factory (pkgName) {
|
|
2
|
+
const me = this
|
|
3
|
+
|
|
4
|
+
return class WaibuBootstrap extends this.lib.BajoPlugin {
|
|
5
|
+
constructor () {
|
|
6
|
+
super(pkgName, me.app)
|
|
7
|
+
this.alias = 'wbs'
|
|
8
|
+
this.dependencies = ['waibu-mpa', 'waibu-extra']
|
|
9
|
+
this.config = {
|
|
10
|
+
waibu: {
|
|
11
|
+
prefix: 'bootstrap'
|
|
12
|
+
},
|
|
13
|
+
siteSetting: {
|
|
14
|
+
toastAutohideDelayDur: '5s'
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default factory
|
|
@@ -11,21 +11,22 @@ async function accordionItem () {
|
|
|
11
11
|
|
|
12
12
|
build = async () => {
|
|
13
13
|
const { omit, without } = this.plugin.lib._
|
|
14
|
-
const { groupAttrs } = this.plugin.app.waibuMpa
|
|
15
|
-
const group = groupAttrs(this.params.attr, ['body'])
|
|
14
|
+
const { groupAttrs, attribsStringify } = this.plugin.app.waibuMpa
|
|
15
|
+
const group = groupAttrs(this.params.attr, ['body', 'header'])
|
|
16
16
|
if (!group.body.noPadding) group.body.class.push('accordion-body')
|
|
17
17
|
const clsList = without(this.params.attr.class, cls)
|
|
18
|
-
|
|
18
|
+
group.header.class.push('accordion-header')
|
|
19
|
+
const header = [`<c:h2 ${attribsStringify(group.header)}>`,
|
|
19
20
|
`<button class="${this.params.attr.narrowHeader ? 'px-3 py-2 ' : ''}accordion-button${this.params.attr.showOnStart ? '' : ' collapsed'}"`,
|
|
20
21
|
`type="button" data-bs-toggle="collapse" data-bs-target="#${this.params.attr.id}"`,
|
|
21
22
|
`aria-expanded="${this.params.attr.showOnStart}"`,
|
|
22
23
|
'x-data',
|
|
23
24
|
`@click="$dispatch('accordion-item', { id: $el.closest('.accordion').id, cls: '${clsList.join(' ')}' })"`,
|
|
24
|
-
`aria-controls="${this.params.attr.id}">${this.params.attr.header}</button></h2>`]
|
|
25
|
+
`aria-controls="${this.params.attr.id}">${this.params.attr.header}</button></c:h2>`]
|
|
25
26
|
const body = await this.component.buildTag({ tag: 'div', attr: group.body, html: this.params.html })
|
|
26
27
|
const details = [`<div id="${this.params.attr.id}" class="accordion-collapse collapse${this.params.attr.showOnStart ? ' show' : ''}">`,
|
|
27
28
|
body, '</div']
|
|
28
|
-
this.params.html = `${header.join(' ')}\n${details.join(' ')}`
|
|
29
|
+
this.params.html = await this.component.buildSentence(`${header.join(' ')}\n${details.join(' ')}`)
|
|
29
30
|
this.params.attr = omit(this.params.attr, ['id', 'noPadding', 'narrowHeader', 'bodyClass'])
|
|
30
31
|
}
|
|
31
32
|
}
|
|
@@ -21,19 +21,24 @@ async function appLauncherTrigger () {
|
|
|
21
21
|
|
|
22
22
|
build = async () => {
|
|
23
23
|
const { fastGlob } = this.plugin.lib
|
|
24
|
-
const {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
const { groupAttrs, attribsStringify } = this.plugin.app.waibuMpa
|
|
25
|
+
const group = groupAttrs(this.params.attr, ['img'])
|
|
26
|
+
this.params.attr = group._
|
|
27
|
+
let src = group.img.src
|
|
28
|
+
if (!src) {
|
|
29
|
+
let logo = 'waibu'
|
|
30
|
+
const files = await fastGlob(`${this.plugin.app.main.dir.pkg}/plugin/logo.*`)
|
|
31
|
+
if (files.length > 0) logo = 'main'
|
|
32
|
+
src = `waibuMpa:/logo/${logo}`
|
|
33
|
+
}
|
|
28
34
|
this.params.tag = 'a'
|
|
29
35
|
const sentence = [
|
|
30
|
-
`<c:img src="
|
|
31
|
-
`width="${
|
|
36
|
+
`<c:img src="${src}"`,
|
|
37
|
+
`width="${group.img.dimWidth}" height="${group.img.dimHeight}"`
|
|
32
38
|
]
|
|
33
|
-
if (
|
|
39
|
+
if (group.img.style) sentence.push(`style="${attribsStringify(group.img.style)}"`)
|
|
34
40
|
sentence.push('/>')
|
|
35
41
|
this.params.html = await this.component.buildSentence(sentence)
|
|
36
|
-
this.params.attr = omit(this.params.attr, ['imgDimHeight', 'imgDimWidth', 'imgStyle'])
|
|
37
42
|
}
|
|
38
43
|
}
|
|
39
44
|
}
|
|
@@ -10,34 +10,60 @@ async function appLauncher () {
|
|
|
10
10
|
|
|
11
11
|
build = async () => {
|
|
12
12
|
const { groupAttrs, attrToArray } = this.plugin.app.waibuMpa
|
|
13
|
+
const menu = this.params.attr.menu ?? 'pages'
|
|
13
14
|
const group = groupAttrs(this.params.attr, ['trigger'])
|
|
14
|
-
let launcher = `<c:drawer id="${this.params.attr.id}" t:title="Modules" no-padding>\n`
|
|
15
|
-
launcher += '<c:div padding="start-3 bottom-3 end-3">'
|
|
15
|
+
let launcher = `<c:drawer id="${this.params.attr.id}" t:title="Modules" no-padding style="${menu === 'pages' ? 'width:350px' : ''}">\n`
|
|
16
16
|
if (this.params.attr.type === 'modal') launcher = `<c:modal id="${this.params.attr.id}" t:title="Modules" centered>\n`
|
|
17
17
|
const toolbar = attrToArray(this.params.attr.toolbar)
|
|
18
18
|
if (toolbar.length > 0) {
|
|
19
|
-
|
|
19
|
+
if (menu === 'pages') toolbar.unshift('home')
|
|
20
|
+
launcher += `<c:div padding="x-3 ${menu === 'home' ? 'bottom-3' : ''}">`
|
|
21
|
+
launcher += '<c:navbar padding="y-0">\n<c:nav tag="ul" dim="width:100" flex="justify-content:end">\n'
|
|
20
22
|
for (const t of toolbar) {
|
|
21
|
-
if (t === '
|
|
23
|
+
if (t === 'home') launcher += '<c:nav-item href="/" icon="house" padding="end-2" />\n'
|
|
24
|
+
if (t === 'user') launcher += '<c:nav-dropdown-user padding="end-2" />\n'
|
|
22
25
|
if (t === '-') launcher += '<c:nav-divider />\n'
|
|
23
|
-
if (t === 'fullscreen') launcher += '<c:nav-toggle-fullscreen />\n'
|
|
24
|
-
if (t === 'darkmode') launcher += '<c:nav-dropdown-darkmode dropdown-
|
|
25
|
-
if (t === 'language') launcher += '<c:nav-dropdown-language dropdown-
|
|
26
|
+
if (t === 'fullscreen') launcher += '<c:nav-toggle-fullscreen padding="end-2" />\n'
|
|
27
|
+
if (t === 'darkmode') launcher += '<c:nav-dropdown-darkmode padding="end-2" dropdown-menudir="end" />\n'
|
|
28
|
+
if (t === 'language') launcher += '<c:nav-dropdown-language padding="end-2" dropdown-menudir="end" />\n'
|
|
26
29
|
}
|
|
27
|
-
launcher += '</c:nav></c:navbar>\n'
|
|
30
|
+
launcher += '</c:nav></c:navbar></c:div>\n'
|
|
28
31
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
launcher +=
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
const items = this.component.locals.menu[menu] ?? []
|
|
33
|
+
if (menu === 'pages') {
|
|
34
|
+
launcher += '<c:hr margin="all-0" /><c:accordion no-border>\n'
|
|
35
|
+
for (const m of items) {
|
|
36
|
+
const sm = []
|
|
37
|
+
if (!m.children) continue
|
|
38
|
+
for (const s of m.children) {
|
|
39
|
+
if (s.visible === 'anon' && this.component.locals._meta.user) continue
|
|
40
|
+
if (s.visible === 'auth' && !this.component.locals._meta.user) continue
|
|
41
|
+
if (s.title === '-') continue
|
|
42
|
+
sm.push(`<c:list-item href="${s.href}" t:content="${s.title}" style="padding-left:1.2rem"/>`)
|
|
43
|
+
}
|
|
44
|
+
launcher += `
|
|
45
|
+
<c:accordion-item t:header="${m.title}" body-no-padding header-font="weight:bold">\n
|
|
46
|
+
<c:list type="group" hover no-border>\n
|
|
47
|
+
${sm.join('\n')}\n
|
|
48
|
+
</c:list>\n
|
|
49
|
+
</c:accordion-item>\n
|
|
50
|
+
`
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
launcher += '<c:div padding="start-3 bottom-3 end-3">'
|
|
54
|
+
launcher += '<c:grid-row gutter="1">\n'
|
|
55
|
+
for (const m of items) {
|
|
56
|
+
launcher += `
|
|
57
|
+
<c:grid-col col="4" text="align:center">
|
|
58
|
+
<c:a href="${m.href}" display="type:block" border rounded padding="all-2" text="decoration:none">
|
|
59
|
+
<c:img src="waibuMpa:/logo/${m.ns}" class="app-launcher-img" height="60" fluid/>
|
|
60
|
+
<c:div margin="top-2">${m.title}</c:div>
|
|
61
|
+
</c:a>
|
|
62
|
+
</c:grid-col>
|
|
63
|
+
`
|
|
64
|
+
}
|
|
65
|
+
launcher += '</c:grid-row></c:div>\n'
|
|
39
66
|
}
|
|
40
|
-
launcher += '</c:grid-row>\n'
|
|
41
67
|
if (this.params.attr.type === 'modal') launcher += '</c:modal>'
|
|
42
68
|
else launcher += '</c:div></c:drawer>'
|
|
43
69
|
let trigger = ''
|
|
@@ -2,12 +2,9 @@ import { css, scripts, inlineScript, handler } from './form-datetime.js'
|
|
|
2
2
|
|
|
3
3
|
async function formDate () {
|
|
4
4
|
return class FormDate extends this.baseFactory {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
this.scripts = scripts
|
|
9
|
-
this.inlineScript = inlineScript
|
|
10
|
-
}
|
|
5
|
+
static css = [...super.css, ...css]
|
|
6
|
+
static scripts = [...super.scripts, ...scripts(this.component.req)]
|
|
7
|
+
static inlineScript = inlineScript(this.component.req)
|
|
11
8
|
|
|
12
9
|
build = async () => {
|
|
13
10
|
const { set } = this.plugin.lib._
|
|
@@ -60,12 +60,9 @@ export async function handler (opts, params = {}) {
|
|
|
60
60
|
|
|
61
61
|
async function formDatetime () {
|
|
62
62
|
return class FormDatetime extends this.baseFactory {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
this.scripts = scripts
|
|
67
|
-
this.inlineScript = inlineScript
|
|
68
|
-
}
|
|
63
|
+
static css = [...super.css, ...css]
|
|
64
|
+
static scripts = [...super.scripts, ...scripts(this.component.req)]
|
|
65
|
+
static inlineScript = inlineScript(this.component.req)
|
|
69
66
|
|
|
70
67
|
build = async () => {
|
|
71
68
|
const { set } = this.plugin.lib._
|
|
@@ -21,18 +21,9 @@ export const scripts = 'waibuExtra.virtual:/tom-select/js/tom-select.complete.mi
|
|
|
21
21
|
async function formSelectExt () {
|
|
22
22
|
return class FormSelectExt extends this.baseFactory {
|
|
23
23
|
static css = [...super.css, css]
|
|
24
|
-
|
|
25
24
|
static scripts = [...super.scripts, scripts]
|
|
26
|
-
|
|
27
25
|
static inlineCss = inlineCss
|
|
28
26
|
|
|
29
|
-
constructor (options) {
|
|
30
|
-
super(options)
|
|
31
|
-
this.css = css
|
|
32
|
-
this.inlineCss = inlineCss
|
|
33
|
-
this.scripts = scripts
|
|
34
|
-
}
|
|
35
|
-
|
|
36
27
|
build = async () => {
|
|
37
28
|
const { omit } = this.plugin.lib._
|
|
38
29
|
const { jsonStringify, base64JsonDecode } = this.plugin.app.waibuMpa
|
|
@@ -2,12 +2,9 @@ import { css, scripts, inlineScript, handler } from './form-datetime.js'
|
|
|
2
2
|
|
|
3
3
|
async function formTime () {
|
|
4
4
|
return class FormTime extends this.baseFactory {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
this.inlineScript = inlineScript
|
|
9
|
-
this.scripts = scripts
|
|
10
|
-
}
|
|
5
|
+
static css = [...super.css, ...css]
|
|
6
|
+
static scripts = [...super.scripts, ...scripts(this.component.req)]
|
|
7
|
+
static inlineScript = inlineScript(this.component.req)
|
|
11
8
|
|
|
12
9
|
build = async () => {
|
|
13
10
|
const { set } = this.plugin.lib._
|
|
@@ -20,7 +20,7 @@ async function listItem () {
|
|
|
20
20
|
}
|
|
21
21
|
if (isString(this.params.attr.target) && !this.params.attr.href) this.params.attr.href = '#'
|
|
22
22
|
if (this.params.attr.href) {
|
|
23
|
-
const attr =
|
|
23
|
+
const attr = this.params.attr
|
|
24
24
|
const html = this.params.html
|
|
25
25
|
if (isString(this.params.attr.target)) {
|
|
26
26
|
const [id, toggle = 'modal'] = this.params.attr.target.split(':')
|
|
@@ -2,7 +2,7 @@ async function navDropdownDarkmode () {
|
|
|
2
2
|
return class NavDropdownDarkmode extends this.baseFactory {
|
|
3
3
|
build = async () => {
|
|
4
4
|
const { titleize, isSet } = this.plugin.app.bajo
|
|
5
|
-
const { set } = this.plugin.lib._
|
|
5
|
+
const { set, omit } = this.plugin.lib._
|
|
6
6
|
const cfgWmpa = this.plugin.app.waibuMpa.config
|
|
7
7
|
this.params.noTag = true
|
|
8
8
|
if (isSet(this.plugin.app.waibuMpa.config.darkMode.set)) {
|
|
@@ -11,12 +11,9 @@ async function navDropdownDarkmode () {
|
|
|
11
11
|
}
|
|
12
12
|
const name = this.component.req.darkMode ? 'dark' : 'bright'
|
|
13
13
|
const content = this.component.req.iconset ? await this.component.buildTag({ tag: 'icon', attr: { name } }) : this.component.req.t(titleize(name))
|
|
14
|
-
const attr =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
dropdownMenudir: this.params.attr.dropdownMenudir,
|
|
18
|
-
content
|
|
19
|
-
}
|
|
14
|
+
const attr = omit(this.params.attr, ['text'])
|
|
15
|
+
attr.dropdown = true
|
|
16
|
+
attr.content = content
|
|
20
17
|
if (this.params.attr.text) attr.text = this.params.attr.text
|
|
21
18
|
const html = [
|
|
22
19
|
await this.component.buildTag({ tag: 'dropdownItem', attr: { href: this.component.buildUrl({ params: set({}, cfgWmpa.darkMode.qsKey, 'false') }), active: !this.component.req.darkMode }, html: this.component.req.t('brightMode') }),
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
async function navDropdownLanguage () {
|
|
2
2
|
return class NavDropdownLanguage extends this.baseFactory {
|
|
3
3
|
build = async () => {
|
|
4
|
-
const { camelCase } = this.plugin.lib._
|
|
4
|
+
const { camelCase, cloneDeep, omit } = this.plugin.lib._
|
|
5
5
|
const { supported } = this.plugin.app.bajo.config.intl
|
|
6
6
|
const lang = this.component.req.lang
|
|
7
|
-
const attr =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
content: lang.toUpperCase()
|
|
12
|
-
}
|
|
13
|
-
if (this.params.attr.text) attr.text = this.params.attr.text
|
|
7
|
+
const attr = cloneDeep(this.params.attr)
|
|
8
|
+
this.params.attr = omit(this.params.attr, ['text'])
|
|
9
|
+
attr.dropdown = true
|
|
10
|
+
attr.content = lang.toUpperCase()
|
|
14
11
|
const html = []
|
|
15
12
|
for (const s of supported) {
|
|
16
13
|
html.push(await this.component.buildTag({
|
|
@@ -16,13 +16,13 @@ async function navDropdownSetting () {
|
|
|
16
16
|
this.params.attr.dropdown = true
|
|
17
17
|
this.params.attr.content = icon
|
|
18
18
|
let profile = `
|
|
19
|
-
<c:dropdown-item href="sumba:/
|
|
20
|
-
<c:dropdown-item href="sumba:/
|
|
19
|
+
<c:dropdown-item href="sumba:/your-stuff/profile" t:content="yourProfile" />
|
|
20
|
+
<c:dropdown-item href="sumba:/your-stuff/change-password" t:content="changePassword" />
|
|
21
21
|
`
|
|
22
22
|
if (this.params.attr.fancyProfile) {
|
|
23
23
|
profile = await this.component.buildSentence(`
|
|
24
24
|
<div>
|
|
25
|
-
<c:dropdown-item href="sumba:/
|
|
25
|
+
<c:dropdown-item href="sumba:/your-stuff/profile">
|
|
26
26
|
<c:img src="dobo:/attachment/SumbaUser/${req.user.id}/profile/main.png" responsive rounded />
|
|
27
27
|
<c:div margin="top-1">${req.user.firstName} ${req.user.lastName}</c:div>
|
|
28
28
|
</c:dropdown-item>
|
|
@@ -6,7 +6,7 @@ async function navDropdownUser () {
|
|
|
6
6
|
this.params.html = ''
|
|
7
7
|
return
|
|
8
8
|
}
|
|
9
|
-
const { has } = this.plugin.lib._
|
|
9
|
+
const { has, omit } = this.plugin.lib._
|
|
10
10
|
const { routePath } = this.plugin.app.waibu
|
|
11
11
|
const { req } = this.component
|
|
12
12
|
const icon = this.component.req.iconset ? await this.component.buildTag({ tag: 'icon', attr: { name: 'person' } }) : ''
|
|
@@ -19,24 +19,20 @@ async function navDropdownUser () {
|
|
|
19
19
|
} else text = req.t('guest')
|
|
20
20
|
}
|
|
21
21
|
const html = []
|
|
22
|
-
const attr =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
dropdownMenudir: this.params.attr.dropdownMenudir,
|
|
26
|
-
content: `${icon} ${text}`
|
|
27
|
-
}
|
|
28
|
-
if (this.params.attr.text) attr.text = this.params.attr.text
|
|
22
|
+
const attr = omit(this.params.attr, ['text'])
|
|
23
|
+
attr.dropdown = true
|
|
24
|
+
attr.content = `${icon} ${text}`
|
|
29
25
|
if (this.params.attr.noMenu) {
|
|
30
26
|
delete attr.dropdown
|
|
31
27
|
delete attr.dropdownMenu
|
|
32
|
-
attr.href = routePath(this.component.req.user ? 'sumba:/
|
|
28
|
+
attr.href = routePath(this.component.req.user ? 'sumba:/your-stuff/profile' : 'sumba:/signin')
|
|
33
29
|
} else {
|
|
34
30
|
if (req.user) {
|
|
35
31
|
if (this.params.attr.fancyProfile) {
|
|
36
32
|
const replacer = 'sumba.asset:/user-profile.png'
|
|
37
33
|
const profile = await this.component.buildSentence(`
|
|
38
34
|
<div>
|
|
39
|
-
<c:dropdown-item href="sumba:/
|
|
35
|
+
<c:dropdown-item href="sumba:/your-stuff/profile">
|
|
40
36
|
<c:img src="dobo:/attachment/SumbaUser/${req.user.id}/profile/main.png?notfound=${replacer}" responsive rounded />
|
|
41
37
|
<c:div margin="top-1" text="align:center">${req.user.firstName} ${req.user.lastName}</c:div>
|
|
42
38
|
</c:dropdown-item>
|
|
@@ -44,11 +40,11 @@ async function navDropdownUser () {
|
|
|
44
40
|
`)
|
|
45
41
|
html.push(profile)
|
|
46
42
|
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { divider: true } }))
|
|
47
|
-
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/
|
|
43
|
+
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/your-stuff/change-password') }, html: this.component.req.t('changePassword') }))
|
|
48
44
|
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/signout') }, html: this.component.req.t('signout') }))
|
|
49
45
|
} else {
|
|
50
|
-
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/
|
|
51
|
-
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/
|
|
46
|
+
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/your-stuff/profile') }, html: this.component.req.t('yourProfile') }))
|
|
47
|
+
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/your-stuff/change-password') }, html: this.component.req.t('changePassword') }))
|
|
52
48
|
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { divider: true } }))
|
|
53
49
|
html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/signout') }, html: this.component.req.t('signout') }))
|
|
54
50
|
}
|
|
@@ -14,8 +14,8 @@ async function navItem () {
|
|
|
14
14
|
const { groupAttrs } = this.plugin.app.waibuMpa
|
|
15
15
|
const { $ } = this.component
|
|
16
16
|
const group = groupAttrs(this.params.attr, ['dropdown', 'badge'])
|
|
17
|
+
this.params.attr = group._
|
|
17
18
|
if (group.dropdown) {
|
|
18
|
-
this.params.attr = group._
|
|
19
19
|
this.params.attr.class.push('dropdown-toggle')
|
|
20
20
|
this.params.attr.role = 'button'
|
|
21
21
|
this.params.attr.dataBsToggle = 'dropdown'
|
|
@@ -5,14 +5,10 @@ async function navToggleFullscreen () {
|
|
|
5
5
|
if (!req.iconset) return
|
|
6
6
|
const inIcon = iconset.resolve('fullscreen')
|
|
7
7
|
const outIcon = iconset.resolve('fullscreenExit')
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
content
|
|
13
|
-
}
|
|
14
|
-
if (this.params.attr.text) attr.text = this.params.attr.text
|
|
15
|
-
attr['@fullscreenchange.document'] = `
|
|
8
|
+
this.params.attr['x-ref'] = 'fullscreen'
|
|
9
|
+
this.params.attr['@click'] = 'toggle()'
|
|
10
|
+
this.params.attr.content = await this.component.buildTag({ tag: 'icon', attr: { oname: inIcon } })
|
|
11
|
+
this.params.attr['@fullscreenchange.document'] = `
|
|
16
12
|
const el = $refs.fullscreen.querySelector('i')
|
|
17
13
|
if (document.fullscreenElement) {
|
|
18
14
|
el.classList.remove(inIcon)
|
|
@@ -22,7 +18,7 @@ async function navToggleFullscreen () {
|
|
|
22
18
|
el.classList.add(inIcon)
|
|
23
19
|
}
|
|
24
20
|
`
|
|
25
|
-
attr['x-data'] = `{
|
|
21
|
+
this.params.attr['x-data'] = `{
|
|
26
22
|
inIcon: '${inIcon}',
|
|
27
23
|
outIcon: '${outIcon}',
|
|
28
24
|
async toggle () {
|
|
@@ -40,7 +36,7 @@ async function navToggleFullscreen () {
|
|
|
40
36
|
}
|
|
41
37
|
}`
|
|
42
38
|
this.params.noTag = true
|
|
43
|
-
this.params.html = await this.component.buildTag({ tag: 'navItem', attr })
|
|
39
|
+
this.params.html = await this.component.buildTag({ tag: 'navItem', attr: this.params.attr })
|
|
44
40
|
}
|
|
45
41
|
}
|
|
46
42
|
}
|
|
@@ -5,7 +5,7 @@ export const fstyles = ['italic', 'normal']
|
|
|
5
5
|
export const heights = ['1', 'sm', 'base', 'lg']
|
|
6
6
|
export const cvariants = ['emphasis', 'secondary', 'tertiary']
|
|
7
7
|
export const cbgvariants = ['subtle']
|
|
8
|
-
export const opacities = ['25', '50', '75', '100']
|
|
8
|
+
export const opacities = ['0', '25', '50', '75', '100']
|
|
9
9
|
export const aligns = ['top', 'bottom', 'start', 'end', 'middle']
|
|
10
10
|
export const dirs = ['up', 'down', 'start', 'end']
|
|
11
11
|
export const widths = ['0', '1', '2', '3', '4', '5']
|
|
@@ -92,11 +92,12 @@ class Wbs {
|
|
|
92
92
|
return await this.alert(msg, opts.title ?? 'Prompt', opts)
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
async appLauncher (params) {
|
|
95
|
+
async appLauncher (params, menu) {
|
|
96
96
|
document.body.click()
|
|
97
97
|
const id = wmpa.randomId()
|
|
98
98
|
const toolbar = params ? `toolbar="${params}"` : ''
|
|
99
|
-
const
|
|
99
|
+
const menuId = menu ? `menu="${menu}"` : ''
|
|
100
|
+
const body = [`<c:app-launcher id="${id}" ${toolbar} ${menuId} />`]
|
|
100
101
|
await wmpa.addComponent(body.join('\n'), 'body')
|
|
101
102
|
const item = new bootstrap.Offcanvas(`#${id}`)
|
|
102
103
|
const itemEl = document.getElementById(id)
|
package/plugin/.alias
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
wbs
|
package/plugin/.dependencies
DELETED