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

Add state content component #21370

Merged
merged 6 commits into from
Jul 15, 2024
Merged

Add state content component #21370

merged 6 commits into from
Jul 15, 2024

Conversation

piitaya
Copy link
Member

@piitaya piitaya commented Jul 11, 2024

Proposed change

Create a new component to display the state and multiple attributes. This logic was in the tile card and is now in its own component. This allow usage of this content outside of tile card (e.g. in future badge 👀).

Also, a selector as been created to be used in others card/badge editor.

Also , two new specials state content has been added :

  • remaining_time : Display a live timer of remaining time of an timer entity.
  • install_status: Display the install status of an update entity (progress when install, previous version when skipped)

These special contents were available before as default value for those domains and can now be mixed with other contents as suggested by @silamon (#21290 (review))

Also, last-changed and last-updated has renamed by last_changed and last_updated. Backward compatibility has been added to not break user dashboards.

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New feature (thank you!)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Example configuration

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue or discussion:
  • Link to documentation pull request:

Checklist

  • The code change is tested and works locally.
  • There is no commented out code in this PR.
  • Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

Summary by CodeRabbit

  • New Features

    • Introduced StateDisplay class for enhanced state information display.
    • Added ha-entity-state-content-picker for users to pick and display entity state content with a filtering and sorting combo box interface.
  • Enhancements

    • Improved state rendering logic and introduced memoization for default state content in HuiTileCard component.

Copy link
Contributor

coderabbitai bot commented Jul 11, 2024

Walkthrough

Walkthrough

The updates introduce new functionalities and significant modifications to the state handling and display logic in Home Assistant's Lovelace UI. Key changes include the addition of a new StateDisplay class, improvements to the HuiTileCard for state rendering, and a new ha-entity-state-content-picker component for easier state content selection.

Changes

File Path Change Summary
.../cards/hui-tile-card.ts Enhanced state rendering logic, removed certain imports, introduced memoization for default state content.
src/state-display/state-display.ts Added new StateDisplay class to handle the display of entity state information with support for special content.
.../entity/ha-entity-state-content-picker.ts Introduced ha-entity-state-content-picker component that allows users to pick and display entity state content using a combo box interface, including properties and methods for filtering, sorting, and updating the entity state content.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant HaEntityStateContentPicker
    participant StateDisplay
    participant HuiTileCard

    User->>HaEntityStateContentPicker: Select entity state content
    HaEntityStateContentPicker->>StateDisplay: Get state display options
    StateDisplay->>HaEntityStateContentPicker: Return display options
    HaEntityStateContentPicker->>User: Display options in combo box
    User->>HaEntityStateContentPicker: Choose an option
    HaEntityStateContentPicker->>HuiTileCard: Update with chosen state content
    HuiTileCard->>StateDisplay: Render state content based on user selection
    StateDisplay->>HuiTileCard: Return rendered state content
    HuiTileCard->>User: Display updated state content
Loading

Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between fdbe533 and b10c186.

Files selected for processing (1)
  • src/components/entity/ha-entity-state-content-picker.ts (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • src/components/entity/ha-entity-state-content-picker.ts

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Outside diff range, codebase verification and nitpick comments (7)
src/components/ha-selector/ha-selector-ui-state-content.ts (2)

1-8: Ensure consistent naming conventions.

The custom element is defined as ha-selector-ui_state_content, which uses an underscore. Consider using hyphens consistently for better readability and consistency with other elements.

- @customElement("ha-selector-ui_state_content")
+ @customElement("ha-selector-ui-state-content")

10-27: Remove unnecessary line breaks.

There are unnecessary line breaks between property definitions, which can be removed for better readability.

-  @property({ attribute: false }) public hass!: HomeAssistant;

-  @property({ attribute: false }) public selector!: UiStateContentSelector;

-  @property() public value?: string | string[];

-  @property() public label?: string;

-  @property() public helper?: string;

-  @property({ type: Boolean }) public disabled = false;

-  @property({ type: Boolean }) public required = true;

-  @property({ attribute: false }) public context?: {
-    filter_entity?: string;
-  };
+  @property({ attribute: false }) public hass!: HomeAssistant;
+  @property({ attribute: false }) public selector!: UiStateContentSelector;
+  @property() public value?: string | string[];
+  @property() public label?: string;
+  @property() public helper?: string;
+  @property({ type: Boolean }) public disabled = false;
+  @property({ type: Boolean }) public required = true;
+  @property({ attribute: false }) public context?: { filter_entity?: string; };
src/state-display/state-display.ts (1)

28-38: Remove unnecessary line breaks.

There are unnecessary line breaks between property definitions, which can be removed for better readability.

-  @property({ attribute: false }) public hass!: HomeAssistant;

-  @property({ attribute: false }) public stateObj!: HassEntity;

-  @property({ attribute: false }) public content: string | string[] = "state";

+  @property({ attribute: false }) public hass!: HomeAssistant;
+  @property({ attribute: false }) public stateObj!: HassEntity;
+  @property({ attribute: false }) public content: string | string[] = "state";
src/panels/lovelace/editor/config-elements/hui-tile-card-editor.ts (3)

Line range hint 26-51: Remove unnecessary line breaks.

There are unnecessary line breaks between property definitions, which can be removed for better readability.

-  @property({ attribute: false }) public hass?: HomeAssistant;

-  @state() private _config?: TileCardConfig;

-  @state() private _subElementEditorConfig?: SubElementEditorConfig;

+  @property({ attribute: false }) public hass?: HomeAssistant;
+  @state() private _config?: TileCardConfig;
+  @state() private _subElementEditorConfig?: SubElementEditorConfig;

128-131: Remove unnecessary line breaks.

There are unnecessary line breaks between property definitions, which can be removed for better readability.

-                  },
-                ] as const satisfies readonly HaFormSchema[])
+                  }
+                ] as const satisfies readonly HaFormSchema[])

Line range hint 199-237: Avoid the delete operator.

Using the delete operator can impact performance. Consider assigning the property to undefined instead.

-    if (!config.state_content) {
-      delete config.state_content;
+    if (config.state_content === undefined) {
+      config.state_content = undefined;
Tools
Biome

[error] 233-233: Avoid the delete operator which can impact performance.

Unsafe fix: Use an undefined assignment instead.

(lint/performance/noDelete)


[error] 237-237: Avoid the delete operator which can impact performance.

Unsafe fix: Use an undefined assignment instead.

(lint/performance/noDelete)

src/components/entity/ha-entity-state-content-picker.ts (1)

71-91: Remove unnecessary line breaks.

There are unnecessary line breaks between property definitions, which can be removed for better readability.

-  @property({ attribute: false }) public hass!: HomeAssistant;

-  @property({ attribute: false }) public entityId?: string;

-  @property({ type: Boolean }) public autofocus = false;

-  @property({ type: Boolean }) public disabled = false;

-  @property({ type: Boolean }) public required = false;

-  @property() public label?: string;

-  @property() public value?: string[] | string;

-  @property() public helper?: string;

-  @state() private _opened = false;

+  @property({ attribute: false }) public hass!: HomeAssistant;
+  @property({ attribute: false }) public entityId?: string;
+  @property({ type: Boolean }) public autofocus = false;
+  @property({ type: Boolean }) public disabled = false;
+  @property({ type: Boolean }) public required = false;
+  @property() public label?: string;
+  @property() public value?: string[] | string;
+  @property() public helper?: string;
+  @state() private _opened = false;

@silamon
Copy link
Contributor

silamon commented Jul 13, 2024

There's a bit overlap now between "live_status" and "remaining". I would expect "remaining" to countdown to 0 instead of "live_status". Remaining should indicate the time that is remaining on the timer, when the timer is active "remaining" still keeps the initial time of the timer for the full timer period.

As a sidenote, the default of the timer was previously the countdown timer, now it is switched back to timer_state (active/idle). It's perfectly fine to display this, but I'm making a note for if it's unintentional.

@piitaya piitaya marked this pull request as draft July 14, 2024 21:56
@piitaya piitaya force-pushed the state_content_component branch from 48e6b1b to dac22e5 Compare July 15, 2024 07:54
@piitaya
Copy link
Member Author

piitaya commented Jul 15, 2024

There's a bit overlap now between "live_status" and "remaining". I would expect "remaining" to countdown to 0 instead of "live_status". Remaining should indicate the time that is remaining on the timer, when the timer is active "remaining" still keeps the initial time of the timer for the full timer period.

Yeah, the remaining attribute is only here to start the front-end timer. It removed it from the list to avoid confusion as it's an attribute for internal use only. I also renamed live_timer to remaining_time.

As a sidenote, the default of the timer was previously the countdown timer, now it is switched back to timer_state (active/idle). It's perfectly fine to display this, but I'm making a note for if it's unintentional.

Good catch, it now defaults to remaining_time for timer.

@piitaya piitaya marked this pull request as ready for review July 15, 2024 08:53
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

@piitaya piitaya merged commit f87296d into dev Jul 15, 2024
13 checks passed
@piitaya piitaya deleted the state_content_component branch July 15, 2024 12:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants