Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[mainui] support staticIcon parameter in sitemap configuration #1999

Merged
merged 5 commits into from
Sep 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions bundles/org.openhab.ui/web/src/assets/sitemap-lexer.nearley
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
name: 'name=',
label: 'label=',
item: 'item=',
staticIcon: 'staticIcon=',
icon: 'icon=',
widgetattr: ['url=', 'refresh=', 'service=', 'period=', 'height=', 'minValue=', 'maxValue=', 'step=', 'encoding=', 'yAxisDecimalPattern=', 'inputHint='],
widgetboolattr: ['legend='],
Expand Down Expand Up @@ -71,6 +72,15 @@
}
}

// if icon exists remove staticIcon, if not set icon to staticIcon and make saticIcon=true
if (widget.config.icon) {
delete widget.config.staticIcon
}
if (widget.config.staticIcon) {
widget.config.icon = widget.config.staticIcon
widget.config.staticIcon = true
}

// reject widgets with missing parameters
if (requiresItem.includes(widget.component) && !widget.config.item) return reject
if ((widget.component === 'Video' || widget.component === 'Webview') && !widget.config.url) return reject
Expand Down Expand Up @@ -103,6 +113,7 @@ WidgetAttr -> %widgetswitchattr
| %widgetboolattr _ WidgetBooleanAttrValue {% (d) => [d[0].value, d[2]] %}
| %widgetfreqattr _ WidgetAttrValue {% (d) => ['frequency', d[2]] %}
| %icon _ WidgetIconAttrValue {% (d) => [d[0].value, d[2].join("")] %}
| %staticIcon_ WidgetIconAttrValue {% (d) => [d[0].value, d[2].join("")] %}
| WidgetAttrName _ WidgetAttrValue {% (d) => [d[0][0].value, d[2]] %}
| WidgetMappingsAttrName WidgetMappingsAttrValue {% (d) => [d[0][0].value, d[1]] %}
| WidgetVisibilityAttrName WidgetVisibilityAttrValue {% (d) => [d[0][0].value, d[1]] %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,43 @@ describe('dslUtil', () => {
])
})

it('renders a widget with icon correctly', () => {
const component = createSitemapComponent('test', 'Test')
const widget = {
}
addWidget(component, 'Switch', {
item: 'TestItem',
label: 'Test Switch',
icon: 'lightbulb'
})
const sitemap = dslUtil.toDsl(component).split('\n')
expect(sitemap).toEqual([
'sitemap test label="Test" {',
' Switch item=TestItem label="Test Switch" icon=lightbulb',
'}',
''
])
})

it('renders a widget with static icon correctly', () => {
const component = createSitemapComponent('test', 'Test')
const widget = {
}
addWidget(component, 'Switch', {
item: 'TestItem',
label: 'Test Switch',
icon: 'lightbulb',
staticIcon: true
})
const sitemap = dslUtil.toDsl(component).split('\n')
expect(sitemap).toEqual([
'sitemap test label="Test" {',
' Switch item=TestItem label="Test Switch" staticIcon=lightbulb',
'}',
''
])
})

it('renders a sitemap with a frame container widget correctly', () => {
const component = createSitemapComponent('test', 'Test')
const frame = addWidget(component, 'Frame', {})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,56 @@ describe('SitemapCode', () => {
})
})

it('parses a staticIcon definition', async () => {
expect(wrapper.vm.sitemapDsl).toBeDefined()
// simulate updating the sitemap in code
const sitemap = [
'sitemap test label="Test" {',
' Switch item=Item_Icon icon=lightbulb',
' Switch item=Item_Icon staticIcon=lightbulb_static',
' Switch item=Item_Icon icon=lightbulb staticIcon=lightbulb_static',
'}',
''
].join('\n')
wrapper.vm.updateSitemap(sitemap)
expect(wrapper.vm.sitemapDsl).toMatch(/^sitemap test label="Test"/)
expect(wrapper.vm.parsedSitemap.error).toBeFalsy()

await wrapper.vm.$nextTick()

// check whether an 'updated' event was emitted and its payload
// (should contain the parsing result for the new sitemap definition)
const events = wrapper.emitted().updated
expect(events).toBeTruthy()
expect(events.length).toBe(1)
const payload = events[0][0]
expect(payload.slots).toBeDefined()
expect(payload.slots.widgets).toBeDefined()
expect(payload.slots.widgets.length).toBe(3)
expect(payload.slots.widgets[0]).toEqual({
component: 'Switch',
config: {
item: 'Item_Icon',
icon: 'lightbulb'
}
})
expect(payload.slots.widgets[1]).toEqual({
component: 'Switch',
config: {
item: 'Item_Icon',
icon: 'lightbulb_static',
staticIcon: true
}
})
expect(payload.slots.widgets[2]).toEqual({
component: 'Switch',
config: {
item: 'Item_Icon',
icon: 'lightbulb'
}
})
})

it('parses a segmented icon name with hyphens', async () => {
expect(wrapper.vm.sitemapDsl).toBeDefined()
// simulate updating the sitemap in code
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ function writeWidget (widget, indent) {
dsl += ' sendFrequency=' + widget.config[key]
} else if (key === 'forceAsItem') {
dsl += ' forceasitem=' + widget.config[key]
} else if (['icon', 'staticIcon'].includes(key)) {
if (widget.config.staticIcon) {
dsl += ' staticIcon=' + widget.config[key]
} else {
dsl += ' icon=' + widget.config[key]
}
} else {
dsl += ` ${key}=`
if (key === 'item' || key === 'period' || key === 'legend' || Number.isFinite(widget.config[key])) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
<oh-icon :icon="widget.config.icon" height="32" width="32" />
</div>
</f7-list-input>
<f7-list-item title="Static icon">
<f7-toggle slot="after" :checked="widget.config.staticIcon" @toggle:change="widget.config.staticIcon = $event" />
</f7-list-item>
</ul>
<ul>
<!-- additional controls -->
Expand Down