Restore object-identity tracking (track widget) for the dashboard widget
grid loop. The Angular 20 migration commit ff0e33c07 changed it to
'track widget.widgetId', which stopped the WidgetComponent from being
recreated when doCheck() swaps in a new DashboardWidget on a config edit.
Since widgetContext.customHeaderActions / actionsApi are built only in
ngOnInit, applied action changes did not appear until a full reload.
PROD-followup on the new-menu review: both #menuPopover template refs in
UserMenuComponent's template resolved to only one popover instance, so
menuPopover?.hide() inside the shared userMenuTpl closed only one of the
two mutually-exclusive trigger buttons (they swap via lt-lg media query).
Rename to #menuPopoverFull / #menuPopoverIcon and call .hide() on both
from the shared Account/Logout menu items so whichever button is visible
for the current breakpoint always closes cleanly.
Also drop legacy commented-out selectors in menu-toggle.component.scss
and tighten HomeService.toggleSideBar to EventEmitter<void>.
Sweep every dialog-context <mat-toolbar color="primary"> (105 toolbars across
104 files) to <mat-toolbar class="tb-dialog-header">, preserving any existing
class list. Add a matching .tb-dialog-header rule to styles.scss with a
1px rgba(0,0,0,0.12) bottom border. Table row-selection toolbars
(mat-mdc-table-toolbar) and the app shell / dashboard-page primary toolbars
are intentionally left as-is. The two dialogs that placed a
tb-toggle-select in the header switch from appearance="fill-invert" to "fill"
now that the header is on a light background.
Follow-up to the EntityComponent sweep — ContactBasedComponent extends EntityComponent transitively, so tenant.component.html (4 buttons) and customer.component.html (8 buttons) were missed. Same one-for-one raised → stroked replacement inside the .tb-details-buttons block.
Switch every button inside .tb-details-buttons across all EntityComponent
templates (17 files, 102 buttons) from mat-raised-button to mat-stroked-button,
matching the device.component.html reference. Update the shared
.tb-details-buttons rule in styles.scss so outlined buttons inherit their
border color from the surrounding color context. copy-device-credentials
follows the same treatment and switches its host to display: contents so it
no longer takes layout space.
Drop hardcoded card-grid sizing and inline icon styles in the navigation-card / navigation-cards / home-links templates and stylesheets; tighten menu-models default seed map and menu-service helper accordingly.
The device-install wizard substituted ${...} placeholders via a plain
string replace, so a quoted boolean macro like "cleanSession":
"${mqttCleanSession}" parsed as the string "false" (truthy) instead of
the JSON boolean false. Unchecking a boolean field (e.g. clean session)
therefore had no effect and read as true in the resulting integration.
Add a type-aware resolveTemplateJson() that, using the form-field type
recorded in form.json, emits BOOLEAN/INTEGER placeholders occupying a
whole quoted token as raw JSON values (unquoted) while leaving string
fields and embedded placeholders quoted. Route all template-parse call
sites through it. Fixes cleanSession, ssl, port and connectTimeoutSec
across all existing device packages without any template changes.
Add a MenuId.platform pointing at the existing /settings path with the platform icon, retain MenuId.settings for the smaller "Settings" group, and re-point the SYS_ADMIN sidebar entry + admin-routing breadcrumb at the new platform id so each section can have its own icon and translation.
Reshape MenuId / MenuSection metadata in menu.models.ts so menu-toggle can read the new structure; align the admin/JS library and resources routing/table configs with that shape; tighten js-library-table-header and js-resource templates plus the image-gallery action header; add the matching English locale entries.
@for now uses the `track section.id` / `track page.id` syntax directly, so the dedicated trackBy methods are no longer referenced. Remove them along with the empty OnInit lifecycle hooks they used to live next to.
Move breadcrumb resolution out of BreadcrumbComponent into a dedicated BreadcrumbService so the breadcrumb stream can be consumed across the new top toolbar without duplicating ActivatedRoute walking. Introduce a main-toolbar models file shared by HomeComponent for the redesigned header. Promote NotificationBell and GithubBadge to standalone NgModules so they can be re-used outside HomeModule. Refresh dashboard-page / dashboard-toolbar / default- and entity-state controllers and routing data to match the new toolbar shape (drop legacy icon fields, tighten padding, switch flex axes). User-menu spacing follow-up.
Push the deleteInstalledItem call from IotHubActionsService into the dialog's confirm() handler so the dialog itself manages its lifetime. Pass installedItemId in the dialog data and have confirm() fire the API call, then close with true on success. Drop the now-unused isLoading flips in the installed-items table since loading state is no longer optimistically toggled around the dialog.
Light-grey background, 76%-black text, 1px hairline border, 11px/.25px tracking. Drop the previous primary-color "white pill on primary toolbar" look that no longer fits the new menu's neutral surface, and bind the opacity transition to $sidenav-anim-timing so the pill fades in/out in sync with the sidenav collapse animation.