Skip to content

Feature/widgets with item display#1028

Open
timbms wants to merge 779 commits intodevelopfrom
feature/widgets-with-item-display
Open

Feature/widgets with item display#1028
timbms wants to merge 779 commits intodevelopfrom
feature/widgets-with-item-display

Conversation

@timbms
Copy link
Copy Markdown
Contributor

@timbms timbms commented Dec 20, 2025

Depends on #892

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot reviewed 65 out of 68 changed files in this pull request and generated no comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 66 out of 69 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

timbms added 21 commits February 2, 2026 20:23
Use Color(fromString:) from CommonUI to properly parse hex color
strings like "#00AA00". The previous code used Color(widget.valuecolor)
which doesn't handle hex strings, causing values with custom colors
to not display.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Add fallbackSymbol parameter to IconView for SF Symbol fallback
  when network icons are unavailable (useful for previews)
- Add fallbackSymbol parameter to SegmentedRowView, forwarded to IconView
- Create PreviewList helper to reduce boilerplate in previews
- Update previews to use List with proper insets matching SitemapPageView
- Scale fallback symbol to 75% for better visual match with network icons

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Fix iOS SliderRowView not reacting to external updates by using
  debounce pattern (matching watchOS approach)
- Merge SliderWithSwitchSupportRow into SliderRow on watchOS
- Add fallbackSymbol support to watchOS IconView for previews
- Improve slider previews with minValue/maxValue/step support

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Use onEditingChanged for true release-only behavior on iOS
- Show current slider value while dragging on iOS and watchOS
- Fix external update handling with proper isEditing tracking
- Keep pendingValue until server responds to avoid visual jump

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Wrap PreviewConstants in #if DEBUG to exclude from release builds
- Fix SegmentedRowView preview detail labels to use numeric values

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Apply consistent styling with rounded background and border
- Add pressed indicator on each button
- Use equal spacing and minimum width for buttons

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Style singleMappingButton as momentary press button
- Match height, width, and indicator styling with segmentedButtons
- Set common minWidth on both single and pressRelease containers
- Add all widget types to All Scenarios preview

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Use trailing-aligned frame for single mapping button
- Use fixedSize with leading padding for pressRelease buttons

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Add isNilOrEmpty computed property on Optional<String>
- Replace verbose nil/empty checks in SegmentedRowView

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Move background/border to each pressRelease button
- Add spacing between buttons
- Match row height with segmentedButtons
- Add two-button pressRelease preview

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Add Office Shutter two-button pressRelease preview
- Restore consistent Spacer logic for button alignment

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Align iOS behavior with Android by highlighting the single mapping
button when the item's state matches the mapping command.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Always send slider value on release, not just in releaseOnly mode
- Add step parameter to Slider to match watchOS and prevent continuous
  vs step-adjusted value mismatch
- Only clear pendingValue when server confirms the value we sent,
  preventing jumps from intermediate throttled responses

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Simplify the drag gesture to send the command immediately on touch
instead of waiting for release, removing the pressed state tracking.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Guard against repeated sends in onChanged by tracking singlePressed
state. Add press/release visual feedback and selection animation.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
timbms and others added 21 commits March 12, 2026 21:09
Add OTHER_LDFLAGS = -undefined dynamic_lookup to the test target so the
linker defers resolution of dynamic framework symbols (SDWebImageSVGCoder,
etc.) to runtime, where they are already loaded by the host app.

Also remove the redundant SDImageSVGCoder registration in OpenHABSVGTests
setUpWithError — AppDelegate already registers the coder before tests run.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Replace 'import SDWebImageSVGCoder' with ObjC runtime lookup via
NSClassFromString("SDImageSVGCoder"). This eliminates the hard link-time
dependency on SDWebImage data symbols (_SDImageCoderDecodePreserveAspectRatio
etc.) that BUNDLE_LOADER and -undefined dynamic_lookup cannot reliably resolve.

The coder is already registered by AppDelegate before any tests run,
so runtime lookup is sufficient. Also revert the -undefined dynamic_lookup
OTHER_LDFLAGS added in the previous commit.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Add OpenAPIErrorInspector utility to OpenHABCore, centralising all
  ClientError unwrapping so callers don't need to import OpenAPIRuntime
- Remove OpenAPIRuntime imports from SitemapPageViewModel and
  SingleConnectionSettingsView; replace ClientError casts with inspector
- Add SDWebImage as explicit Package.swift dependency (required now that
  OpenHABCore uses SDWebImage APIs directly)
- Add process(data:) convenience on OpenHABImageProcessor for test use
- Migrate OpenHABSVGTests from XCTest to Swift Testing (@Suite/@Test/#expect)
  and replace fragile ObjC-runtime SDImageSVGCoder lookup with direct
  OpenHABImageProcessor call via @testable import OpenHABCore
- Add dedicated openHABTestsSwift.xctestplan; point openHABTestsSwift
  scheme at it; remove ASAN config from openHABTests plan

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
The Main UI script editor height does not account for the bottom
toolbar's safe area padding on iPhone, causing the last 2-3 lines
to be hidden behind the toolbar and unreachable by scrolling.

Inject a JavaScript fix via WKWebView that adds bottom padding to
the page content and CodeMirror scroll container equal to the native
safe area inset plus any FAB button height. A MutationObserver
re-applies the fix on SPA navigation back to the script editor page.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
CI uses testplan: 'openHABTests' in the Fastfile unittests lane, but the
scheme only had openHABTestsSwift.xctestplan associated, causing xcodebuild
to error with 'Scheme does not have an associated test plan named openHABTests'.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
ASan instrumentation causes undefined symbol errors (___asan_alloca_poison)
when Swift Package Manager dependencies are not recompiled with ASan support.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: openhab-bot <info@openhabfoundation.org>
…1102)

* Fix empty string commands and switch sendItemCommand to JSON payload

Text input items can now be cleared by submitting an empty string. Previously,
empty commands were silently dropped in both InputCommandFormatter and
WidgetCommandDispatcher. The guard order in InputCommandFormatter.command() is
corrected so that only number hints reject empty input; text hints pass through
an empty string as a valid "clear" command.

Also fixes the openapi.json schema for sendItemCommand, which incorrectly
declared the application/json body as type:string. It is now type:object with a
required "value" field, matching the actual server contract. Types.swift and
OpenAPIService are regenerated/updated accordingly.

---------

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: openhab-bot <info@openhabfoundation.org>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Tassilo Karge <tassilo.karge@web.de>
* Localisation transition to String Catalog

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Correction for build failure and functionality with missing .xcodeproj

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Make Colour Temperatures localisable

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Update Intents.intentdefinition

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Update Ruby and lockfile

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Add missing localisations for Debug strings and French Bonjour strings

Propagate "Debug" (untranslated) to es, fi, fr, it, nb, nl, ru for two
existing keys; add French translations for "Discovering openHAB servers"
and "No servers found".

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>

* German typo fixes

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Additional German translations

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* More German translations

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Further localisation adjustments

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Add missing 'Loading…' translations for es, fi, fr, it, nb, nl, ru

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>

* Port LocalizationTests to Swift Testing, drop tests superseded by String Catalog

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>

* Localisation and test adjustments

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Make Settings popups localisable

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* String adjustment

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Splitting up localisable string "empty" for gender specific translations

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Add missing localised string and minor string fixes

- Add `invalid_connection_configuration` key used in OpenHABCore with
  translations for all supported languages
- Fix German hyphenation for certificate-related strings
- Add Dutch translations for notifications and off strings

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>

* German correction for empty.value translation

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Additional watchOS 'empty' string made localisable

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Fixed German quotation marks

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

* Certificates dialogs buttons stringa adjustments

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>

---------

Signed-off-by: DigiH <17110652+DigiH@users.noreply.github.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Co-authored-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Conflict resolution strategy:
- DU (deleted in HEAD): accept all files from openapigen-swiftui
- openapi/Types.swift: take openapigen-swiftui (adds JSON body type)
- OpenAPIService.swift: take openapigen-swiftui (JSON payload send)
- OpenHABImageProcessor.swift: take openapigen-swiftui (svgMaxSize, empty SVG, macOS)
- StringExtension.swift: take openapigen-swiftui (FormatStyle API migration)
- StringExtensionTests.swift: take openapigen-swiftui (adds tests)
- NumberStateTests.swift: take openapigen-swiftui (Swift Testing migration)
- openapi.json: take openapigen-swiftui (adds JSON body + source param)
- OpenHABRootViewController.swift: take openapigen-swiftui (adds HostingSitemapViewController)
- ScreenSaverView.swift: take openapigen-swiftui (FormatStyle, anchor-based positioning)
- UserData.swift: merge both (add openapigen-swiftui extra properties, keep HEAD append logic)
- RollershutterRow.swift: keep HEAD (chevron icons, direct widget.sendCommand)
- SetpointRow.swift: keep HEAD (ObservedObject, chevron icons, consistent structure)
- SitemapPageView.swift: keep HEAD (explicit row switch statement)
- SwitchRow.swift: take openapigen-swiftui for preview (needs previewRootURL)

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
… files

CommonUI/Package.swift and source files were missing from the working tree
(untracked, not in git). Restore them from openapigen-swiftui and add
CommonUI to the Xcode workspace so it appears in the File Navigator.

Also adds Version.xcconfig reference to workspace per openapigen-swiftui.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
…ol signature

OpenAPIServiceProtocol now requires sourcePrefix and deviceId parameters.
Pass nil at all existing call sites that don't have a source context.
Update the NetworkTrackerTests mock to match the new protocol.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Defines WidgetCommandPolicy, WidgetCommandPhase, and WidgetCommandDefaults
which WidgetCommandDispatcher depends on. The file was not tracked in git
and was not restored during the merge.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
commandString was added in openapigen-swiftui and used by
WidgetCommandDispatcher. The merge revert dropped it from NumberState.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
The revert dropped the .json body case and source header/query setup
from sendItemCommand in Client.swift, causing an exhaustiveness error.
Restore the full generated client from openapigen-swiftui.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
- Add Rows group definition to project.pbxproj with all PBXFileReference
  and PBXBuildFile entries for SwiftUI row views
- Add IconView.swift (IconInputView) to main app Sources phase
- Create FrameRowView.swift for the frame widget row type
- Restore OpenHABViewable protocol to OpenHABViewController.swift and
  add conformance to OpenHABViewController
- Fix .datetime -> .dateTime InputHint enum case in WidgetCellProvider,
  DatePickerUITableViewCell, and OpenHABSitemapViewController
- Add colortemperaturepicker/buttongrid/button cases to WidgetCellProvider
  switch to make it exhaustive
- Remove deviceId parameter from NetworkTracker.send call site
- InputRowView and MediaRowView typealiases for TextInputRowView/ImageRowView

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
…em-display

Merge commits:
- aa37a05: improve TextInputRowView legibility and corresponding tests
- 32525a8: Localisation transition to String Catalog (#1101)

Conflict resolutions:
- ScreenSaverSettingsView.swift: take openapigen-swiftui (new @ViewBuilder refactor)
- SitemapSettingsView.swift: take openapigen-swiftui (clean @ViewBuilder refactor)
- openHABWatch/Views/SitemapPageView.swift: take openapigen-swiftui ellipsis + watchTextStyle
- openHABIntents/*IntentHandler.swift: keep HEAD deletions (files removed intentionally)

Add WatchTypography.swift (new file from openapigen-swiftui) to project

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Add new string keys for widget actions, item types, and commands.
Mark stale entries from refactored code.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
@TAKeanice TAKeanice force-pushed the openapigen-swiftui branch from 1f242b5 to 166a59c Compare March 26, 2026 19:49
Base automatically changed from openapigen-swiftui to develop March 30, 2026 19:59
timbms and others added 6 commits April 7, 2026 21:52
Guard against NaN propagation when min/max temperature values produce
a zero-span range. Extract math into testable ColorTemperatureRowMath
and replace stride-based gradient generation with an integer-step
approach that is safe when the span is zero.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Signed-off-by: Tim Bert <5411131+timbms@users.noreply.github.com>
The widget extension uses SFSafeSymbols in OpenHABWidgetHelpers,
OpenHABWidgetEntryView, SwitchWidgetEntryView and SensorWidgetEntryView
but the package dependency was never added to the target, causing
undefined symbol linker errors.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
…ation tests

The openHABIntents extension target was removed in favour of AppIntents
embedded in the main app. Remove the leftover source files, project
references, and the two test methods that relied on the now-absent
openHABIntents.appex bundle.

Signed-off-by: Tim Mueller-Seydlitz <timbms@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants