Refactor main types.ts .
This commit is contained in:
@@ -1,22 +1,8 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { CameraConfig, ExtendedHomeAssistant } from '../../types';
|
import { CameraConfig } from '../../config/types';
|
||||||
import { ViewMedia } from '../../view/media';
|
|
||||||
import {
|
|
||||||
CameraManagerMediaCapabilities,
|
|
||||||
DataQuery,
|
|
||||||
EventQuery,
|
|
||||||
PartialEventQuery,
|
|
||||||
CameraConfigs,
|
|
||||||
CameraManagerCameraCapabilities,
|
|
||||||
QueryType,
|
|
||||||
CameraEndpoint,
|
|
||||||
} from '../types';
|
|
||||||
import { EntityRegistryManager } from '../../utils/ha/entity-registry';
|
|
||||||
import { CameraManagerEngine } from '../engine';
|
|
||||||
import { GenericCameraManagerEngine } from '../generic/engine-generic';
|
|
||||||
import { CameraInitializationError } from '../error';
|
|
||||||
import { localize } from '../../localize/localize';
|
import { localize } from '../../localize/localize';
|
||||||
import { Entity } from '../../utils/ha/entity-registry/types';
|
import { ExtendedHomeAssistant } from '../../types';
|
||||||
|
import { canonicalizeHAURL } from '../../utils/ha';
|
||||||
import { BrowseMediaManager } from '../../utils/ha/browse-media/browse-media-manager';
|
import { BrowseMediaManager } from '../../utils/ha/browse-media/browse-media-manager';
|
||||||
import {
|
import {
|
||||||
BROWSE_MEDIA_CACHE_SECONDS,
|
BROWSE_MEDIA_CACHE_SECONDS,
|
||||||
@@ -24,12 +10,27 @@ import {
|
|||||||
MEDIA_CLASS_VIDEO,
|
MEDIA_CLASS_VIDEO,
|
||||||
RichBrowseMedia,
|
RichBrowseMedia,
|
||||||
} from '../../utils/ha/browse-media/types';
|
} from '../../utils/ha/browse-media/types';
|
||||||
import { BrowseMediaMetadata } from './types';
|
import { EntityRegistryManager } from '../../utils/ha/entity-registry';
|
||||||
import { rangesOverlap } from '../range';
|
import { Entity } from '../../utils/ha/entity-registry/types';
|
||||||
import { ResolvedMediaCache, resolveMedia } from '../../utils/ha/resolved-media';
|
import { ResolvedMediaCache, resolveMedia } from '../../utils/ha/resolved-media';
|
||||||
import { canonicalizeHAURL } from '../../utils/ha';
|
import { ViewMedia } from '../../view/media';
|
||||||
import { RequestCache } from '../cache';
|
import { RequestCache } from '../cache';
|
||||||
|
import { CameraManagerEngine } from '../engine';
|
||||||
|
import { CameraInitializationError } from '../error';
|
||||||
|
import { GenericCameraManagerEngine } from '../generic/engine-generic';
|
||||||
|
import { rangesOverlap } from '../range';
|
||||||
|
import {
|
||||||
|
CameraConfigs,
|
||||||
|
CameraEndpoint,
|
||||||
|
CameraManagerCameraCapabilities,
|
||||||
|
CameraManagerMediaCapabilities,
|
||||||
|
DataQuery,
|
||||||
|
EventQuery,
|
||||||
|
PartialEventQuery,
|
||||||
|
QueryType,
|
||||||
|
} from '../types';
|
||||||
import { BrowseMediaViewMediaFactory } from './media';
|
import { BrowseMediaViewMediaFactory } from './media';
|
||||||
|
import { BrowseMediaMetadata } from './types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A utility method to determine if a browse media object matches against a
|
* A utility method to determine if a browse media object matches against a
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
|
import { CameraConfig } from '../config/types';
|
||||||
import { localize } from '../localize/localize';
|
import { localize } from '../localize/localize';
|
||||||
import { CameraConfig } from '../types';
|
|
||||||
import { BrowseMediaManager } from '../utils/ha/browse-media/browse-media-manager';
|
import { BrowseMediaManager } from '../utils/ha/browse-media/browse-media-manager';
|
||||||
import { BrowseMedia } from '../utils/ha/browse-media/types';
|
import { BrowseMedia } from '../utils/ha/browse-media/types';
|
||||||
import { EntityRegistryManager } from '../utils/ha/entity-registry';
|
import { EntityRegistryManager } from '../utils/ha/entity-registry';
|
||||||
|
|||||||
@@ -1,11 +1,23 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { CameraConfig, ExtendedHomeAssistant } from '../types';
|
import { CameraConfig } from '../config/types';
|
||||||
|
import { ExtendedHomeAssistant } from '../types';
|
||||||
import { EntityRegistryManager } from '../utils/ha/entity-registry';
|
import { EntityRegistryManager } from '../utils/ha/entity-registry';
|
||||||
import { ViewMedia } from '../view/media';
|
import { ViewMedia } from '../view/media';
|
||||||
import {
|
import {
|
||||||
|
CameraConfigs,
|
||||||
|
CameraEndpoint,
|
||||||
|
CameraEndpoints,
|
||||||
|
CameraEndpointsContext,
|
||||||
|
CameraManagerCameraCapabilities,
|
||||||
|
CameraManagerCameraMetadata,
|
||||||
|
CameraManagerMediaCapabilities,
|
||||||
DataQuery,
|
DataQuery,
|
||||||
|
Engine,
|
||||||
|
EngineOptions,
|
||||||
EventQuery,
|
EventQuery,
|
||||||
EventQueryResultsMap,
|
EventQueryResultsMap,
|
||||||
|
MediaMetadataQuery,
|
||||||
|
MediaMetadataQueryResultsMap,
|
||||||
PartialEventQuery,
|
PartialEventQuery,
|
||||||
PartialRecordingQuery,
|
PartialRecordingQuery,
|
||||||
PartialRecordingSegmentsQuery,
|
PartialRecordingSegmentsQuery,
|
||||||
@@ -14,17 +26,6 @@ import {
|
|||||||
RecordingQueryResultsMap,
|
RecordingQueryResultsMap,
|
||||||
RecordingSegmentsQuery,
|
RecordingSegmentsQuery,
|
||||||
RecordingSegmentsQueryResultsMap,
|
RecordingSegmentsQueryResultsMap,
|
||||||
CameraManagerCameraCapabilities,
|
|
||||||
CameraManagerMediaCapabilities,
|
|
||||||
CameraManagerCameraMetadata,
|
|
||||||
CameraEndpointsContext,
|
|
||||||
CameraConfigs,
|
|
||||||
Engine,
|
|
||||||
CameraEndpoints,
|
|
||||||
MediaMetadataQuery,
|
|
||||||
MediaMetadataQueryResultsMap,
|
|
||||||
EngineOptions,
|
|
||||||
CameraEndpoint,
|
|
||||||
} from './types';
|
} from './types';
|
||||||
|
|
||||||
export const CAMERA_MANAGER_ENGINE_EVENT_LIMIT_DEFAULT = 10000;
|
export const CAMERA_MANAGER_ENGINE_EVENT_LIMIT_DEFAULT = 10000;
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ import orderBy from 'lodash-es/orderBy';
|
|||||||
import throttle from 'lodash-es/throttle';
|
import throttle from 'lodash-es/throttle';
|
||||||
import uniq from 'lodash-es/uniq';
|
import uniq from 'lodash-es/uniq';
|
||||||
import uniqWith from 'lodash-es/uniqWith';
|
import uniqWith from 'lodash-es/uniqWith';
|
||||||
|
import { CameraConfig } from '../../config/types';
|
||||||
import { localize } from '../../localize/localize';
|
import { localize } from '../../localize/localize';
|
||||||
import { CameraConfig, ExtendedHomeAssistant } from '../../types';
|
import { ExtendedHomeAssistant } from '../../types';
|
||||||
import {
|
import {
|
||||||
allPromises,
|
allPromises,
|
||||||
formatDate,
|
formatDate,
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import fromUnixTime from 'date-fns/fromUnixTime';
|
import fromUnixTime from 'date-fns/fromUnixTime';
|
||||||
import isEqual from 'lodash-es/isEqual';
|
import isEqual from 'lodash-es/isEqual';
|
||||||
import { CameraConfig } from '../../types';
|
import { CameraConfig } from '../../config/types';
|
||||||
import {
|
import {
|
||||||
ViewMedia,
|
|
||||||
EventViewMedia,
|
EventViewMedia,
|
||||||
RecordingViewMedia,
|
RecordingViewMedia,
|
||||||
ViewMediaType,
|
|
||||||
VideoContentType,
|
VideoContentType,
|
||||||
|
ViewMedia,
|
||||||
|
ViewMediaType,
|
||||||
} from '../../view/media';
|
} from '../../view/media';
|
||||||
import { FrigateEvent, FrigateRecording } from './types';
|
import { FrigateEvent, FrigateRecording } from './types';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import utcToZonedTime from 'date-fns-tz/utcToZonedTime';
|
import utcToZonedTime from 'date-fns-tz/utcToZonedTime';
|
||||||
import { CameraConfig, ClipsOrSnapshots } from '../../types';
|
import { CameraConfig } from '../../config/types';
|
||||||
|
import { ClipsOrSnapshots } from '../../types';
|
||||||
import { formatDateAndTime, prettifyTitle } from '../../utils/basic';
|
import { formatDateAndTime, prettifyTitle } from '../../utils/basic';
|
||||||
import { FrigateEvent, FrigateRecording } from './types';
|
import { FrigateEvent, FrigateRecording } from './types';
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,36 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
|
|
||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { CameraConfig, ExtendedHomeAssistant } from '../../types';
|
import { CameraConfig } from '../../config/types';
|
||||||
|
import { ExtendedHomeAssistant } from '../../types';
|
||||||
|
import { getEntityIcon, getEntityTitle } from '../../utils/ha';
|
||||||
|
import { EntityRegistryManager } from '../../utils/ha/entity-registry';
|
||||||
import { ViewMedia } from '../../view/media';
|
import { ViewMedia } from '../../view/media';
|
||||||
|
import { CameraManagerEngine } from '../engine';
|
||||||
import {
|
import {
|
||||||
|
CameraConfigs,
|
||||||
|
CameraEndpoint,
|
||||||
|
CameraEndpoints,
|
||||||
|
CameraEndpointsContext,
|
||||||
|
CameraManagerCameraCapabilities,
|
||||||
CameraManagerCameraMetadata,
|
CameraManagerCameraMetadata,
|
||||||
CameraManagerMediaCapabilities,
|
CameraManagerMediaCapabilities,
|
||||||
DataQuery,
|
DataQuery,
|
||||||
|
Engine,
|
||||||
|
EngineOptions,
|
||||||
EventQuery,
|
EventQuery,
|
||||||
EventQueryResultsMap,
|
EventQueryResultsMap,
|
||||||
|
MediaMetadataQuery,
|
||||||
|
MediaMetadataQueryResultsMap,
|
||||||
PartialEventQuery,
|
PartialEventQuery,
|
||||||
PartialRecordingQuery,
|
PartialRecordingQuery,
|
||||||
PartialRecordingSegmentsQuery,
|
PartialRecordingSegmentsQuery,
|
||||||
|
QueryReturnType,
|
||||||
|
RecordingQuery,
|
||||||
RecordingQueryResultsMap,
|
RecordingQueryResultsMap,
|
||||||
RecordingSegmentsQuery,
|
RecordingSegmentsQuery,
|
||||||
RecordingSegmentsQueryResultsMap,
|
RecordingSegmentsQueryResultsMap,
|
||||||
CameraEndpointsContext,
|
|
||||||
CameraConfigs,
|
|
||||||
RecordingQuery,
|
|
||||||
QueryReturnType,
|
|
||||||
CameraManagerCameraCapabilities,
|
|
||||||
Engine,
|
|
||||||
CameraEndpoints,
|
|
||||||
MediaMetadataQuery,
|
|
||||||
MediaMetadataQueryResultsMap,
|
|
||||||
EngineOptions,
|
|
||||||
CameraEndpoint,
|
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { getEntityIcon, getEntityTitle } from '../../utils/ha';
|
|
||||||
import { EntityRegistryManager } from '../../utils/ha/entity-registry';
|
|
||||||
import { CameraManagerEngine } from '../engine';
|
|
||||||
|
|
||||||
export class GenericCameraManagerEngine implements CameraManagerEngine {
|
export class GenericCameraManagerEngine implements CameraManagerEngine {
|
||||||
public getEngineType(): Engine {
|
public getEngineType(): Engine {
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ import add from 'date-fns/add';
|
|||||||
import cloneDeep from 'lodash-es/cloneDeep';
|
import cloneDeep from 'lodash-es/cloneDeep';
|
||||||
import merge from 'lodash-es/merge.js';
|
import merge from 'lodash-es/merge.js';
|
||||||
import sum from 'lodash-es/sum';
|
import sum from 'lodash-es/sum';
|
||||||
|
import { CameraConfig, CamerasConfig } from '../config/types.js';
|
||||||
import { MEDIA_CHUNK_SIZE_DEFAULT } from '../const.js';
|
import { MEDIA_CHUNK_SIZE_DEFAULT } from '../const.js';
|
||||||
import { localize } from '../localize/localize.js';
|
import { localize } from '../localize/localize.js';
|
||||||
import { CameraConfig, CamerasConfig } from '../types.js';
|
|
||||||
import { allPromises, arrayify, setify } from '../utils/basic.js';
|
import { allPromises, arrayify, setify } from '../utils/basic.js';
|
||||||
import { getCameraID } from '../utils/camera.js';
|
import { getCameraID } from '../utils/camera.js';
|
||||||
import { CardCameraAPI } from '../utils/card-controller/types.js';
|
import { CardCameraAPI } from '../utils/card-controller/types.js';
|
||||||
@@ -17,14 +17,23 @@ import { CameraManagerEngine } from './engine.js';
|
|||||||
import { CameraInitializationError } from './error.js';
|
import { CameraInitializationError } from './error.js';
|
||||||
import { CameraManagerReadOnlyConfigStore, CameraManagerStore } from './store.js';
|
import { CameraManagerReadOnlyConfigStore, CameraManagerStore } from './store.js';
|
||||||
import {
|
import {
|
||||||
CameraEndpoint, CameraEndpoints, CameraEndpointsContext, CameraManagerCameraCapabilities,
|
CameraEndpoint,
|
||||||
|
CameraEndpoints,
|
||||||
|
CameraEndpointsContext,
|
||||||
|
CameraManagerCameraCapabilities,
|
||||||
CameraManagerCameraMetadata,
|
CameraManagerCameraMetadata,
|
||||||
CameraManagerCapabilities,
|
CameraManagerCapabilities,
|
||||||
CameraManagerMediaCapabilities, DataQuery, Engine, EngineOptions, EventQuery,
|
CameraManagerMediaCapabilities,
|
||||||
|
DataQuery,
|
||||||
|
Engine,
|
||||||
|
EngineOptions,
|
||||||
|
EventQuery,
|
||||||
EventQueryResults,
|
EventQueryResults,
|
||||||
EventQueryResultsMap,
|
EventQueryResultsMap,
|
||||||
MediaMetadata, MediaMetadataQuery,
|
MediaMetadata,
|
||||||
MediaMetadataQueryResults, MediaQuery,
|
MediaMetadataQuery,
|
||||||
|
MediaMetadataQueryResults,
|
||||||
|
MediaQuery,
|
||||||
PartialDataQuery,
|
PartialDataQuery,
|
||||||
PartialEventQuery,
|
PartialEventQuery,
|
||||||
PartialQueryConcreteType,
|
PartialQueryConcreteType,
|
||||||
@@ -40,7 +49,7 @@ import {
|
|||||||
RecordingSegmentsQuery,
|
RecordingSegmentsQuery,
|
||||||
RecordingSegmentsQueryResults,
|
RecordingSegmentsQueryResults,
|
||||||
RecordingSegmentsQueryResultsMap,
|
RecordingSegmentsQueryResultsMap,
|
||||||
ResultsMap
|
ResultsMap,
|
||||||
} from './types.js';
|
} from './types.js';
|
||||||
import { sortMedia } from './util.js';
|
import { sortMedia } from './util.js';
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { CameraConfig } from '../../types';
|
import add from 'date-fns/add';
|
||||||
|
import endOfDay from 'date-fns/endOfDay';
|
||||||
|
import parse from 'date-fns/parse';
|
||||||
|
import startOfDay from 'date-fns/startOfDay';
|
||||||
|
import orderBy from 'lodash-es/orderBy';
|
||||||
|
import { CameraConfig } from '../../config/types';
|
||||||
|
import { allPromises, formatDate, isValidDate } from '../../utils/basic';
|
||||||
|
import {
|
||||||
|
BrowseMediaStep,
|
||||||
|
BrowseMediaTarget,
|
||||||
|
} from '../../utils/ha/browse-media/browse-media-manager';
|
||||||
|
import {
|
||||||
|
BROWSE_MEDIA_CACHE_SECONDS,
|
||||||
|
BrowseMedia,
|
||||||
|
MEDIA_CLASS_IMAGE,
|
||||||
|
MEDIA_CLASS_VIDEO,
|
||||||
|
RichBrowseMedia,
|
||||||
|
} from '../../utils/ha/browse-media/types';
|
||||||
import { ViewMedia } from '../../view/media';
|
import { ViewMedia } from '../../view/media';
|
||||||
|
import {
|
||||||
|
BrowseMediaCameraManagerEngine,
|
||||||
|
getViewMediaFromBrowseMediaArray,
|
||||||
|
isMediaWithinDates,
|
||||||
|
} from '../browse-media/engine-browse-media';
|
||||||
|
import { BrowseMediaMetadata } from '../browse-media/types';
|
||||||
|
import { CAMERA_MANAGER_ENGINE_EVENT_LIMIT_DEFAULT } from '../engine';
|
||||||
import {
|
import {
|
||||||
CameraConfigs,
|
CameraConfigs,
|
||||||
CameraEndpoint,
|
CameraEndpoint,
|
||||||
@@ -19,32 +43,8 @@ import {
|
|||||||
QueryResultsType,
|
QueryResultsType,
|
||||||
QueryReturnType,
|
QueryReturnType,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { CAMERA_MANAGER_ENGINE_EVENT_LIMIT_DEFAULT } from '../engine';
|
|
||||||
import {
|
|
||||||
BrowseMediaStep,
|
|
||||||
BrowseMediaTarget,
|
|
||||||
} from '../../utils/ha/browse-media/browse-media-manager';
|
|
||||||
import { allPromises, formatDate, isValidDate } from '../../utils/basic';
|
|
||||||
import endOfDay from 'date-fns/endOfDay';
|
|
||||||
import {
|
|
||||||
BROWSE_MEDIA_CACHE_SECONDS,
|
|
||||||
BrowseMedia,
|
|
||||||
MEDIA_CLASS_IMAGE,
|
|
||||||
MEDIA_CLASS_VIDEO,
|
|
||||||
RichBrowseMedia,
|
|
||||||
} from '../../utils/ha/browse-media/types';
|
|
||||||
import parse from 'date-fns/parse';
|
|
||||||
import { MotionEyeEventQueryResults } from './types';
|
|
||||||
import orderBy from 'lodash-es/orderBy';
|
|
||||||
import startOfDay from 'date-fns/startOfDay';
|
|
||||||
import add from 'date-fns/add';
|
|
||||||
import {
|
|
||||||
BrowseMediaCameraManagerEngine,
|
|
||||||
getViewMediaFromBrowseMediaArray,
|
|
||||||
isMediaWithinDates,
|
|
||||||
} from '../browse-media/engine-browse-media';
|
|
||||||
import { BrowseMediaMetadata } from '../browse-media/types';
|
|
||||||
import motioneyeLogo from './assets/motioneye-logo.svg';
|
import motioneyeLogo from './assets/motioneye-logo.svg';
|
||||||
|
import { MotionEyeEventQueryResults } from './types';
|
||||||
|
|
||||||
class MotionEyeQueryResultsClassifier {
|
class MotionEyeQueryResultsClassifier {
|
||||||
public static isMotionEyeEventQueryResults(
|
public static isMotionEyeEventQueryResults(
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { CameraConfig } from '../types';
|
import { CameraConfig } from '../config/types';
|
||||||
import { ViewMedia } from '../view/media';
|
import { ViewMedia } from '../view/media';
|
||||||
import { CameraManagerEngine } from './engine';
|
import { CameraManagerEngine } from './engine';
|
||||||
import { CameraConfigs, Engine } from './types';
|
import { CameraConfigs, Engine } from './types';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { CameraConfig, FrigateCardView } from '../types';
|
import { CameraConfig, FrigateCardView } from '../config/types';
|
||||||
import { ViewMedia } from '../view/media';
|
import { ViewMedia } from '../view/media';
|
||||||
|
|
||||||
// ====
|
// ====
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import startOfHour from 'date-fns/startOfHour';
|
|
||||||
import endOfHour from 'date-fns/endOfHour';
|
|
||||||
import startOfDay from 'date-fns/startOfDay';
|
|
||||||
import endOfDay from 'date-fns/endOfDay';
|
import endOfDay from 'date-fns/endOfDay';
|
||||||
|
import endOfHour from 'date-fns/endOfHour';
|
||||||
import endOfMinute from 'date-fns/endOfMinute';
|
import endOfMinute from 'date-fns/endOfMinute';
|
||||||
import { DateRange } from './range';
|
import startOfDay from 'date-fns/startOfDay';
|
||||||
|
import startOfHour from 'date-fns/startOfHour';
|
||||||
import orderBy from 'lodash-es/orderBy';
|
import orderBy from 'lodash-es/orderBy';
|
||||||
import uniqBy from 'lodash-es/uniqBy';
|
import uniqBy from 'lodash-es/uniqBy';
|
||||||
|
import { CameraConfig } from '../config/types';
|
||||||
import { ViewMedia } from '../view/media';
|
import { ViewMedia } from '../view/media';
|
||||||
import { CameraConfig } from '../types';
|
import { DateRange } from './range';
|
||||||
|
|
||||||
export const convertRangeToCacheFriendlyTimes = (
|
export const convertRangeToCacheFriendlyTimes = (
|
||||||
range: DateRange,
|
range: DateRange,
|
||||||
|
|||||||
+3
-5
@@ -17,16 +17,14 @@ import { renderMessage, renderProgressIndicator } from './components/message.js'
|
|||||||
import './components/thumbnail-carousel.js';
|
import './components/thumbnail-carousel.js';
|
||||||
import './components/views.js';
|
import './components/views.js';
|
||||||
import { FrigateCardViews } from './components/views.js';
|
import { FrigateCardViews } from './components/views.js';
|
||||||
|
import { FrigateCardConfig, MenuItem, RawFrigateCardConfig } from './config/types';
|
||||||
import { REPO_URL } from './const.js';
|
import { REPO_URL } from './const.js';
|
||||||
import { localize } from './localize/localize.js';
|
import { localize } from './localize/localize.js';
|
||||||
import cardStyle from './scss/card.scss';
|
import cardStyle from './scss/card.scss';
|
||||||
import {
|
import {
|
||||||
ExtendedHomeAssistant,
|
ExtendedHomeAssistant,
|
||||||
FrigateCardConfig,
|
|
||||||
MediaLoadedInfo,
|
MediaLoadedInfo,
|
||||||
MenuButton,
|
|
||||||
Message,
|
Message,
|
||||||
RawFrigateCardConfig,
|
|
||||||
} from './types.js';
|
} from './types.js';
|
||||||
import { frigateCardHasAction } from './utils/action.js';
|
import { frigateCardHasAction } from './utils/action.js';
|
||||||
import { ConditionEvaluateRequestEvent } from './utils/card-controller/conditions-manager.js';
|
import { ConditionEvaluateRequestEvent } from './utils/card-controller/conditions-manager.js';
|
||||||
@@ -325,11 +323,11 @@ class FrigateCard extends LitElement {
|
|||||||
.conditionsManagerEpoch=${this._controller
|
.conditionsManagerEpoch=${this._controller
|
||||||
.getConditionsManager()
|
.getConditionsManager()
|
||||||
?.getEpoch()}
|
?.getEpoch()}
|
||||||
@frigate-card:menu-add=${(ev: CustomEvent<MenuButton>) => {
|
@frigate-card:menu-add=${(ev: CustomEvent<MenuItem>) => {
|
||||||
this._menuButtonController.addDynamicMenuButton(ev.detail);
|
this._menuButtonController.addDynamicMenuButton(ev.detail);
|
||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
}}
|
}}
|
||||||
@frigate-card:menu-remove=${(ev: CustomEvent<MenuButton>) => {
|
@frigate-card:menu-remove=${(ev: CustomEvent<MenuItem>) => {
|
||||||
this._menuButtonController.removeDynamicMenuButton(ev.detail);
|
this._menuButtonController.removeDynamicMenuButton(ev.detail);
|
||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import {
|
|||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { Ref, createRef, ref } from 'lit/directives/ref.js';
|
import { Ref, createRef, ref } from 'lit/directives/ref.js';
|
||||||
|
import { TransitionEffect } from '../config/types';
|
||||||
import carouselStyle from '../scss/carousel.scss';
|
import carouselStyle from '../scss/carousel.scss';
|
||||||
import { TransitionEffect } from '../types';
|
|
||||||
import {
|
import {
|
||||||
CarouselController,
|
CarouselController,
|
||||||
CarouselDirection,
|
CarouselDirection,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { CSSResultGroup, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
import { CSSResultGroup, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
||||||
import { customElement, property, state } from 'lit/decorators.js';
|
import { customElement, property, state } from 'lit/decorators.js';
|
||||||
|
import { RawFrigateCardConfig } from '../config/types';
|
||||||
import { localize } from '../localize/localize';
|
import { localize } from '../localize/localize';
|
||||||
import basicBlockStyle from '../scss/basic-block.scss';
|
import basicBlockStyle from '../scss/basic-block.scss';
|
||||||
import { RawFrigateCardConfig } from '../types';
|
|
||||||
import { Diagnostics, getDiagnostics } from '../utils/diagnostics';
|
import { Diagnostics, getDiagnostics } from '../utils/diagnostics';
|
||||||
import { renderMessage } from './message';
|
import { renderMessage } from './message';
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +1,31 @@
|
|||||||
import { HASSDomEvent, HomeAssistant } from 'custom-card-helpers';
|
import { HASSDomEvent, HomeAssistant } from 'custom-card-helpers';
|
||||||
import {
|
import {
|
||||||
CSSResultGroup,
|
CSSResultGroup,
|
||||||
html,
|
|
||||||
LitElement,
|
LitElement,
|
||||||
PropertyValues,
|
PropertyValues,
|
||||||
TemplateResult,
|
TemplateResult,
|
||||||
|
html,
|
||||||
unsafeCSS,
|
unsafeCSS,
|
||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property, state } from 'lit/decorators.js';
|
import { customElement, property, state } from 'lit/decorators.js';
|
||||||
import { classMap } from 'lit/directives/class-map.js';
|
import { classMap } from 'lit/directives/class-map.js';
|
||||||
import { actionHandler } from '../action-handler-directive.js';
|
import { actionHandler } from '../action-handler-directive.js';
|
||||||
import { localize } from '../localize/localize.js';
|
|
||||||
import ptzStyle from '../scss/elements-ptz.scss';
|
|
||||||
import elementsStyle from '../scss/elements.scss';
|
|
||||||
import {
|
import {
|
||||||
Actions,
|
Actions,
|
||||||
ActionsConfig,
|
ActionsConfig,
|
||||||
FrigateCardError,
|
|
||||||
FrigateCardPTZConfig,
|
FrigateCardPTZConfig,
|
||||||
FrigateConditional,
|
FrigateConditional,
|
||||||
MenuButton,
|
|
||||||
MenuIcon,
|
MenuIcon,
|
||||||
|
MenuItem,
|
||||||
MenuStateIcon,
|
MenuStateIcon,
|
||||||
MenuSubmenu,
|
MenuSubmenu,
|
||||||
MenuSubmenuSelect,
|
MenuSubmenuSelect,
|
||||||
PictureElements,
|
PictureElements,
|
||||||
} from '../types.js';
|
} from '../config/types.js';
|
||||||
|
import { localize } from '../localize/localize.js';
|
||||||
|
import ptzStyle from '../scss/elements-ptz.scss';
|
||||||
|
import elementsStyle from '../scss/elements.scss';
|
||||||
|
import { FrigateCardError } from '../types.js';
|
||||||
import {
|
import {
|
||||||
frigateCardHandleActionConfig,
|
frigateCardHandleActionConfig,
|
||||||
frigateCardHasAction,
|
frigateCardHasAction,
|
||||||
@@ -184,11 +184,7 @@ export class FrigateCardElements extends LitElement {
|
|||||||
protected _menuRemoveHandler(ev: Event): void {
|
protected _menuRemoveHandler(ev: Event): void {
|
||||||
// Re-dispatch event from this element (instead of the disconnected one, as
|
// Re-dispatch event from this element (instead of the disconnected one, as
|
||||||
// there is no parent of the disconnected element).
|
// there is no parent of the disconnected element).
|
||||||
dispatchFrigateCardEvent<MenuButton>(
|
dispatchFrigateCardEvent<MenuItem>(this, 'menu-remove', (ev as CustomEvent).detail);
|
||||||
this,
|
|
||||||
'menu-remove',
|
|
||||||
(ev as CustomEvent).detail,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -196,7 +192,7 @@ export class FrigateCardElements extends LitElement {
|
|||||||
* @param ev The event.
|
* @param ev The event.
|
||||||
*/
|
*/
|
||||||
protected _menuAddHandler(ev: Event): void {
|
protected _menuAddHandler(ev: Event): void {
|
||||||
ev = ev as CustomEvent<MenuButton>;
|
ev = ev as CustomEvent<MenuItem>;
|
||||||
const path = ev.composedPath();
|
const path = ev.composedPath();
|
||||||
if (!path.length) {
|
if (!path.length) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
+17
-17
@@ -7,37 +7,37 @@ import {
|
|||||||
unsafeCSS,
|
unsafeCSS,
|
||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property, state } from 'lit/decorators.js';
|
import { customElement, property, state } from 'lit/decorators.js';
|
||||||
import galleryStyle from '../scss/gallery.scss';
|
import { classMap } from 'lit/directives/class-map.js';
|
||||||
import galleryCoreStyle from '../scss/gallery-core.scss';
|
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
||||||
|
import throttle from 'lodash-es/throttle';
|
||||||
|
import { CameraManager, ExtendedMediaQueryResult } from '../camera-manager/manager.js';
|
||||||
|
import { EventQuery, MediaQuery, RecordingQuery } from '../camera-manager/types';
|
||||||
import {
|
import {
|
||||||
CardWideConfig,
|
CardWideConfig,
|
||||||
ExtendedHomeAssistant,
|
|
||||||
frigateCardConfigDefaults,
|
frigateCardConfigDefaults,
|
||||||
GalleryConfig,
|
GalleryConfig,
|
||||||
THUMBNAIL_WIDTH_MAX,
|
THUMBNAIL_WIDTH_MAX,
|
||||||
} from '../types.js';
|
} from '../config/types';
|
||||||
|
import { localize } from '../localize/localize';
|
||||||
|
import galleryCoreStyle from '../scss/gallery-core.scss';
|
||||||
|
import galleryStyle from '../scss/gallery.scss';
|
||||||
|
import { ExtendedHomeAssistant } from '../types.js';
|
||||||
import { stopEventFromActivatingCardWideActions } from '../utils/action.js';
|
import { stopEventFromActivatingCardWideActions } from '../utils/action.js';
|
||||||
|
import { errorToConsole, sleep } from '../utils/basic';
|
||||||
import {
|
import {
|
||||||
changeViewToRecentEventsForCameraAndDependents,
|
changeViewToRecentEventsForCameraAndDependents,
|
||||||
changeViewToRecentRecordingForCameraAndDependents,
|
changeViewToRecentRecordingForCameraAndDependents,
|
||||||
} from '../utils/media-to-view.js';
|
} from '../utils/media-to-view.js';
|
||||||
import { CameraManager, ExtendedMediaQueryResult } from '../camera-manager/manager.js';
|
import { ViewMedia } from '../view/media';
|
||||||
|
import { EventMediaQueries, RecordingMediaQueries } from '../view/media-queries';
|
||||||
|
import { MediaQueriesClassifier } from '../view/media-queries-classifier';
|
||||||
|
import { MediaQueriesResults } from '../view/media-queries-results';
|
||||||
import { View } from '../view/view.js';
|
import { View } from '../view/view.js';
|
||||||
|
import './media-filter';
|
||||||
import { renderMessage, renderProgressIndicator } from './message.js';
|
import { renderMessage, renderProgressIndicator } from './message.js';
|
||||||
|
import './surround-basic';
|
||||||
import './thumbnail.js';
|
import './thumbnail.js';
|
||||||
import { THUMBNAIL_DETAILS_WIDTH_MIN } from './thumbnail.js';
|
import { THUMBNAIL_DETAILS_WIDTH_MIN } from './thumbnail.js';
|
||||||
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
|
||||||
import { MediaQueriesClassifier } from '../view/media-queries-classifier';
|
|
||||||
import { EventMediaQueries, RecordingMediaQueries } from '../view/media-queries';
|
|
||||||
import { EventQuery, MediaQuery, RecordingQuery } from '../camera-manager/types';
|
|
||||||
import { MediaQueriesResults } from '../view/media-queries-results';
|
|
||||||
import { errorToConsole, sleep } from '../utils/basic';
|
|
||||||
import './media-filter';
|
|
||||||
import './surround-basic';
|
|
||||||
import { ViewMedia } from '../view/media';
|
|
||||||
import { localize } from '../localize/localize';
|
|
||||||
import throttle from 'lodash-es/throttle';
|
|
||||||
import { classMap } from 'lit/directives/class-map.js';
|
|
||||||
|
|
||||||
const GALLERY_MEDIA_FILTER_MENU_ICONS = {
|
const GALLERY_MEDIA_FILTER_MENU_ICONS = {
|
||||||
closed: 'mdi:filter-cog-outline',
|
closed: 'mdi:filter-cog-outline',
|
||||||
|
|||||||
@@ -6,29 +6,25 @@ import {
|
|||||||
LitElement,
|
LitElement,
|
||||||
PropertyValues,
|
PropertyValues,
|
||||||
TemplateResult,
|
TemplateResult,
|
||||||
unsafeCSS
|
unsafeCSS,
|
||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { live } from 'lit/directives/live.js';
|
import { live } from 'lit/directives/live.js';
|
||||||
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
||||||
import isEqual from 'lodash-es/isEqual';
|
import isEqual from 'lodash-es/isEqual';
|
||||||
import { CachedValueController } from '../cached-value-controller.js';
|
import { CachedValueController } from '../cached-value-controller.js';
|
||||||
|
import { CameraConfig, ImageViewConfig } from '../config/types.js';
|
||||||
import defaultImage from '../images/frigate-bird-in-sky.jpg';
|
import defaultImage from '../images/frigate-bird-in-sky.jpg';
|
||||||
import { localize } from '../localize/localize.js';
|
import { localize } from '../localize/localize.js';
|
||||||
import imageStyle from '../scss/image.scss';
|
import imageStyle from '../scss/image.scss';
|
||||||
import {
|
import { FrigateCardMediaPlayer, MediaLoadedInfo } from '../types.js';
|
||||||
CameraConfig,
|
|
||||||
FrigateCardMediaPlayer,
|
|
||||||
ImageViewConfig,
|
|
||||||
MediaLoadedInfo
|
|
||||||
} from '../types.js';
|
|
||||||
import { contentsChanged } from '../utils/basic.js';
|
import { contentsChanged } from '../utils/basic.js';
|
||||||
import { isHassDifferent } from '../utils/ha';
|
import { isHassDifferent } from '../utils/ha';
|
||||||
import {
|
import {
|
||||||
createMediaLoadedInfo,
|
createMediaLoadedInfo,
|
||||||
dispatchExistingMediaLoadedInfoAsEvent,
|
dispatchExistingMediaLoadedInfoAsEvent,
|
||||||
dispatchMediaPauseEvent,
|
dispatchMediaPauseEvent,
|
||||||
dispatchMediaPlayEvent
|
dispatchMediaPlayEvent,
|
||||||
} from '../utils/media-info.js';
|
} from '../utils/media-info.js';
|
||||||
import { updateElementStyleFromMediaLayoutConfig } from '../utils/media-layout.js';
|
import { updateElementStyleFromMediaLayoutConfig } from '../utils/media-layout.js';
|
||||||
import { View } from '../view/view.js';
|
import { View } from '../view/view.js';
|
||||||
|
|||||||
@@ -8,14 +8,10 @@ import {
|
|||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { CameraEndpoints } from '../../camera-manager/types.js';
|
import { CameraEndpoints } from '../../camera-manager/types.js';
|
||||||
|
import { CameraConfig, MicrophoneConfig } from '../../config/types.js';
|
||||||
import { localize } from '../../localize/localize';
|
import { localize } from '../../localize/localize';
|
||||||
import liveMSEStyle from '../../scss/live-go2rtc.scss';
|
import liveMSEStyle from '../../scss/live-go2rtc.scss';
|
||||||
import {
|
import { ExtendedHomeAssistant, FrigateCardMediaPlayer } from '../../types.js';
|
||||||
CameraConfig,
|
|
||||||
ExtendedHomeAssistant,
|
|
||||||
FrigateCardMediaPlayer,
|
|
||||||
MicrophoneConfig,
|
|
||||||
} from '../../types.js';
|
|
||||||
import { getEndpointAddressOrDispatchError } from '../../utils/endpoint';
|
import { getEndpointAddressOrDispatchError } from '../../utils/endpoint';
|
||||||
import { setControlsOnVideo } from '../../utils/media.js';
|
import { setControlsOnVideo } from '../../utils/media.js';
|
||||||
import { screenshotMedia } from '../../utils/screenshot.js';
|
import { screenshotMedia } from '../../utils/screenshot.js';
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ import { HomeAssistant } from 'custom-card-helpers';
|
|||||||
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { createRef, Ref, ref } from 'lit/directives/ref.js';
|
import { createRef, Ref, ref } from 'lit/directives/ref.js';
|
||||||
import liveHAStyle from '../../scss/live-ha.scss';
|
import { CameraConfig } from '../../config/types';
|
||||||
import { CameraConfig, FrigateCardMediaPlayer } from '../../types.js';
|
|
||||||
import { getStateObjOrDispatchError } from './live.js';
|
|
||||||
import '../../patches/ha-camera-stream';
|
import '../../patches/ha-camera-stream';
|
||||||
import '../../patches/ha-hls-player.js';
|
import '../../patches/ha-hls-player.js';
|
||||||
import '../../patches/ha-web-rtc-player.ts';
|
import '../../patches/ha-web-rtc-player.ts';
|
||||||
|
import liveHAStyle from '../../scss/live-ha.scss';
|
||||||
|
import { FrigateCardMediaPlayer } from '../../types.js';
|
||||||
|
import { getStateObjOrDispatchError } from './live.js';
|
||||||
|
|
||||||
@customElement('frigate-card-live-ha')
|
@customElement('frigate-card-live-ha')
|
||||||
export class FrigateCardLiveHA extends LitElement implements FrigateCardMediaPlayer {
|
export class FrigateCardLiveHA extends LitElement implements FrigateCardMediaPlayer {
|
||||||
@@ -55,7 +56,7 @@ export class FrigateCardLiveHA extends LitElement implements FrigateCardMediaPla
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getScreenshotURL(): Promise<string | null> {
|
public async getScreenshotURL(): Promise<string | null> {
|
||||||
return await this._playerRef.value?.getScreenshotURL() ?? null;
|
return (await this._playerRef.value?.getScreenshotURL()) ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ import { HomeAssistant } from 'custom-card-helpers';
|
|||||||
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
||||||
|
import { CameraConfig } from '../../config/types';
|
||||||
import basicBlockStyle from '../../scss/basic-block.scss';
|
import basicBlockStyle from '../../scss/basic-block.scss';
|
||||||
import { CameraConfig, FrigateCardMediaPlayer } from '../../types.js';
|
import { FrigateCardMediaPlayer } from '../../types.js';
|
||||||
import '../image.js';
|
import '../image.js';
|
||||||
import { getStateObjOrDispatchError } from './live.js';
|
import { getStateObjOrDispatchError } from './live.js';
|
||||||
|
|
||||||
|
|||||||
@@ -4,22 +4,18 @@ import { customElement, property } from 'lit/decorators.js';
|
|||||||
import { until } from 'lit/directives/until.js';
|
import { until } from 'lit/directives/until.js';
|
||||||
import { CameraEndpoints } from '../../camera-manager/types.js';
|
import { CameraEndpoints } from '../../camera-manager/types.js';
|
||||||
import { renderProgressIndicator } from '../../components/message.js';
|
import { renderProgressIndicator } from '../../components/message.js';
|
||||||
|
import { CameraConfig, CardWideConfig } from '../../config/types.js';
|
||||||
import { localize } from '../../localize/localize.js';
|
import { localize } from '../../localize/localize.js';
|
||||||
import liveJSMPEGStyle from '../../scss/live-jsmpeg.scss';
|
import liveJSMPEGStyle from '../../scss/live-jsmpeg.scss';
|
||||||
import {
|
import { ExtendedHomeAssistant, FrigateCardMediaPlayer } from '../../types.js';
|
||||||
CameraConfig,
|
|
||||||
CardWideConfig,
|
|
||||||
ExtendedHomeAssistant,
|
|
||||||
FrigateCardMediaPlayer,
|
|
||||||
} from '../../types.js';
|
|
||||||
import { getEndpointAddressOrDispatchError } from '../../utils/endpoint.js';
|
import { getEndpointAddressOrDispatchError } from '../../utils/endpoint.js';
|
||||||
import {
|
import {
|
||||||
dispatchMediaLoadedEvent,
|
dispatchMediaLoadedEvent,
|
||||||
dispatchMediaPauseEvent,
|
dispatchMediaPauseEvent,
|
||||||
dispatchMediaPlayEvent,
|
dispatchMediaPlayEvent,
|
||||||
} from '../../utils/media-info.js';
|
} from '../../utils/media-info.js';
|
||||||
import { dispatchErrorMessageEvent } from '../message.js';
|
|
||||||
import { Timer } from '../../utils/timer.js';
|
import { Timer } from '../../utils/timer.js';
|
||||||
|
import { dispatchErrorMessageEvent } from '../message.js';
|
||||||
|
|
||||||
// Number of seconds a signed URL is valid for.
|
// Number of seconds a signed URL is valid for.
|
||||||
const JSMPEG_URL_SIGN_EXPIRY_SECONDS = 24 * 60 * 60;
|
const JSMPEG_URL_SIGN_EXPIRY_SECONDS = 24 * 60 * 60;
|
||||||
|
|||||||
@@ -3,14 +3,10 @@ import { HomeAssistant } from 'custom-card-helpers';
|
|||||||
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { CameraEndpoints } from '../../camera-manager/types.js';
|
import { CameraEndpoints } from '../../camera-manager/types.js';
|
||||||
|
import { CameraConfig, CardWideConfig } from '../../config/types.js';
|
||||||
import { localize } from '../../localize/localize.js';
|
import { localize } from '../../localize/localize.js';
|
||||||
import liveWebRTCCardStyle from '../../scss/live-webrtc-card.scss';
|
import liveWebRTCCardStyle from '../../scss/live-webrtc-card.scss';
|
||||||
import {
|
import { FrigateCardError, FrigateCardMediaPlayer } from '../../types.js';
|
||||||
CameraConfig,
|
|
||||||
CardWideConfig,
|
|
||||||
FrigateCardError,
|
|
||||||
FrigateCardMediaPlayer,
|
|
||||||
} from '../../types.js';
|
|
||||||
import { mayHaveAudio } from '../../utils/audio.js';
|
import { mayHaveAudio } from '../../utils/audio.js';
|
||||||
import {
|
import {
|
||||||
dispatchMediaLoadedEvent,
|
dispatchMediaLoadedEvent,
|
||||||
|
|||||||
+12
-10
@@ -17,28 +17,30 @@ import { createRef, Ref, ref } from 'lit/directives/ref.js';
|
|||||||
import { CameraManager } from '../../camera-manager/manager.js';
|
import { CameraManager } from '../../camera-manager/manager.js';
|
||||||
import { CameraConfigs, CameraEndpoints } from '../../camera-manager/types.js';
|
import { CameraConfigs, CameraEndpoints } from '../../camera-manager/types.js';
|
||||||
import {
|
import {
|
||||||
ConditionsManagerEpoch,
|
CameraConfig,
|
||||||
getOverriddenConfig,
|
CardWideConfig,
|
||||||
} from '../../utils/card-controller/conditions-manager.js';
|
frigateCardConfigDefaults,
|
||||||
|
LiveConfig,
|
||||||
|
LiveOverrides,
|
||||||
|
LiveProvider,
|
||||||
|
TransitionEffect,
|
||||||
|
} from '../../config/types.js';
|
||||||
import { localize } from '../../localize/localize.js';
|
import { localize } from '../../localize/localize.js';
|
||||||
import basicBlockStyle from '../../scss/basic-block.scss';
|
import basicBlockStyle from '../../scss/basic-block.scss';
|
||||||
import liveCarouselStyle from '../../scss/live-carousel.scss';
|
import liveCarouselStyle from '../../scss/live-carousel.scss';
|
||||||
import liveProviderStyle from '../../scss/live-provider.scss';
|
import liveProviderStyle from '../../scss/live-provider.scss';
|
||||||
import {
|
import {
|
||||||
CameraConfig,
|
|
||||||
CardWideConfig,
|
|
||||||
ExtendedHomeAssistant,
|
ExtendedHomeAssistant,
|
||||||
frigateCardConfigDefaults,
|
|
||||||
FrigateCardMediaPlayer,
|
FrigateCardMediaPlayer,
|
||||||
LiveConfig,
|
|
||||||
LiveOverrides,
|
|
||||||
LiveProvider,
|
|
||||||
MediaLoadedInfo,
|
MediaLoadedInfo,
|
||||||
Message,
|
Message,
|
||||||
TransitionEffect,
|
|
||||||
} from '../../types.js';
|
} from '../../types.js';
|
||||||
import { stopEventFromActivatingCardWideActions } from '../../utils/action.js';
|
import { stopEventFromActivatingCardWideActions } from '../../utils/action.js';
|
||||||
import { contentsChanged } from '../../utils/basic.js';
|
import { contentsChanged } from '../../utils/basic.js';
|
||||||
|
import {
|
||||||
|
ConditionsManagerEpoch,
|
||||||
|
getOverriddenConfig,
|
||||||
|
} from '../../utils/card-controller/conditions-manager.js';
|
||||||
import { CarouselSelected } from '../../utils/embla/carousel-controller.js';
|
import { CarouselSelected } from '../../utils/embla/carousel-controller.js';
|
||||||
import { AutoLazyLoad } from '../../utils/embla/plugins/auto-lazy-load/auto-lazy-load.js';
|
import { AutoLazyLoad } from '../../utils/embla/plugins/auto-lazy-load/auto-lazy-load.js';
|
||||||
import { AutoMediaActions } from '../../utils/embla/plugins/auto-media-actions/auto-media-actions.js';
|
import { AutoMediaActions } from '../../utils/embla/plugins/auto-media-actions/auto-media-actions.js';
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
import { ScopedRegistryHost } from '@lit-labs/scoped-registry-mixin';
|
||||||
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
|
import endOfDay from 'date-fns/endOfDay';
|
||||||
|
import endOfMonth from 'date-fns/endOfMonth';
|
||||||
|
import endOfYesterday from 'date-fns/endOfYesterday';
|
||||||
|
import endOfToday from 'date-fns/esm/endOfToday';
|
||||||
|
import startOfToday from 'date-fns/esm/startOfToday';
|
||||||
|
import format from 'date-fns/format';
|
||||||
|
import parse from 'date-fns/parse';
|
||||||
|
import startOfDay from 'date-fns/startOfDay';
|
||||||
|
import startOfYesterday from 'date-fns/startOfYesterday';
|
||||||
|
import sub from 'date-fns/sub';
|
||||||
import {
|
import {
|
||||||
CSSResultGroup,
|
CSSResultGroup,
|
||||||
html,
|
html,
|
||||||
@@ -10,35 +22,23 @@ import {
|
|||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
||||||
|
import isEqual from 'lodash-es/isEqual';
|
||||||
|
import orderBy from 'lodash-es/orderBy';
|
||||||
|
import uniqWith from 'lodash-es/uniqWith';
|
||||||
|
import { CameraManager } from '../camera-manager/manager';
|
||||||
import { DateRange } from '../camera-manager/range';
|
import { DateRange } from '../camera-manager/range';
|
||||||
|
import { DataQuery, MediaMetadata, QueryType } from '../camera-manager/types';
|
||||||
|
import { CardWideConfig } from '../config/types';
|
||||||
import { localize } from '../localize/localize';
|
import { localize } from '../localize/localize';
|
||||||
import mediaFilterStyle from '../scss/media-filter.scss';
|
import mediaFilterStyle from '../scss/media-filter.scss';
|
||||||
import { executeMediaQueryForViewWithErrorDispatching } from '../utils/media-to-view.js';
|
|
||||||
import { errorToConsole, formatDate, prettifyTitle } from '../utils/basic';
|
import { errorToConsole, formatDate, prettifyTitle } from '../utils/basic';
|
||||||
import { ScopedRegistryHost } from '@lit-labs/scoped-registry-mixin';
|
import { executeMediaQueryForViewWithErrorDispatching } from '../utils/media-to-view.js';
|
||||||
import './select';
|
import { EventMediaQueries, RecordingMediaQueries } from '../view/media-queries';
|
||||||
import { FrigateCardSelect, SelectOption, SelectValues } from './select';
|
|
||||||
import uniqWith from 'lodash-es/uniqWith';
|
|
||||||
import sub from 'date-fns/sub';
|
|
||||||
import endOfDay from 'date-fns/endOfDay';
|
|
||||||
import endOfYesterday from 'date-fns/endOfYesterday';
|
|
||||||
import endOfToday from 'date-fns/esm/endOfToday';
|
|
||||||
import startOfToday from 'date-fns/esm/startOfToday';
|
|
||||||
import startOfDay from 'date-fns/startOfDay';
|
|
||||||
import startOfYesterday from 'date-fns/startOfYesterday';
|
|
||||||
import parse from 'date-fns/parse';
|
|
||||||
import { MediaQueriesClassifier } from '../view/media-queries-classifier';
|
import { MediaQueriesClassifier } from '../view/media-queries-classifier';
|
||||||
import { View } from '../view/view';
|
import { View } from '../view/view';
|
||||||
import { CameraManager } from '../camera-manager/manager';
|
import './select';
|
||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { FrigateCardSelect, SelectOption, SelectValues } from './select';
|
||||||
import { DataQuery, MediaMetadata, QueryType } from '../camera-manager/types';
|
|
||||||
import format from 'date-fns/format';
|
|
||||||
import endOfMonth from 'date-fns/endOfMonth';
|
|
||||||
import isEqual from 'lodash-es/isEqual';
|
|
||||||
import { EventMediaQueries, RecordingMediaQueries } from '../view/media-queries';
|
|
||||||
import './select.js';
|
import './select.js';
|
||||||
import orderBy from 'lodash-es/orderBy';
|
|
||||||
import { CardWideConfig } from '../types';
|
|
||||||
|
|
||||||
interface MediaFilterCoreDefaults {
|
interface MediaFilterCoreDefaults {
|
||||||
cameraIDs?: string[];
|
cameraIDs?: string[];
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import {
|
|||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
import { createRef, ref, Ref } from 'lit/directives/ref.js';
|
||||||
|
import { ViewDisplayConfig } from '../config/types';
|
||||||
import mediaGridStyle from '../scss/media-grid.scss';
|
import mediaGridStyle from '../scss/media-grid.scss';
|
||||||
import { ViewDisplayConfig } from '../types.js';
|
|
||||||
import { MediaGridController } from '../utils/media-grid-controller.js';
|
import { MediaGridController } from '../utils/media-grid-controller.js';
|
||||||
|
|
||||||
@customElement('frigate-card-media-grid')
|
@customElement('frigate-card-media-grid')
|
||||||
|
|||||||
+10
-11
@@ -1,10 +1,10 @@
|
|||||||
import { HASSDomEvent, HomeAssistant } from 'custom-card-helpers';
|
import { HASSDomEvent, HomeAssistant } from 'custom-card-helpers';
|
||||||
import {
|
import {
|
||||||
CSSResultGroup,
|
CSSResultGroup,
|
||||||
html,
|
|
||||||
LitElement,
|
LitElement,
|
||||||
PropertyValues,
|
PropertyValues,
|
||||||
TemplateResult,
|
TemplateResult,
|
||||||
|
html,
|
||||||
unsafeCSS,
|
unsafeCSS,
|
||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property, state } from 'lit/decorators.js';
|
import { customElement, property, state } from 'lit/decorators.js';
|
||||||
@@ -12,26 +12,25 @@ import { classMap } from 'lit/directives/class-map.js';
|
|||||||
import { ifDefined } from 'lit/directives/if-defined.js';
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
||||||
import { styleMap } from 'lit/directives/style-map.js';
|
import { styleMap } from 'lit/directives/style-map.js';
|
||||||
import { actionHandler } from '../action-handler-directive.js';
|
import { actionHandler } from '../action-handler-directive.js';
|
||||||
import menuStyle from '../scss/menu.scss';
|
import { FRIGATE_ICON_SVG_PATH } from '../camera-manager/frigate/icon.js';
|
||||||
import type {
|
import type {
|
||||||
ActionsConfig,
|
|
||||||
ActionType,
|
ActionType,
|
||||||
MenuButton,
|
ActionsConfig,
|
||||||
MenuConfig,
|
MenuConfig,
|
||||||
MenuItem,
|
MenuItem,
|
||||||
StateParameters,
|
} from '../config/types.js';
|
||||||
} from '../types.js';
|
import { FRIGATE_BUTTON_MENU_ICON } from '../const.js';
|
||||||
|
import menuStyle from '../scss/menu.scss';
|
||||||
|
import type { StateParameters } from '../types.js';
|
||||||
import {
|
import {
|
||||||
convertActionToFrigateCardCustomAction,
|
convertActionToFrigateCardCustomAction,
|
||||||
frigateCardHandleActionConfig,
|
frigateCardHandleActionConfig,
|
||||||
frigateCardHasAction,
|
frigateCardHasAction,
|
||||||
getActionConfigGivenAction,
|
getActionConfigGivenAction,
|
||||||
} from '../utils/action.js';
|
} from '../utils/action.js';
|
||||||
import { FRIGATE_ICON_SVG_PATH } from '../camera-manager/frigate/icon.js';
|
|
||||||
import { refreshDynamicStateParameters } from '../utils/ha';
|
import { refreshDynamicStateParameters } from '../utils/ha';
|
||||||
import './submenu.js';
|
|
||||||
import { EntityRegistryManager } from '../utils/ha/entity-registry/index.js';
|
import { EntityRegistryManager } from '../utils/ha/entity-registry/index.js';
|
||||||
import { FRIGATE_BUTTON_MENU_ICON } from '../const.js';
|
import './submenu.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A menu for the FrigateCard.
|
* A menu for the FrigateCard.
|
||||||
@@ -62,7 +61,7 @@ export class FrigateCardMenu extends LitElement {
|
|||||||
protected _menuConfig?: MenuConfig;
|
protected _menuConfig?: MenuConfig;
|
||||||
|
|
||||||
@property({ attribute: false })
|
@property({ attribute: false })
|
||||||
public buttons: MenuButton[] = [];
|
public buttons: MenuItem[] = [];
|
||||||
|
|
||||||
@property({ attribute: false })
|
@property({ attribute: false })
|
||||||
public entityRegistryManager?: EntityRegistryManager;
|
public entityRegistryManager?: EntityRegistryManager;
|
||||||
@@ -228,7 +227,7 @@ export class FrigateCardMenu extends LitElement {
|
|||||||
* @param button The button configuration to render.
|
* @param button The button configuration to render.
|
||||||
* @returns A rendered template or void.
|
* @returns A rendered template or void.
|
||||||
*/
|
*/
|
||||||
protected _renderButton(button: MenuButton): TemplateResult | void {
|
protected _renderButton(button: MenuItem): TemplateResult | void {
|
||||||
if (button.type === 'custom:frigate-card-menu-submenu') {
|
if (button.type === 'custom:frigate-card-menu-submenu') {
|
||||||
return html` <frigate-card-submenu
|
return html` <frigate-card-submenu
|
||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit
|
|||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { ClassInfo, classMap } from 'lit/directives/class-map.js';
|
import { ClassInfo, classMap } from 'lit/directives/class-map.js';
|
||||||
import { ref, Ref } from 'lit/directives/ref.js';
|
import { ref, Ref } from 'lit/directives/ref.js';
|
||||||
|
import { CardWideConfig } from '../config/types.js';
|
||||||
import { TROUBLESHOOTING_URL } from '../const.js';
|
import { TROUBLESHOOTING_URL } from '../const.js';
|
||||||
import { localize } from '../localize/localize.js';
|
import { localize } from '../localize/localize.js';
|
||||||
import messageStyle from '../scss/message.scss';
|
import messageStyle from '../scss/message.scss';
|
||||||
import { CardWideConfig, FrigateCardError, Message, MessageType } from '../types.js';
|
import { FrigateCardError, Message, MessageType } from '../types.js';
|
||||||
import { dispatchFrigateCardEvent } from '../utils/basic.js';
|
import { dispatchFrigateCardEvent } from '../utils/basic.js';
|
||||||
|
|
||||||
@customElement('frigate-card-message')
|
@customElement('frigate-card-message')
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { CSSResultGroup, LitElement, TemplateResult, html, unsafeCSS } from 'lit';
|
import { CSSResultGroup, LitElement, TemplateResult, html, unsafeCSS } from 'lit';
|
||||||
import { customElement, property, state } from 'lit/decorators.js';
|
import { customElement, property, state } from 'lit/decorators.js';
|
||||||
import { classMap } from 'lit/directives/class-map.js';
|
import { classMap } from 'lit/directives/class-map.js';
|
||||||
|
import { NextPreviousControlConfig } from '../config/types.js';
|
||||||
import { NextPreviousControlConfig } from '../types.js';
|
|
||||||
|
|
||||||
import controlStyle from '../scss/next-previous-control.scss';
|
import controlStyle from '../scss/next-previous-control.scss';
|
||||||
import { createFetchThumbnailTask } from '../utils/thumbnail.js';
|
|
||||||
import { HomeAssistant } from 'custom-card-helpers';
|
|
||||||
import { renderTask } from '../utils/task.js';
|
import { renderTask } from '../utils/task.js';
|
||||||
|
import { createFetchThumbnailTask } from '../utils/thumbnail.js';
|
||||||
|
|
||||||
@customElement('frigate-card-next-previous-control')
|
@customElement('frigate-card-next-previous-control')
|
||||||
export class FrigateCardNextPreviousControl extends LitElement {
|
export class FrigateCardNextPreviousControl extends LitElement {
|
||||||
|
|||||||
@@ -11,13 +11,9 @@ import { customElement, property, state } from 'lit/decorators.js';
|
|||||||
import { ifDefined } from 'lit/directives/if-defined.js';
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
||||||
import { StyleInfo, styleMap } from 'lit/directives/style-map.js';
|
import { StyleInfo, styleMap } from 'lit/directives/style-map.js';
|
||||||
import { actionHandler } from '../action-handler-directive.js';
|
import { actionHandler } from '../action-handler-directive.js';
|
||||||
|
import { MenuSubmenu, MenuSubmenuItem, MenuSubmenuSelect } from '../config/types.js';
|
||||||
import submenuStyle from '../scss/submenu.scss';
|
import submenuStyle from '../scss/submenu.scss';
|
||||||
import {
|
import { StateParameters } from '../types.js';
|
||||||
MenuSubmenu,
|
|
||||||
MenuSubmenuItem,
|
|
||||||
MenuSubmenuSelect,
|
|
||||||
StateParameters,
|
|
||||||
} from '../types.js';
|
|
||||||
import {
|
import {
|
||||||
frigateCardHasAction,
|
frigateCardHasAction,
|
||||||
stopEventFromActivatingCardWideActions,
|
stopEventFromActivatingCardWideActions,
|
||||||
@@ -39,7 +35,9 @@ export class FrigateCardSubmenu extends LitElement {
|
|||||||
if (!this.hass) {
|
if (!this.hass) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const stateParameters = refreshDynamicStateParameters(this.hass, { ...item } as StateParameters);
|
const stateParameters = refreshDynamicStateParameters(this.hass, {
|
||||||
|
...item,
|
||||||
|
} as StateParameters);
|
||||||
const getIcon = (stateParameters: StateParameters): TemplateResult => {
|
const getIcon = (stateParameters: StateParameters): TemplateResult => {
|
||||||
if (stateParameters.icon) {
|
if (stateParameters.icon) {
|
||||||
return html` <ha-icon
|
return html` <ha-icon
|
||||||
@@ -95,7 +93,7 @@ export class FrigateCardSubmenu extends LitElement {
|
|||||||
@click=${(ev) => stopEventFromActivatingCardWideActions(ev)}
|
@click=${(ev) => stopEventFromActivatingCardWideActions(ev)}
|
||||||
>
|
>
|
||||||
<ha-icon-button
|
<ha-icon-button
|
||||||
style="${styleMap(this.submenu.style as StyleInfo || {})}"
|
style="${styleMap((this.submenu.style as StyleInfo) || {})}"
|
||||||
class="button"
|
class="button"
|
||||||
slot="trigger"
|
slot="trigger"
|
||||||
.label=${this.submenu.title || ''}
|
.label=${this.submenu.title || ''}
|
||||||
|
|||||||
@@ -8,14 +8,13 @@ import {
|
|||||||
} from 'lit';
|
} from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { CameraManager } from '../camera-manager/manager.js';
|
import { CameraManager } from '../camera-manager/manager.js';
|
||||||
import basicBlockStyle from '../scss/basic-block.scss';
|
|
||||||
import {
|
import {
|
||||||
CardWideConfig,
|
CardWideConfig,
|
||||||
ClipsOrSnapshotsOrAll,
|
|
||||||
ExtendedHomeAssistant,
|
|
||||||
MiniTimelineControlConfig,
|
MiniTimelineControlConfig,
|
||||||
ThumbnailsControlConfig,
|
ThumbnailsControlConfig,
|
||||||
} from '../types.js';
|
} from '../config/types.js';
|
||||||
|
import basicBlockStyle from '../scss/basic-block.scss';
|
||||||
|
import { ClipsOrSnapshotsOrAll, ExtendedHomeAssistant } from '../types.js';
|
||||||
import { contentsChanged, dispatchFrigateCardEvent } from '../utils/basic.js';
|
import { contentsChanged, dispatchFrigateCardEvent } from '../utils/basic.js';
|
||||||
import { getAllDependentCameras } from '../utils/camera.js';
|
import { getAllDependentCameras } from '../utils/camera.js';
|
||||||
import { changeViewToRecentEventsForCameraAndDependents } from '../utils/media-to-view';
|
import { changeViewToRecentEventsForCameraAndDependents } from '../utils/media-to-view';
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ import {
|
|||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { classMap } from 'lit/directives/class-map.js';
|
import { classMap } from 'lit/directives/class-map.js';
|
||||||
import { CameraManager } from '../camera-manager/manager.js';
|
import { CameraManager } from '../camera-manager/manager.js';
|
||||||
|
import { ThumbnailsControlConfig } from '../config/types.js';
|
||||||
import thumbnailCarouselStyle from '../scss/thumbnail-carousel.scss';
|
import thumbnailCarouselStyle from '../scss/thumbnail-carousel.scss';
|
||||||
import { ExtendedHomeAssistant, ThumbnailsControlConfig } from '../types.js';
|
import { ExtendedHomeAssistant } from '../types.js';
|
||||||
import { stopEventFromActivatingCardWideActions } from '../utils/action.js';
|
import { stopEventFromActivatingCardWideActions } from '../utils/action.js';
|
||||||
import { dispatchFrigateCardEvent } from '../utils/basic.js';
|
import { dispatchFrigateCardEvent } from '../utils/basic.js';
|
||||||
import { CarouselDirection } from '../utils/embla/carousel-controller.js';
|
import { CarouselDirection } from '../utils/embla/carousel-controller.js';
|
||||||
|
|||||||
@@ -30,17 +30,17 @@ import { CameraManager } from '../camera-manager/manager';
|
|||||||
import { rangesOverlap } from '../camera-manager/range';
|
import { rangesOverlap } from '../camera-manager/range';
|
||||||
import { MediaQuery } from '../camera-manager/types';
|
import { MediaQuery } from '../camera-manager/types';
|
||||||
import { convertRangeToCacheFriendlyTimes } from '../camera-manager/util';
|
import { convertRangeToCacheFriendlyTimes } from '../camera-manager/util';
|
||||||
import { localize } from '../localize/localize';
|
|
||||||
import timelineCoreStyle from '../scss/timeline-core.scss';
|
|
||||||
import {
|
import {
|
||||||
CameraConfig,
|
CameraConfig,
|
||||||
CardWideConfig,
|
CardWideConfig,
|
||||||
ExtendedHomeAssistant,
|
|
||||||
frigateCardConfigDefaults,
|
frigateCardConfigDefaults,
|
||||||
FrigateCardView,
|
FrigateCardView,
|
||||||
ThumbnailsControlBaseConfig,
|
ThumbnailsControlBaseConfig,
|
||||||
TimelineCoreConfig,
|
TimelineCoreConfig,
|
||||||
} from '../types';
|
} from '../config/types';
|
||||||
|
import { localize } from '../localize/localize';
|
||||||
|
import timelineCoreStyle from '../scss/timeline-core.scss';
|
||||||
|
import { ExtendedHomeAssistant } from '../types';
|
||||||
import { stopEventFromActivatingCardWideActions } from '../utils/action';
|
import { stopEventFromActivatingCardWideActions } from '../utils/action';
|
||||||
import {
|
import {
|
||||||
contentsChanged,
|
contentsChanged,
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { CameraManager } from '../camera-manager/manager';
|
import { CameraManager } from '../camera-manager/manager';
|
||||||
|
import { CardWideConfig, TimelineConfig } from '../config/types';
|
||||||
import basicBlockStyle from '../scss/basic-block.scss';
|
import basicBlockStyle from '../scss/basic-block.scss';
|
||||||
import { CardWideConfig, ExtendedHomeAssistant, TimelineConfig } from '../types';
|
import { ExtendedHomeAssistant } from '../types';
|
||||||
import { View } from '../view/view';
|
import { View } from '../view/view';
|
||||||
import './surround.js';
|
import './surround.js';
|
||||||
import './timeline-core.js';
|
import './timeline-core.js';
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit';
|
||||||
import { customElement, property } from 'lit/decorators.js';
|
import { customElement, property } from 'lit/decorators.js';
|
||||||
import { createRef, Ref, ref } from 'lit/directives/ref.js';
|
import { createRef, Ref, ref } from 'lit/directives/ref.js';
|
||||||
|
import { TitleControlConfig } from '../config/types';
|
||||||
import titleStyle from '../scss/title-control.scss';
|
import titleStyle from '../scss/title-control.scss';
|
||||||
import { TitleControlConfig } from '../types.js';
|
|
||||||
import { Timer } from '../utils/timer';
|
import { Timer } from '../utils/timer';
|
||||||
import { View } from '../view/view.js';
|
import { View } from '../view/view.js';
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,12 @@ import {
|
|||||||
renderMessage,
|
renderMessage,
|
||||||
renderProgressIndicator,
|
renderProgressIndicator,
|
||||||
} from '../components/message.js';
|
} from '../components/message.js';
|
||||||
|
import {
|
||||||
|
CardWideConfig,
|
||||||
|
frigateCardConfigDefaults,
|
||||||
|
TransitionEffect,
|
||||||
|
ViewerConfig,
|
||||||
|
} from '../config/types.js';
|
||||||
import { localize } from '../localize/localize.js';
|
import { localize } from '../localize/localize.js';
|
||||||
import '../patches/ha-hls-player';
|
import '../patches/ha-hls-player';
|
||||||
import basicBlockStyle from '../scss/basic-block.scss';
|
import basicBlockStyle from '../scss/basic-block.scss';
|
||||||
@@ -23,13 +29,9 @@ import viewerCarouselStyle from '../scss/viewer-carousel.scss';
|
|||||||
import viewerProviderStyle from '../scss/viewer-provider.scss';
|
import viewerProviderStyle from '../scss/viewer-provider.scss';
|
||||||
import viewerStyle from '../scss/viewer.scss';
|
import viewerStyle from '../scss/viewer.scss';
|
||||||
import {
|
import {
|
||||||
CardWideConfig,
|
|
||||||
ExtendedHomeAssistant,
|
ExtendedHomeAssistant,
|
||||||
frigateCardConfigDefaults,
|
|
||||||
FrigateCardMediaPlayer,
|
FrigateCardMediaPlayer,
|
||||||
MediaLoadedInfo,
|
MediaLoadedInfo,
|
||||||
TransitionEffect,
|
|
||||||
ViewerConfig,
|
|
||||||
} from '../types.js';
|
} from '../types.js';
|
||||||
import { stopEventFromActivatingCardWideActions } from '../utils/action.js';
|
import { stopEventFromActivatingCardWideActions } from '../utils/action.js';
|
||||||
import { mayHaveAudio } from '../utils/audio.js';
|
import { mayHaveAudio } from '../utils/audio.js';
|
||||||
|
|||||||
+6
-6
@@ -2,6 +2,12 @@ import cloneDeep from 'lodash-es/cloneDeep';
|
|||||||
import get from 'lodash-es/get';
|
import get from 'lodash-es/get';
|
||||||
import isEqual from 'lodash-es/isEqual';
|
import isEqual from 'lodash-es/isEqual';
|
||||||
import set from 'lodash-es/set';
|
import set from 'lodash-es/set';
|
||||||
|
import {
|
||||||
|
BUTTON_SIZE_MIN,
|
||||||
|
RawFrigateCardConfig,
|
||||||
|
THUMBNAIL_WIDTH_MAX,
|
||||||
|
THUMBNAIL_WIDTH_MIN,
|
||||||
|
} from './config/types';
|
||||||
import {
|
import {
|
||||||
CONF_CAMERAS,
|
CONF_CAMERAS,
|
||||||
CONF_CAMERAS_GLOBAL_IMAGE,
|
CONF_CAMERAS_GLOBAL_IMAGE,
|
||||||
@@ -28,12 +34,6 @@ import {
|
|||||||
CONF_MENU_STYLE,
|
CONF_MENU_STYLE,
|
||||||
CONF_OVERRIDES,
|
CONF_OVERRIDES,
|
||||||
} from './const';
|
} from './const';
|
||||||
import {
|
|
||||||
BUTTON_SIZE_MIN,
|
|
||||||
RawFrigateCardConfig,
|
|
||||||
THUMBNAIL_WIDTH_MAX,
|
|
||||||
THUMBNAIL_WIDTH_MIN,
|
|
||||||
} from './types';
|
|
||||||
import { arrayify } from './utils/basic';
|
import { arrayify } from './utils/basic';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1510
File diff suppressed because it is too large
Load Diff
+11
-11
@@ -16,6 +16,16 @@ import {
|
|||||||
setConfigValue,
|
setConfigValue,
|
||||||
upgradeConfig,
|
upgradeConfig,
|
||||||
} from './config-mgmt.js';
|
} from './config-mgmt.js';
|
||||||
|
import {
|
||||||
|
BUTTON_SIZE_MIN,
|
||||||
|
FRIGATE_MENU_PRIORITY_MAX,
|
||||||
|
FrigateCardConfig,
|
||||||
|
frigateCardConfigDefaults,
|
||||||
|
RawFrigateCardConfig,
|
||||||
|
RawFrigateCardConfigArray,
|
||||||
|
THUMBNAIL_WIDTH_MAX,
|
||||||
|
THUMBNAIL_WIDTH_MIN,
|
||||||
|
} from './config/types.js';
|
||||||
import {
|
import {
|
||||||
CONF_CAMERAS,
|
CONF_CAMERAS,
|
||||||
CONF_CAMERAS_ARRAY_CAMERA_ENTITY,
|
CONF_CAMERAS_ARRAY_CAMERA_ENTITY,
|
||||||
@@ -134,8 +144,8 @@ import {
|
|||||||
CONF_MEDIA_VIEWER_TRANSITION_EFFECT,
|
CONF_MEDIA_VIEWER_TRANSITION_EFFECT,
|
||||||
CONF_MEDIA_VIEWER_ZOOMABLE,
|
CONF_MEDIA_VIEWER_ZOOMABLE,
|
||||||
CONF_MENU_ALIGNMENT,
|
CONF_MENU_ALIGNMENT,
|
||||||
CONF_MENU_BUTTONS,
|
|
||||||
CONF_MENU_BUTTON_SIZE,
|
CONF_MENU_BUTTON_SIZE,
|
||||||
|
CONF_MENU_BUTTONS,
|
||||||
CONF_MENU_POSITION,
|
CONF_MENU_POSITION,
|
||||||
CONF_MENU_STYLE,
|
CONF_MENU_STYLE,
|
||||||
CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR,
|
CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR,
|
||||||
@@ -171,16 +181,6 @@ import {
|
|||||||
import { localize } from './localize/localize.js';
|
import { localize } from './localize/localize.js';
|
||||||
import { setLowPerformanceProfile } from './performance.js';
|
import { setLowPerformanceProfile } from './performance.js';
|
||||||
import frigate_card_editor_style from './scss/editor.scss';
|
import frigate_card_editor_style from './scss/editor.scss';
|
||||||
import {
|
|
||||||
BUTTON_SIZE_MIN,
|
|
||||||
FrigateCardConfig,
|
|
||||||
frigateCardConfigDefaults,
|
|
||||||
FRIGATE_MENU_PRIORITY_MAX,
|
|
||||||
RawFrigateCardConfig,
|
|
||||||
RawFrigateCardConfigArray,
|
|
||||||
THUMBNAIL_WIDTH_MAX,
|
|
||||||
THUMBNAIL_WIDTH_MIN,
|
|
||||||
} from './types.js';
|
|
||||||
import { arrayMove, prettifyTitle } from './utils/basic.js';
|
import { arrayMove, prettifyTitle } from './utils/basic.js';
|
||||||
import { getCameraID } from './utils/camera.js';
|
import { getCameraID } from './utils/camera.js';
|
||||||
import {
|
import {
|
||||||
|
|||||||
+6
-6
@@ -1,10 +1,9 @@
|
|||||||
import { deepRemoveDefaults } from './utils/zod.js';
|
|
||||||
import {
|
|
||||||
frigateCardConfigSchema,
|
|
||||||
RawFrigateCardConfig,
|
|
||||||
PerformanceConfig,
|
|
||||||
} from './types';
|
|
||||||
import { getConfigValue, setConfigValue } from './config-mgmt.js';
|
import { getConfigValue, setConfigValue } from './config-mgmt.js';
|
||||||
|
import {
|
||||||
|
PerformanceConfig,
|
||||||
|
RawFrigateCardConfig,
|
||||||
|
frigateCardConfigSchema,
|
||||||
|
} from './config/types.js';
|
||||||
import {
|
import {
|
||||||
CONF_CAMERAS_GLOBAL_IMAGE_REFRESH_SECONDS,
|
CONF_CAMERAS_GLOBAL_IMAGE_REFRESH_SECONDS,
|
||||||
CONF_CAMERAS_GLOBAL_TRIGGERS_OCCUPANCY,
|
CONF_CAMERAS_GLOBAL_TRIGGERS_OCCUPANCY,
|
||||||
@@ -53,6 +52,7 @@ import {
|
|||||||
CONF_TIMELINE_CONTROLS_THUMBNAILS_SHOW_TIMELINE_CONTROL,
|
CONF_TIMELINE_CONTROLS_THUMBNAILS_SHOW_TIMELINE_CONTROL,
|
||||||
CONF_TIMELINE_SHOW_RECORDINGS,
|
CONF_TIMELINE_SHOW_RECORDINGS,
|
||||||
} from './const.js';
|
} from './const.js';
|
||||||
|
import { deepRemoveDefaults } from './utils/zod.js';
|
||||||
|
|
||||||
// Caution: These values are applied after parsing (since we cannot know the
|
// Caution: These values are applied after parsing (since we cannot know the
|
||||||
// performance profile until afterwards), so there is no validation on these
|
// performance profile until afterwards), so there is no validation on these
|
||||||
|
|||||||
+4
-1473
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -11,7 +11,7 @@ import {
|
|||||||
FrigateCardCustomAction,
|
FrigateCardCustomAction,
|
||||||
frigateCardCustomActionSchema,
|
frigateCardCustomActionSchema,
|
||||||
ViewDisplayMode,
|
ViewDisplayMode,
|
||||||
} from '../types.js';
|
} from '../config/types.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a generic Action to a FrigateCardCustomAction if it parses correctly.
|
* Convert a generic Action to a FrigateCardCustomAction if it parses correctly.
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import { CameraManager } from '../camera-manager/manager.js';
|
import { CameraManager } from '../camera-manager/manager.js';
|
||||||
import { CameraConfig, RawFrigateCardConfig } from '../types.js';
|
import { CameraConfig, RawFrigateCardConfig } from '../config/types.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a camera id.
|
* Get a camera id.
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import {
|
import {
|
||||||
Actions,
|
Actions,
|
||||||
ActionsConfig, FrigateCardCustomAction, FRIGATE_CARD_VIEW_DEFAULT
|
ActionsConfig,
|
||||||
} from '../../types.js';
|
FRIGATE_CARD_VIEW_DEFAULT,
|
||||||
|
FrigateCardCustomAction
|
||||||
|
} from '../../config/types.js';
|
||||||
import {
|
import {
|
||||||
convertActionToFrigateCardCustomAction,
|
convertActionToFrigateCardCustomAction,
|
||||||
frigateCardHandleActionConfig,
|
frigateCardHandleActionConfig,
|
||||||
@@ -9,6 +11,8 @@ import {
|
|||||||
} from '../action.js';
|
} from '../action.js';
|
||||||
import { getStreamCameraID } from '../substream.js';
|
import { getStreamCameraID } from '../substream.js';
|
||||||
import { CardActionsManagerAPI } from './types.js';
|
import { CardActionsManagerAPI } from './types.js';
|
||||||
|
import { getStreamCameraID } from '../substream.js';
|
||||||
|
import { CardActionsManagerAPI } from './types.js';
|
||||||
|
|
||||||
export class ActionsManager {
|
export class ActionsManager {
|
||||||
protected _api: CardActionsManagerAPI;
|
protected _api: CardActionsManagerAPI;
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
|
import { Automation, AutomationActions, Automations } from '../../config/types.js';
|
||||||
import { localize } from '../../localize/localize.js';
|
import { localize } from '../../localize/localize.js';
|
||||||
import {
|
|
||||||
Automation,
|
|
||||||
AutomationActions,
|
|
||||||
Automations,
|
|
||||||
} from '../../types.js';
|
|
||||||
import { frigateCardHandleAction } from '../action.js';
|
import { frigateCardHandleAction } from '../action.js';
|
||||||
import { CardAutomationsAPI } from './types.js';
|
import { CardAutomationsAPI } from './types.js';
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import {
|
|||||||
frigateConditionalSchema,
|
frigateConditionalSchema,
|
||||||
OverrideConfigurationKey,
|
OverrideConfigurationKey,
|
||||||
RawFrigateCardConfig,
|
RawFrigateCardConfig,
|
||||||
ViewDisplayMode,
|
ViewDisplayMode
|
||||||
} from '../../types';
|
} from '../../config/types';
|
||||||
import { CardConditionAPI } from './types';
|
import { CardConditionAPI } from './types';
|
||||||
|
|
||||||
interface ConditionState {
|
interface ConditionState {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import isEqual from 'lodash-es/isEqual';
|
import isEqual from 'lodash-es/isEqual';
|
||||||
import { isConfigUpgradeable } from '../../config-mgmt';
|
import { isConfigUpgradeable } from '../../config-mgmt';
|
||||||
import { localize } from '../../localize/localize';
|
|
||||||
import { setLowPerformanceProfile } from '../../performance.js';
|
|
||||||
import {
|
import {
|
||||||
CardWideConfig,
|
CardWideConfig,
|
||||||
FrigateCardConfig,
|
FrigateCardConfig,
|
||||||
frigateCardConfigSchema,
|
frigateCardConfigSchema,
|
||||||
RawFrigateCardConfig,
|
RawFrigateCardConfig
|
||||||
} from '../../types';
|
} from '../../config/types';
|
||||||
|
import { localize } from '../../localize/localize';
|
||||||
|
import { setLowPerformanceProfile } from '../../performance.js';
|
||||||
import { getParseErrorPaths } from '../zod.js';
|
import { getParseErrorPaths } from '../zod.js';
|
||||||
import { getOverriddenConfig } from './conditions-manager';
|
import { getOverriddenConfig } from './conditions-manager';
|
||||||
import { InitializationAspect } from './initialization-manager';
|
import { InitializationAspect } from './initialization-manager';
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
// TODO: executeMediaQueryForView should not need a HTMLElement host parameter see the view-manager.ts call in particular.
|
|
||||||
// TODO: Split out zod schema and add tests for config parsing (e.g. view.scan.show_status argument was missing)
|
|
||||||
|
|
||||||
import { LovelaceCardEditor } from 'custom-card-helpers';
|
import { LovelaceCardEditor } from 'custom-card-helpers';
|
||||||
import { ReactiveController } from 'lit';
|
import { ReactiveController } from 'lit';
|
||||||
import { CameraManager } from '../../camera-manager/manager';
|
import { CameraManager } from '../../camera-manager/manager';
|
||||||
import { FrigateCardConfig } from '../../types';
|
import { FrigateCardConfig } from '../../config/types';
|
||||||
import { EntityRegistryManager } from '../ha/entity-registry';
|
import { EntityRegistryManager } from '../ha/entity-registry';
|
||||||
import { EntityCache } from '../ha/entity-registry/cache';
|
import { EntityCache } from '../ha/entity-registry/cache';
|
||||||
import { ResolvedMediaCache } from '../ha/resolved-media';
|
import { ResolvedMediaCache } from '../ha/resolved-media';
|
||||||
@@ -35,8 +32,8 @@ import { StyleManager } from './style-manager';
|
|||||||
import { TriggersManager } from './triggers-manager';
|
import { TriggersManager } from './triggers-manager';
|
||||||
import {
|
import {
|
||||||
CardActionsManagerAPI,
|
CardActionsManagerAPI,
|
||||||
CardAutomationsAPI,
|
|
||||||
CardAutoRefreshAPI,
|
CardAutoRefreshAPI,
|
||||||
|
CardAutomationsAPI,
|
||||||
CardCameraAPI,
|
CardCameraAPI,
|
||||||
CardCameraURLAPI,
|
CardCameraURLAPI,
|
||||||
CardConditionAPI,
|
CardConditionAPI,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
import { CameraConfig } from '../../config/types';
|
||||||
import { localize } from '../../localize/localize';
|
import { localize } from '../../localize/localize';
|
||||||
import { CameraConfig, ExtendedHomeAssistant } from '../../types';
|
import { ExtendedHomeAssistant } from '../../types';
|
||||||
import { hasHAConnectionStateChanged, isHassDifferent } from '../ha';
|
import { hasHAConnectionStateChanged, isHassDifferent } from '../ha';
|
||||||
import { CardHASSAPI } from './types';
|
import { CardHASSAPI } from './types';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FrigateCardCustomAction, FrigateCardViewAction } from '../../types';
|
import { FrigateCardCustomAction, FrigateCardViewAction } from '../../config/types';
|
||||||
import { createFrigateCardCustomAction } from '../action.js';
|
import { createFrigateCardCustomAction } from '../action.js';
|
||||||
import { CardQueryStringAPI } from './types';
|
import { CardQueryStringAPI } from './types';
|
||||||
import { ViewManagerSetViewParameters } from './view-manager';
|
import { ViewManagerSetViewParameters } from './view-manager';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
import { FrigateCardConfig } from '../../config/types';
|
||||||
import { setPerformanceCSSStyles } from '../../performance';
|
import { setPerformanceCSSStyles } from '../../performance';
|
||||||
import { FrigateCardConfig } from '../../types';
|
|
||||||
import { View } from '../../view/view';
|
import { View } from '../../view/view';
|
||||||
import { setOrRemoveAttribute } from '../basic';
|
import { setOrRemoveAttribute } from '../basic';
|
||||||
import { CardStyleAPI } from './types';
|
import { CardStyleAPI } from './types';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ViewContext } from 'view';
|
import { ViewContext } from 'view';
|
||||||
import { FrigateCardConfig, FrigateCardView, ViewDisplayMode } from '../../types';
|
import { FrigateCardConfig, FrigateCardView, ViewDisplayMode } from '../../config/types';
|
||||||
import { View } from '../../view/view';
|
import { View } from '../../view/view';
|
||||||
import { getAllDependentCameras } from '../camera';
|
import { getAllDependentCameras } from '../camera';
|
||||||
import { log } from '../debug';
|
import { log } from '../debug';
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
import { CardWideConfig } from '../types';
|
import { CardWideConfig } from '../config/types';
|
||||||
|
|
||||||
export const log = (cardWideConfig?: CardWideConfig | null, ...args: unknown[]) => {
|
export const log = (cardWideConfig?: CardWideConfig | null, ...args: unknown[]) => {
|
||||||
if (cardWideConfig?.debug?.logging) {
|
if (cardWideConfig?.debug?.logging) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import pkg from '../../package.json';
|
import pkg from '../../package.json';
|
||||||
|
import { RawFrigateCardConfig } from '../config/types';
|
||||||
import { getLanguage } from '../localize/localize';
|
import { getLanguage } from '../localize/localize';
|
||||||
import { RawFrigateCardConfig } from '../types';
|
|
||||||
import { DeviceList, getAllDevices } from './ha/device-registry';
|
import { DeviceList, getAllDevices } from './ha/device-registry';
|
||||||
|
|
||||||
type FrigateVersions = Record<string, string>;
|
type FrigateVersions = Record<string, string>;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import EmblaCarousel, { EmblaCarouselType } from 'embla-carousel';
|
|||||||
import { WheelGesturesPlugin } from 'embla-carousel-wheel-gestures';
|
import { WheelGesturesPlugin } from 'embla-carousel-wheel-gestures';
|
||||||
import { CreatePluginType, LoosePluginType } from 'embla-carousel/components/Plugins';
|
import { CreatePluginType, LoosePluginType } from 'embla-carousel/components/Plugins';
|
||||||
import isEqual from 'lodash-es/isEqual';
|
import isEqual from 'lodash-es/isEqual';
|
||||||
import { TransitionEffect } from '../../types';
|
import { TransitionEffect } from '../../config/types';
|
||||||
import { dispatchFrigateCardEvent, getChildrenFromElement } from '../basic.js';
|
import { dispatchFrigateCardEvent, getChildrenFromElement } from '../basic.js';
|
||||||
|
|
||||||
export interface CarouselSelected {
|
export interface CarouselSelected {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { EmblaCarouselType, EmblaEventType } from 'embla-carousel';
|
|||||||
import { CreateOptionsType } from 'embla-carousel/components/Options';
|
import { CreateOptionsType } from 'embla-carousel/components/Options';
|
||||||
import { OptionsHandlerType } from 'embla-carousel/components/OptionsHandler';
|
import { OptionsHandlerType } from 'embla-carousel/components/OptionsHandler';
|
||||||
import { CreatePluginType, LoosePluginType } from 'embla-carousel/components/Plugins';
|
import { CreatePluginType, LoosePluginType } from 'embla-carousel/components/Plugins';
|
||||||
import { LazyUnloadCondition } from '../../../../types';
|
import { LazyUnloadCondition } from '../../../../config/types';
|
||||||
|
|
||||||
declare module 'embla-carousel/components/Plugins' {
|
declare module 'embla-carousel/components/Plugins' {
|
||||||
interface EmblaPluginsType {
|
interface EmblaPluginsType {
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import {
|
|||||||
AutoPauseCondition,
|
AutoPauseCondition,
|
||||||
AutoPlayCondition,
|
AutoPlayCondition,
|
||||||
AutoUnmuteCondition,
|
AutoUnmuteCondition,
|
||||||
FrigateCardMediaPlayer,
|
} from '../../../../config/types.js';
|
||||||
} from '../../../../types.js';
|
import { FrigateCardMediaPlayer } from '../../../../types.js';
|
||||||
|
|
||||||
declare module 'embla-carousel/components/Plugins' {
|
declare module 'embla-carousel/components/Plugins' {
|
||||||
interface EmblaPluginsType {
|
interface EmblaPluginsType {
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import isEqual from 'lodash-es/isEqual';
|
import isEqual from 'lodash-es/isEqual';
|
||||||
import throttle from 'lodash-es/throttle';
|
import throttle from 'lodash-es/throttle';
|
||||||
import Masonry from 'masonry-layout';
|
import Masonry from 'masonry-layout';
|
||||||
import { MediaLoadedInfo, ViewDisplayConfig } from '../types';
|
import { ViewDisplayConfig } from '../config/types';
|
||||||
|
import { MediaLoadedInfo } from '../types';
|
||||||
import {
|
import {
|
||||||
dispatchFrigateCardEvent,
|
dispatchFrigateCardEvent,
|
||||||
getChildrenFromElement,
|
getChildrenFromElement,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { MediaLayoutConfig } from '../types';
|
import { MediaLayoutConfig } from '../config/types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update element style from a media configuration.
|
* Update element style from a media configuration.
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ import { ViewContext } from 'view';
|
|||||||
import { CameraManager } from '../camera-manager/manager';
|
import { CameraManager } from '../camera-manager/manager';
|
||||||
import { MediaQuery } from '../camera-manager/types';
|
import { MediaQuery } from '../camera-manager/types';
|
||||||
import { dispatchFrigateCardErrorEvent } from '../components/message';
|
import { dispatchFrigateCardErrorEvent } from '../components/message';
|
||||||
|
import { CardWideConfig, FrigateCardView } from '../config/types';
|
||||||
import { MEDIA_CHUNK_SIZE_DEFAULT } from '../const';
|
import { MEDIA_CHUNK_SIZE_DEFAULT } from '../const';
|
||||||
import { CardWideConfig, ClipsOrSnapshotsOrAll, FrigateCardView } from '../types';
|
import { ClipsOrSnapshotsOrAll } from '../types';
|
||||||
import { ViewMedia } from '../view/media';
|
import { ViewMedia } from '../view/media';
|
||||||
import {
|
import {
|
||||||
EventMediaQueries,
|
EventMediaQueries,
|
||||||
|
|||||||
@@ -1,23 +1,24 @@
|
|||||||
import { HomeAssistant } from 'custom-card-helpers';
|
import { HomeAssistant } from 'custom-card-helpers';
|
||||||
import { StyleInfo } from 'lit/directives/style-map';
|
import { StyleInfo } from 'lit/directives/style-map';
|
||||||
import { CameraManager } from '../camera-manager/manager';
|
import { CameraManager } from '../camera-manager/manager';
|
||||||
|
import {
|
||||||
|
FRIGATE_CARD_VIEWS_USER_SPECIFIED,
|
||||||
|
FrigateCardConfig,
|
||||||
|
FrigateCardCustomAction,
|
||||||
|
MenuItem
|
||||||
|
} from '../config/types';
|
||||||
import { FRIGATE_BUTTON_MENU_ICON } from '../const';
|
import { FRIGATE_BUTTON_MENU_ICON } from '../const';
|
||||||
import { localize } from '../localize/localize.js';
|
import { localize } from '../localize/localize.js';
|
||||||
import {
|
import {
|
||||||
FrigateCardConfig,
|
|
||||||
FrigateCardCustomAction,
|
|
||||||
FRIGATE_CARD_VIEWS_USER_SPECIFIED,
|
|
||||||
MediaLoadedInfo,
|
MediaLoadedInfo,
|
||||||
MenuButton,
|
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { View } from '../view/view';
|
import { View } from '../view/view';
|
||||||
import { createFrigateCardCustomAction } from './action';
|
import { createFrigateCardCustomAction } from './action';
|
||||||
import { getAllDependentCameras } from './camera';
|
import { getAllDependentCameras } from './camera';
|
||||||
import { getEntityIcon, getEntityTitle } from './ha';
|
|
||||||
import { MediaPlayerManager } from './card-controller/media-player-manager';
|
import { MediaPlayerManager } from './card-controller/media-player-manager';
|
||||||
import { MicrophoneManager } from './card-controller/microphone-manager';
|
import { MicrophoneManager } from './card-controller/microphone-manager';
|
||||||
|
import { getEntityIcon, getEntityTitle } from './ha';
|
||||||
import { hasSubstream } from './substream';
|
import { hasSubstream } from './substream';
|
||||||
|
|
||||||
export interface MenuButtonControllerOptions {
|
export interface MenuButtonControllerOptions {
|
||||||
currentMediaLoadedInfo?: MediaLoadedInfo | null;
|
currentMediaLoadedInfo?: MediaLoadedInfo | null;
|
||||||
showCameraUIButton?: boolean;
|
showCameraUIButton?: boolean;
|
||||||
@@ -29,15 +30,15 @@ export interface MenuButtonControllerOptions {
|
|||||||
|
|
||||||
export class MenuButtonController {
|
export class MenuButtonController {
|
||||||
// Array of dynamic menu buttons to be added to menu.
|
// Array of dynamic menu buttons to be added to menu.
|
||||||
protected _dynamicMenuButtons: MenuButton[] = [];
|
protected _dynamicMenuButtons: MenuItem[] = [];
|
||||||
|
|
||||||
public addDynamicMenuButton(button: MenuButton): void {
|
public addDynamicMenuButton(button: MenuItem): void {
|
||||||
if (!this._dynamicMenuButtons.includes(button)) {
|
if (!this._dynamicMenuButtons.includes(button)) {
|
||||||
this._dynamicMenuButtons.push(button);
|
this._dynamicMenuButtons.push(button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public removeDynamicMenuButton(button: MenuButton): void {
|
public removeDynamicMenuButton(button: MenuItem): void {
|
||||||
this._dynamicMenuButtons = this._dynamicMenuButtons.filter(
|
this._dynamicMenuButtons = this._dynamicMenuButtons.filter(
|
||||||
(existingButton) => existingButton != button,
|
(existingButton) => existingButton != button,
|
||||||
);
|
);
|
||||||
@@ -53,7 +54,7 @@ export class MenuButtonController {
|
|||||||
cameraManager: CameraManager,
|
cameraManager: CameraManager,
|
||||||
view: View,
|
view: View,
|
||||||
options?: MenuButtonControllerOptions,
|
options?: MenuButtonControllerOptions,
|
||||||
): MenuButton[] {
|
): MenuItem[] {
|
||||||
const visibleCameras = cameraManager.getStore().getVisibleCameras();
|
const visibleCameras = cameraManager.getStore().getVisibleCameras();
|
||||||
const selectedCameraID = view.camera;
|
const selectedCameraID = view.camera;
|
||||||
const selectedCameraConfig = cameraManager
|
const selectedCameraConfig = cameraManager
|
||||||
@@ -68,7 +69,7 @@ export class MenuButtonController {
|
|||||||
? cameraManager?.getMediaCapabilities(selectedMedia)
|
? cameraManager?.getMediaCapabilities(selectedMedia)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
const buttons: MenuButton[] = [];
|
const buttons: MenuItem[] = [];
|
||||||
buttons.push({
|
buttons.push({
|
||||||
// Use a magic icon value that the menu will use to render the custom
|
// Use a magic icon value that the menu will use to render the custom
|
||||||
// Frigate icon.
|
// Frigate icon.
|
||||||
@@ -451,7 +452,7 @@ export class MenuButtonController {
|
|||||||
protected _getStyleFromActions(
|
protected _getStyleFromActions(
|
||||||
config: FrigateCardConfig,
|
config: FrigateCardConfig,
|
||||||
view: View,
|
view: View,
|
||||||
button: MenuButton,
|
button: MenuItem,
|
||||||
options?: MenuButtonControllerOptions,
|
options?: MenuButtonControllerOptions,
|
||||||
): StyleInfo {
|
): StyleInfo {
|
||||||
for (const actionSet of [
|
for (const actionSet of [
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ import {
|
|||||||
dispatchFrigateCardErrorEvent,
|
dispatchFrigateCardErrorEvent,
|
||||||
renderProgressIndicator,
|
renderProgressIndicator,
|
||||||
} from '../components/message';
|
} from '../components/message';
|
||||||
import { CardWideConfig } from '../types';
|
import { CardWideConfig } from '../config/types';
|
||||||
import { errorToConsole } from './basic';
|
import { errorToConsole } from './basic';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
import { ViewContext } from 'view';
|
import { ViewContext } from 'view';
|
||||||
import { ClipsOrSnapshots, FrigateCardView, ViewDisplayMode } from '../types.js';
|
import { FrigateCardView, ViewDisplayMode } from '../config/types.js';
|
||||||
|
import { ClipsOrSnapshots } from '../types.js';
|
||||||
import { dispatchFrigateCardEvent } from '../utils/basic.js';
|
import { dispatchFrigateCardEvent } from '../utils/basic.js';
|
||||||
import { MediaQueries } from './media-queries';
|
import { MediaQueries } from './media-queries';
|
||||||
import { MediaQueriesClassifier } from './media-queries-classifier.js';
|
import { MediaQueriesClassifier } from './media-queries-classifier.js';
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { FrigateCameraManagerEngine } from '../../src/camera-manager/frigate/eng
|
|||||||
import { GenericCameraManagerEngine } from '../../src/camera-manager/generic/engine-generic';
|
import { GenericCameraManagerEngine } from '../../src/camera-manager/generic/engine-generic';
|
||||||
import { MotionEyeCameraManagerEngine } from '../../src/camera-manager/motioneye/engine-motioneye';
|
import { MotionEyeCameraManagerEngine } from '../../src/camera-manager/motioneye/engine-motioneye';
|
||||||
import { Engine } from '../../src/camera-manager/types.js';
|
import { Engine } from '../../src/camera-manager/types.js';
|
||||||
import { CardWideConfig } from '../../src/types.js';
|
import { CardWideConfig } from '../../src/config/types.js';
|
||||||
import { EntityRegistryManager } from '../../src/utils/ha/entity-registry';
|
import { EntityRegistryManager } from '../../src/utils/ha/entity-registry';
|
||||||
import { EntityCache } from '../../src/utils/ha/entity-registry/cache';
|
import { EntityCache } from '../../src/utils/ha/entity-registry/cache';
|
||||||
import { ResolvedMediaCache } from '../../src/utils/ha/resolved-media';
|
import { ResolvedMediaCache } from '../../src/utils/ha/resolved-media';
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
FrigateRecordingViewMedia,
|
FrigateRecordingViewMedia,
|
||||||
} from '../../../src/camera-manager/frigate/media';
|
} from '../../../src/camera-manager/frigate/media';
|
||||||
import { FrigateEvent, eventSchema } from '../../../src/camera-manager/frigate/types.js';
|
import { FrigateEvent, eventSchema } from '../../../src/camera-manager/frigate/types.js';
|
||||||
import { CameraConfig, RawFrigateCardConfig } from '../../../src/types';
|
import { CameraConfig, RawFrigateCardConfig } from '../../../src/config/types';
|
||||||
import { ViewMedia } from '../../../src/view/media';
|
import { ViewMedia } from '../../../src/view/media';
|
||||||
import { createCameraConfig, createHASS } from '../../test-utils';
|
import { createCameraConfig, createHASS } from '../../test-utils';
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
getRecordingMediaContentID,
|
getRecordingMediaContentID,
|
||||||
getRecordingTitle,
|
getRecordingTitle,
|
||||||
} from '../../../src/camera-manager/frigate/util';
|
} from '../../../src/camera-manager/frigate/util';
|
||||||
import { CameraConfig } from '../../../src/types';
|
import { CameraConfig } from '../../../src/config/types';
|
||||||
import {
|
import {
|
||||||
createCameraConfig,
|
createCameraConfig,
|
||||||
createFrigateEvent,
|
createFrigateEvent,
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import {
|
|||||||
getCameraEntityFromConfig,
|
getCameraEntityFromConfig,
|
||||||
sortMedia,
|
sortMedia,
|
||||||
} from '../../src/camera-manager/util.js';
|
} from '../../src/camera-manager/util.js';
|
||||||
import { CameraConfig, cameraConfigSchema } from '../../src/types.js';
|
import { CameraConfig, cameraConfigSchema } from '../../src/config/types.js';
|
||||||
import { ViewMedia, ViewMediaType } from '../../src/view/media.js';
|
|
||||||
import { TestViewMedia } from '../test-utils.js';
|
import { TestViewMedia } from '../test-utils.js';
|
||||||
|
|
||||||
describe('convertRangeToCacheFriendlyTimes', () => {
|
describe('convertRangeToCacheFriendlyTimes', () => {
|
||||||
|
|||||||
@@ -0,0 +1,421 @@
|
|||||||
|
import { describe, expect, it } from 'vitest';
|
||||||
|
import {
|
||||||
|
conditionalSchema,
|
||||||
|
customSchema,
|
||||||
|
dimensionsConfigSchema,
|
||||||
|
frigateCardCustomActionsBaseSchema,
|
||||||
|
frigateCardPTZSchema
|
||||||
|
} from '../../src/config/types';
|
||||||
|
import { createConfig } from '../test-utils';
|
||||||
|
|
||||||
|
// @vitest-environment jsdom
|
||||||
|
describe('config defaults', () => {
|
||||||
|
it('should be as expected', () => {
|
||||||
|
expect(createConfig()).toEqual({
|
||||||
|
cameras: [],
|
||||||
|
cameras_global: {
|
||||||
|
dependencies: {
|
||||||
|
all_cameras: false,
|
||||||
|
cameras: [],
|
||||||
|
},
|
||||||
|
engine: 'auto',
|
||||||
|
frigate: {
|
||||||
|
client_id: 'frigate',
|
||||||
|
},
|
||||||
|
hide: false,
|
||||||
|
image: {
|
||||||
|
refresh_seconds: 1,
|
||||||
|
},
|
||||||
|
live_provider: 'auto',
|
||||||
|
motioneye: {
|
||||||
|
images: {
|
||||||
|
directory_pattern: '%Y-%m-%d',
|
||||||
|
file_pattern: '%H-%M-%S',
|
||||||
|
},
|
||||||
|
movies: {
|
||||||
|
directory_pattern: '%Y-%m-%d',
|
||||||
|
file_pattern: '%H-%M-%S',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
triggers: {
|
||||||
|
entities: [],
|
||||||
|
motion: false,
|
||||||
|
occupancy: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
debug: {
|
||||||
|
logging: false,
|
||||||
|
},
|
||||||
|
dimensions: {
|
||||||
|
aspect_ratio: [16, 9],
|
||||||
|
aspect_ratio_mode: 'dynamic',
|
||||||
|
max_height: '100vh',
|
||||||
|
min_height: '100px',
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
mode: 'url',
|
||||||
|
refresh_seconds: 1,
|
||||||
|
zoomable: true,
|
||||||
|
},
|
||||||
|
live: {
|
||||||
|
auto_mute: 'all',
|
||||||
|
auto_pause: 'never',
|
||||||
|
auto_play: 'all',
|
||||||
|
auto_unmute: 'never',
|
||||||
|
controls: {
|
||||||
|
builtin: true,
|
||||||
|
next_previous: {
|
||||||
|
size: 48,
|
||||||
|
style: 'chevrons',
|
||||||
|
},
|
||||||
|
thumbnails: {
|
||||||
|
media: 'all',
|
||||||
|
mode: 'right',
|
||||||
|
show_details: true,
|
||||||
|
show_download_control: true,
|
||||||
|
show_favorite_control: true,
|
||||||
|
show_timeline_control: true,
|
||||||
|
size: 100,
|
||||||
|
},
|
||||||
|
timeline: {
|
||||||
|
clustering_threshold: 3,
|
||||||
|
media: 'all',
|
||||||
|
mode: 'none',
|
||||||
|
show_recordings: true,
|
||||||
|
style: 'ribbon',
|
||||||
|
window_seconds: 3600,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
draggable: true,
|
||||||
|
lazy_load: true,
|
||||||
|
lazy_unload: 'never',
|
||||||
|
microphone: {
|
||||||
|
always_connected: false,
|
||||||
|
disconnect_seconds: 60,
|
||||||
|
},
|
||||||
|
preload: false,
|
||||||
|
show_image_during_load: true,
|
||||||
|
transition_effect: 'slide',
|
||||||
|
zoomable: true,
|
||||||
|
},
|
||||||
|
media_gallery: {
|
||||||
|
controls: {
|
||||||
|
filter: {
|
||||||
|
mode: 'right',
|
||||||
|
},
|
||||||
|
thumbnails: {
|
||||||
|
mode: 'right',
|
||||||
|
show_details: false,
|
||||||
|
show_download_control: true,
|
||||||
|
show_favorite_control: true,
|
||||||
|
show_timeline_control: true,
|
||||||
|
size: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
media_viewer: {
|
||||||
|
auto_mute: 'all',
|
||||||
|
auto_pause: 'all',
|
||||||
|
auto_play: 'all',
|
||||||
|
auto_unmute: 'never',
|
||||||
|
controls: {
|
||||||
|
builtin: true,
|
||||||
|
next_previous: {
|
||||||
|
size: 48,
|
||||||
|
style: 'thumbnails',
|
||||||
|
},
|
||||||
|
thumbnails: {
|
||||||
|
mode: 'right',
|
||||||
|
show_details: true,
|
||||||
|
show_download_control: true,
|
||||||
|
show_favorite_control: true,
|
||||||
|
show_timeline_control: true,
|
||||||
|
size: 100,
|
||||||
|
},
|
||||||
|
timeline: {
|
||||||
|
clustering_threshold: 3,
|
||||||
|
media: 'all',
|
||||||
|
mode: 'none',
|
||||||
|
show_recordings: true,
|
||||||
|
style: 'ribbon',
|
||||||
|
window_seconds: 3600,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
draggable: true,
|
||||||
|
lazy_load: true,
|
||||||
|
snapshot_click_plays_clip: true,
|
||||||
|
transition_effect: 'slide',
|
||||||
|
zoomable: true,
|
||||||
|
},
|
||||||
|
menu: {
|
||||||
|
alignment: 'left',
|
||||||
|
button_size: 40,
|
||||||
|
buttons: {
|
||||||
|
camera_ui: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
cameras: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
clips: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
display_mode: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
download: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
expand: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
frigate: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
fullscreen: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
live: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
media_player: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
microphone: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
type: 'momentary',
|
||||||
|
},
|
||||||
|
mute: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
play: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
recordings: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
screenshot: {
|
||||||
|
enabled: false,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
snapshots: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
substreams: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
timeline: {
|
||||||
|
enabled: true,
|
||||||
|
priority: 50,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
position: 'top',
|
||||||
|
style: 'hidden',
|
||||||
|
},
|
||||||
|
performance: {
|
||||||
|
features: {
|
||||||
|
animated_progress_indicator: true,
|
||||||
|
media_chunk_size: 50,
|
||||||
|
},
|
||||||
|
profile: 'high',
|
||||||
|
style: {
|
||||||
|
border_radius: true,
|
||||||
|
box_shadow: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
timeline: {
|
||||||
|
clustering_threshold: 3,
|
||||||
|
controls: {
|
||||||
|
thumbnails: {
|
||||||
|
mode: 'right',
|
||||||
|
show_details: true,
|
||||||
|
show_download_control: true,
|
||||||
|
show_favorite_control: true,
|
||||||
|
show_timeline_control: true,
|
||||||
|
size: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
media: 'all',
|
||||||
|
show_recordings: true,
|
||||||
|
style: 'stack',
|
||||||
|
window_seconds: 3600,
|
||||||
|
},
|
||||||
|
type: 'frigate-hass-card',
|
||||||
|
view: {
|
||||||
|
camera_select: 'current',
|
||||||
|
dark_mode: 'off',
|
||||||
|
default: 'live',
|
||||||
|
scan: {
|
||||||
|
enabled: false,
|
||||||
|
show_trigger_status: true,
|
||||||
|
untrigger_reset: true,
|
||||||
|
untrigger_seconds: 0,
|
||||||
|
},
|
||||||
|
timeout_seconds: 300,
|
||||||
|
update_cycle_camera: false,
|
||||||
|
update_force: false,
|
||||||
|
update_seconds: 0,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should transform dimensions.aspect_ratio', () => {
|
||||||
|
expect(
|
||||||
|
dimensionsConfigSchema.parse({
|
||||||
|
aspect_ratio: '16 / 9',
|
||||||
|
}),
|
||||||
|
).toEqual(expect.objectContaining({ aspect_ratio: [16, 9] }));
|
||||||
|
|
||||||
|
expect(
|
||||||
|
dimensionsConfigSchema.parse({
|
||||||
|
aspect_ratio: '16 : 9',
|
||||||
|
}),
|
||||||
|
).toEqual(expect.objectContaining({ aspect_ratio: [16, 9] }));
|
||||||
|
|
||||||
|
expect(
|
||||||
|
dimensionsConfigSchema.parse({
|
||||||
|
aspect_ratio: [16, 9],
|
||||||
|
}),
|
||||||
|
).toEqual(expect.objectContaining({ aspect_ratio: [16, 9] }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should transform action', () => {
|
||||||
|
expect(
|
||||||
|
frigateCardCustomActionsBaseSchema.parse({
|
||||||
|
action: 'custom:frigate-card-action',
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
action: 'fire-dom-event',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('should convert webrtc card PTZ to Frigate card PTZ', () => {
|
||||||
|
it.each([
|
||||||
|
['left' as const],
|
||||||
|
['right' as const],
|
||||||
|
['up' as const],
|
||||||
|
['down' as const],
|
||||||
|
['zoom_in' as const],
|
||||||
|
['zoom_out' as const],
|
||||||
|
['home' as const],
|
||||||
|
])('%s', (action: string) => {
|
||||||
|
expect(
|
||||||
|
frigateCardPTZSchema.parse({
|
||||||
|
type: 'custom:frigate-card-ptz',
|
||||||
|
service: 'foo',
|
||||||
|
[`data_${action}`]: {
|
||||||
|
tap_action: {
|
||||||
|
action: 'none',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
[`actions_${action}`]: {
|
||||||
|
tap_action: {
|
||||||
|
action: 'call-service',
|
||||||
|
service: 'foo',
|
||||||
|
service_data: {
|
||||||
|
tap_action: {
|
||||||
|
action: 'none',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
service: 'foo',
|
||||||
|
type: 'custom:frigate-card-ptz',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('should lazy evaluate', () => {
|
||||||
|
it('conditional picture element', () => {
|
||||||
|
expect(
|
||||||
|
conditionalSchema.parse({
|
||||||
|
type: 'conditional',
|
||||||
|
conditions: [
|
||||||
|
{
|
||||||
|
entity: 'light.office_main_lights',
|
||||||
|
state: 'on',
|
||||||
|
state_not: 'off',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
type: 'icon',
|
||||||
|
icon: 'mdi:dog',
|
||||||
|
title: 'Woof',
|
||||||
|
style: {
|
||||||
|
left: '100px',
|
||||||
|
top: '400px',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
conditions: [
|
||||||
|
{
|
||||||
|
entity: 'light.office_main_lights',
|
||||||
|
state: 'on',
|
||||||
|
state_not: 'off',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
icon: 'mdi:dog',
|
||||||
|
style: {
|
||||||
|
left: '100px',
|
||||||
|
top: '400px',
|
||||||
|
},
|
||||||
|
title: 'Woof',
|
||||||
|
type: 'icon',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
type: 'conditional',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('should handle custom frigate elements', () => {
|
||||||
|
it('should add custom error on frigate entry', () => {
|
||||||
|
const result = customSchema.safeParse({
|
||||||
|
type: 'custom:frigate-card-foo',
|
||||||
|
});
|
||||||
|
expect(result.success).toBeFalsy();
|
||||||
|
if (!result.success) {
|
||||||
|
expect(result.error.errors[0]).toEqual({
|
||||||
|
code: 'custom',
|
||||||
|
message: 'Frigate-card custom elements must match specific schemas',
|
||||||
|
fatal: true,
|
||||||
|
path: ['type'],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not add custom error on valid entry', () => {
|
||||||
|
const result = customSchema.safeParse({
|
||||||
|
type: 'custom:foo',
|
||||||
|
});
|
||||||
|
expect(result.success).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
+2
-3
@@ -12,17 +12,16 @@ import {
|
|||||||
} from '../src/camera-manager/types';
|
} from '../src/camera-manager/types';
|
||||||
import {
|
import {
|
||||||
CameraConfig,
|
CameraConfig,
|
||||||
ExtendedHomeAssistant,
|
|
||||||
FrigateCardCondition,
|
FrigateCardCondition,
|
||||||
FrigateCardConfig,
|
FrigateCardConfig,
|
||||||
MediaLoadedInfo,
|
|
||||||
PerformanceConfig,
|
PerformanceConfig,
|
||||||
RawFrigateCardConfig,
|
RawFrigateCardConfig,
|
||||||
cameraConfigSchema,
|
cameraConfigSchema,
|
||||||
frigateCardConditionSchema,
|
frigateCardConditionSchema,
|
||||||
frigateCardConfigSchema,
|
frigateCardConfigSchema,
|
||||||
performanceConfigSchema,
|
performanceConfigSchema,
|
||||||
} from '../src/types';
|
} from '../src/config/types';
|
||||||
|
import { ExtendedHomeAssistant, MediaLoadedInfo } from '../src/types';
|
||||||
import { ActionsManager } from '../src/utils/card-controller/actions-manager';
|
import { ActionsManager } from '../src/utils/card-controller/actions-manager';
|
||||||
import { AutoUpdateManager } from '../src/utils/card-controller/auto-update-manager';
|
import { AutoUpdateManager } from '../src/utils/card-controller/auto-update-manager';
|
||||||
import { AutomationsManager } from '../src/utils/card-controller/automations-manager';
|
import { AutomationsManager } from '../src/utils/card-controller/automations-manager';
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
import { handleActionConfig, hasAction } from 'custom-card-helpers';
|
import { handleActionConfig, hasAction } from 'custom-card-helpers';
|
||||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||||
import { mock } from 'vitest-mock-extended';
|
import { mock } from 'vitest-mock-extended';
|
||||||
import {
|
import { actionSchema } from '../../src/config/types';
|
||||||
actionSchema,
|
|
||||||
FrigateCardAction,
|
|
||||||
FrigateCardCustomAction,
|
|
||||||
frigateCardCustomActionSchema,
|
|
||||||
} from '../../src/types';
|
|
||||||
import {
|
import {
|
||||||
convertActionToFrigateCardCustomAction,
|
convertActionToFrigateCardCustomAction,
|
||||||
createFrigateCardCustomAction,
|
createFrigateCardCustomAction,
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import { mock } from 'vitest-mock-extended';
|
|||||||
import {
|
import {
|
||||||
ActionType,
|
ActionType,
|
||||||
FrigateCardCustomAction,
|
FrigateCardCustomAction,
|
||||||
FrigateCardMediaPlayer,
|
|
||||||
FrigateCardView,
|
FrigateCardView,
|
||||||
frigateCardCustomActionSchema,
|
frigateCardCustomActionSchema,
|
||||||
} from '../../../src/types';
|
} from '../../../src/config/types';
|
||||||
|
import { FrigateCardMediaPlayer } from '../../../src/types';
|
||||||
import {
|
import {
|
||||||
convertActionToFrigateCardCustomAction,
|
convertActionToFrigateCardCustomAction,
|
||||||
frigateCardHandleActionConfig,
|
frigateCardHandleActionConfig,
|
||||||
@@ -139,9 +139,7 @@ describe('ActionsManager.getMergedActions', () => {
|
|||||||
vi.mocked(api.getViewManager().getView).mockReturnValue(
|
vi.mocked(api.getViewManager().getView).mockReturnValue(
|
||||||
createView({ view: viewName }),
|
createView({ view: viewName }),
|
||||||
);
|
);
|
||||||
vi.mocked(api.getConfigManager().getConfig).mockReturnValue(
|
vi.mocked(api.getConfigManager().getConfig).mockReturnValue(createConfig(config));
|
||||||
createConfig(config),
|
|
||||||
);
|
|
||||||
|
|
||||||
const manager = new ActionsManager(api);
|
const manager = new ActionsManager(api);
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
import { FrigateCardCondition } from '../../../src/config/types';
|
||||||
import {
|
import {
|
||||||
ConditionsManager,
|
|
||||||
ConditionEvaluateRequestEvent,
|
ConditionEvaluateRequestEvent,
|
||||||
|
ConditionsManager,
|
||||||
evaluateConditionViaEvent,
|
evaluateConditionViaEvent,
|
||||||
getOverriddenConfig,
|
getOverriddenConfig,
|
||||||
getOverridesByKey,
|
getOverridesByKey,
|
||||||
} from '../../../src/utils/card-controller/conditions-manager';
|
} from '../../../src/utils/card-controller/conditions-manager';
|
||||||
import { FrigateCardCondition } from '../../../src/types';
|
|
||||||
import {
|
import {
|
||||||
createCardAPI,
|
createCardAPI,
|
||||||
createCondition,
|
createCondition,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
import { ZodError } from 'zod';
|
import { ZodError } from 'zod';
|
||||||
import { frigateCardConfigSchema } from '../../../src/types';
|
import { frigateCardConfigSchema } from '../../../src/config/types';
|
||||||
import { getOverriddenConfig } from '../../../src/utils/card-controller/conditions-manager';
|
import { getOverriddenConfig } from '../../../src/utils/card-controller/conditions-manager';
|
||||||
import { ConfigManager } from '../../../src/utils/card-controller/config-manager';
|
import { ConfigManager } from '../../../src/utils/card-controller/config-manager';
|
||||||
import { InitializationAspect } from '../../../src/utils/card-controller/initialization-manager';
|
import { InitializationAspect } from '../../../src/utils/card-controller/initialization-manager';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
import { FrigateCardView } from '../../../src/config/types';
|
||||||
import { setPerformanceCSSStyles } from '../../../src/performance';
|
import { setPerformanceCSSStyles } from '../../../src/performance';
|
||||||
import { FrigateCardView } from '../../../src/types';
|
|
||||||
import { StyleManager } from '../../../src/utils/card-controller/style-manager';
|
import { StyleManager } from '../../../src/utils/card-controller/style-manager';
|
||||||
import { createCardAPI, createConfig, createHASS, createView } from '../../test-utils';
|
import { createCardAPI, createConfig, createHASS, createView } from '../../test-utils';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import add from 'date-fns/add';
|
import add from 'date-fns/add';
|
||||||
import { HassEntities } from 'home-assistant-js-websocket';
|
import { HassEntities } from 'home-assistant-js-websocket';
|
||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
import { ScanOptions } from '../../../src/types';
|
import { ScanOptions } from '../../../src/config/types';
|
||||||
import { TriggersManager } from '../../../src/utils/card-controller/triggers-manager';
|
import { TriggersManager } from '../../../src/utils/card-controller/triggers-manager';
|
||||||
import {
|
import {
|
||||||
createCameraConfig,
|
createCameraConfig,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, it, vi } from 'vitest';
|
import { describe, expect, it, vi } from 'vitest';
|
||||||
import { QueryType } from '../../../src/camera-manager/types';
|
import { QueryType } from '../../../src/camera-manager/types';
|
||||||
import { FrigateCardView } from '../../../src/types';
|
import { FrigateCardView } from '../../../src/config/types';
|
||||||
import { getAllDependentCameras } from '../../../src/utils/camera';
|
import { getAllDependentCameras } from '../../../src/utils/camera';
|
||||||
import { ViewManager } from '../../../src/utils/card-controller/view-manager';
|
import { ViewManager } from '../../../src/utils/card-controller/view-manager';
|
||||||
import { EventMediaQueries } from '../../../src/view/media-queries';
|
import { EventMediaQueries } from '../../../src/view/media-queries';
|
||||||
|
|||||||
@@ -4,16 +4,15 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|||||||
import { mock } from 'vitest-mock-extended';
|
import { mock } from 'vitest-mock-extended';
|
||||||
import { CameraManager } from '../../src/camera-manager/manager';
|
import { CameraManager } from '../../src/camera-manager/manager';
|
||||||
import { CameraManagerCameraMetadata } from '../../src/camera-manager/types';
|
import { CameraManagerCameraMetadata } from '../../src/camera-manager/types';
|
||||||
import {
|
import { FrigateCardConfig, MenuItem, ViewDisplayMode } from '../../src/config/types';
|
||||||
FrigateCardConfig,
|
import { FrigateCardMediaPlayer } from '../../src/types';
|
||||||
FrigateCardMediaPlayer,
|
|
||||||
MenuButton,
|
|
||||||
ViewDisplayMode,
|
|
||||||
} from '../../src/types';
|
|
||||||
import { createFrigateCardCustomAction } from '../../src/utils/action';
|
import { createFrigateCardCustomAction } from '../../src/utils/action';
|
||||||
import { MediaPlayerManager } from '../../src/utils/card-controller/media-player-manager';
|
import { MediaPlayerManager } from '../../src/utils/card-controller/media-player-manager';
|
||||||
import { MicrophoneManager } from '../../src/utils/card-controller/microphone-manager';
|
import { MicrophoneManager } from '../../src/utils/card-controller/microphone-manager';
|
||||||
import { MenuButtonController, MenuButtonControllerOptions } from '../../src/utils/menu-controller';
|
import {
|
||||||
|
MenuButtonController,
|
||||||
|
MenuButtonControllerOptions,
|
||||||
|
} from '../../src/utils/menu-controller';
|
||||||
import { ViewMedia } from '../../src/view/media';
|
import { ViewMedia } from '../../src/view/media';
|
||||||
import { MediaQueriesResults } from '../../src/view/media-queries-results';
|
import { MediaQueriesResults } from '../../src/view/media-queries-results';
|
||||||
import { View } from '../../src/view/view';
|
import { View } from '../../src/view/view';
|
||||||
@@ -42,7 +41,7 @@ const calculateButtons = (
|
|||||||
cameraManager?: CameraManager;
|
cameraManager?: CameraManager;
|
||||||
view?: View;
|
view?: View;
|
||||||
},
|
},
|
||||||
): MenuButton[] => {
|
): MenuItem[] => {
|
||||||
return controller.calculateButtons(
|
return controller.calculateButtons(
|
||||||
options?.hass ?? createHASS(),
|
options?.hass ?? createHASS(),
|
||||||
options?.config ?? createConfig(),
|
options?.config ?? createConfig(),
|
||||||
@@ -61,7 +60,7 @@ const calculateButtons = (
|
|||||||
// @vitest-environment jsdom
|
// @vitest-environment jsdom
|
||||||
describe('MenuButtonController', () => {
|
describe('MenuButtonController', () => {
|
||||||
let controller: MenuButtonController;
|
let controller: MenuButtonController;
|
||||||
const dynamicButton: MenuButton = {
|
const dynamicButton: MenuItem = {
|
||||||
type: 'custom:frigate-card-menu-icon',
|
type: 'custom:frigate-card-menu-icon',
|
||||||
icon: 'mdi:alpha-a-circle',
|
icon: 'mdi:alpha-a-circle',
|
||||||
title: 'Dynamic button',
|
title: 'Dynamic button',
|
||||||
@@ -1130,7 +1129,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should handle dynamic buttons', () => {
|
it('should handle dynamic buttons', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
style: {},
|
style: {},
|
||||||
};
|
};
|
||||||
@@ -1152,7 +1151,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should not set style for dynamic button with stock action', () => {
|
it('should not set style for dynamic button with stock action', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: { action: 'navigate', navigation_path: 'foo' },
|
tap_action: { action: 'navigate', navigation_path: 'foo' },
|
||||||
};
|
};
|
||||||
@@ -1165,7 +1164,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should not set style for dynamic button with non-Frigate fire-dom-event action', () => {
|
it('should not set style for dynamic button with non-Frigate fire-dom-event action', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: { action: 'fire-dom-event' },
|
tap_action: { action: 'fire-dom-event' },
|
||||||
};
|
};
|
||||||
@@ -1179,7 +1178,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should set style for dynamic button with Frigate view action', () => {
|
it('should set style for dynamic button with Frigate view action', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: { action: 'fire-dom-event', frigate_card_action: 'clips' },
|
tap_action: { action: 'fire-dom-event', frigate_card_action: 'clips' },
|
||||||
};
|
};
|
||||||
@@ -1193,7 +1192,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should set style for dynamic button with Frigate default action', () => {
|
it('should set style for dynamic button with Frigate default action', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: { action: 'fire-dom-event', frigate_card_action: 'default' },
|
tap_action: { action: 'fire-dom-event', frigate_card_action: 'default' },
|
||||||
};
|
};
|
||||||
@@ -1206,7 +1205,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should set style for dynamic button with fullscreen action', () => {
|
it('should set style for dynamic button with fullscreen action', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: { action: 'fire-dom-event', frigate_card_action: 'fullscreen' },
|
tap_action: { action: 'fire-dom-event', frigate_card_action: 'fullscreen' },
|
||||||
};
|
};
|
||||||
@@ -1219,7 +1218,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should set style for dynamic button with camera_select action', () => {
|
it('should set style for dynamic button with camera_select action', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: {
|
tap_action: {
|
||||||
action: 'fire-dom-event',
|
action: 'fire-dom-event',
|
||||||
@@ -1237,7 +1236,7 @@ describe('MenuButtonController', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should set style for dynamic button with array of actions', () => {
|
it('should set style for dynamic button with array of actions', () => {
|
||||||
const button: MenuButton = {
|
const button: MenuItem = {
|
||||||
...dynamicButton,
|
...dynamicButton,
|
||||||
tap_action: [
|
tap_action: [
|
||||||
{ action: 'fire-dom-event' },
|
{ action: 'fire-dom-event' },
|
||||||
|
|||||||
Reference in New Issue
Block a user