Rename mediaLoaded to media_loaded

This commit is contained in:
Dermot Duffy
2022-10-14 20:11:27 -07:00
parent d7909961cf
commit a54b2deb7c
6 changed files with 76 additions and 10 deletions
+3 -3
View File
@@ -874,7 +874,7 @@ All variables listed are under a `conditions:` section.
| `camera` | A list of camera ids in which this condition is satisfied. See [camera IDs](#camera-ids).|
| `fullscreen` | If `true` the condition is satisfied if the card is in fullscreen mode. If `false` the condition is satisfied if the card is **NOT** in fullscreen mode.|
| `state` | A list of state conditions to compare with Home Assistant state. See below. |
| `mediaLoaded` | If `true` the condition is satisfied if there is media load**ED** (not load**ING**) in the card (e.g. a clip, snapshot or live view). This may be used to hide controls during media loading or when a message (not media) is being displayed. Note that if `true` this condition will never be satisfied for views that do not themselves load media directly (e.g. gallery).|
| `media_loaded` | If `true` the condition is satisfied if there is media load**ED** (not load**ING**) in the card (e.g. a clip, snapshot or live view). This may be used to hide controls during media loading or when a message (not media) is being displayed. Note that if `true` this condition will never be satisfied for views that do not themselves load media directly (e.g. gallery).|
| `media_query` | Any valid [media query](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries) string. Media queries must start and end with parentheses. This may be used to alter card configuration based on device/media properties (e.g. viewport width, orientation). Please note that `width` and `height` refer to the entire viewport not just the card. See the [media query example](#media-query-example).|
See the [example below](#frigate-card-conditional-example) for a real-world example of how these conditions can be used.
@@ -1842,7 +1842,7 @@ elements:
- entity: light.office_main_lights
state: on
state_not: off
mediaLoaded: true
media_loaded: true
# Full form PTZ actions (only left button shown).
- type: custom:frigate-card-ptz
orientation: vertical
@@ -2733,7 +2733,7 @@ This example shows the native PTZ element when the `live` or `image` view is dis
elements:
- type: custom:frigate-card-conditional
conditions:
mediaLoaded: true
media_loaded: true
view:
- live
- image
+3 -3
View File
@@ -14,7 +14,7 @@ export interface ConditionState {
fullscreen?: boolean;
camera?: string;
state?: HassEntities;
mediaLoaded?: boolean;
media_loaded?: boolean;
}
class ConditionStateRequestEvent extends Event {
@@ -52,9 +52,9 @@ export function evaluateCondition(
state.state[stateTest.entity].state !== stateTest.state_not)));
}
}
if (condition?.mediaLoaded !== undefined) {
if (condition?.media_loaded !== undefined) {
result &&=
state.mediaLoaded !== undefined && condition.mediaLoaded == state.mediaLoaded;
state.media_loaded !== undefined && condition.media_loaded == state.media_loaded;
}
if (condition?.media_query) {
result &&= window.matchMedia(condition.media_query).matches;
+1 -1
View File
@@ -285,7 +285,7 @@ export class FrigateCard extends LitElement {
view: this._view?.view,
fullscreen: screenfull.isEnabled && screenfull.isFullscreen,
camera: this._view?.camera,
mediaLoaded: !!this._currentMediaLoadedInfo,
media_loaded: !!this._currentMediaLoadedInfo,
...(this._conditionManager?.hasHAStateConditions && {
state: this._hass?.states,
}),
+66 -2
View File
@@ -1,4 +1,4 @@
import cloneDeep from 'lodash-es/cloneDeep'
import cloneDeep from 'lodash-es/cloneDeep';
import get from 'lodash-es/get';
import isEqual from 'lodash-es/isEqual';
import set from 'lodash-es/set';
@@ -6,6 +6,7 @@ import {
CONF_CAMERAS,
CONF_CAMERAS_ARRAY_CAMERA_ENTITY,
CONF_CAMERAS_ARRAY_LIVE_PROVIDER,
CONF_ELEMENTS,
CONF_IMAGE_URL,
CONF_LIVE_AUTO_UNMUTE,
CONF_LIVE_CONTROLS_NEXT_PREVIOUS_SIZE,
@@ -122,7 +123,7 @@ export const trimConfig = function (obj: RawFrigateCardConfig): boolean {
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (typeof obj[key] === 'object' && obj[key] != null) {
modified ||= trimConfig(obj[key] as RawFrigateCardConfig);
modified = trimConfig(obj[key] as RawFrigateCardConfig) || modified;
if (!Object.keys(obj[key] as RawFrigateCardConfig).length) {
delete obj[key];
@@ -547,6 +548,56 @@ const upgradeThumbnailShowControlsToIndividualControls = (
};
};
/**
* Recursively upgrade an object.
* @param transform A transform applied to each object recursively.
* @param getObject A function to get the object to be upgraded.
* @returns An upgrade function.
*/
const recursiveUpgradeObject = (
transform: (data: RawFrigateCardConfig) => boolean,
getObject?: (data: RawFrigateCardConfig) => RawFrigateCardConfig | undefined | null,
): ((data: RawFrigateCardConfig) => boolean) => {
const recurse = (data: RawFrigateCardConfig): boolean => {
let result = false;
if (data && typeof data === 'object') {
const object = getObject ? getObject(data) : data;
if (object) {
result = transform(object) || result;
}
if (Array.isArray(data)) {
data
.filter((item) => typeof item === 'object')
.forEach((item: RawFrigateCardConfig) => {
result = recurse(item) || result;
});
} else {
Object.keys(data)
.filter((key) => typeof data[key] === 'object')
.forEach((key) => {
result = recurse(data[key] as RawFrigateCardConfig) || result;
});
}
}
return result;
};
return recurse;
};
/**
* Transform mediaLoaded -> media_loaded
* @param data Input data.
* @returns `true` if the configuration was modified.
*/
const transformConditionMediaLoaded = (data: unknown): boolean => {
if (typeof data === 'object' && data && data['mediaLoaded'] !== undefined) {
data['media_loaded'] = data['mediaLoaded'];
delete data['mediaLoaded'];
return true;
}
return false;
};
const UPGRADES = [
// v1.2.1 -> v2.0.0
upgradeMoveTo('frigate_url', 'frigate.url'),
@@ -645,4 +696,17 @@ const UPGRADES = [
upgradeThumbnailShowControlsToIndividualControls('media_viewer.controls.thumbnails'),
upgradeThumbnailShowControlsToIndividualControls('live.controls.thumbnails'),
upgradeThumbnailShowControlsToIndividualControls('timeline.controls.thumbnails'),
// v4.0.0 -> v4.1.0
upgradeArrayValue(
CONF_OVERRIDES,
transformConditionMediaLoaded,
(data) => data.conditions as RawFrigateCardConfig | undefined,
),
(data: unknown): boolean => {
return recursiveUpgradeObject(
transformConditionMediaLoaded,
(data) => data.conditions as RawFrigateCardConfig | undefined,
)(typeof data === 'object' && data ? data[CONF_ELEMENTS] : {});
},
];
+2
View File
@@ -33,6 +33,8 @@ export const CONF_CAMERAS_ARRAY_TRIGGERS_OCCUPANCY =
export const CONF_CAMERAS_ARRAY_TRIGGERS_ENTITIES =
`${CONF_CAMERAS}.#.triggers.entities` as const;
export const CONF_ELEMENTS = 'elements' as const;
export const CONF_VIEW = 'view' as const;
export const CONF_VIEW_CAMERA_SELECT = `${CONF_VIEW}.camera_select` as const;
export const CONF_VIEW_DARK_MODE = `${CONF_VIEW}.dark_mode` as const;
+1 -1
View File
@@ -500,7 +500,7 @@ const frigateCardConditionSchema = z.object({
view: z.string().array().optional(),
fullscreen: z.boolean().optional(),
camera: z.string().array().optional(),
mediaLoaded: z.boolean().optional(),
media_loaded: z.boolean().optional(),
state: stateConditions.optional(),
media_query: z.string().optional(),
});