Initial version of status bar.
This commit is contained in:
@@ -25,7 +25,6 @@ import {
|
||||
frigateCardConfigSchema,
|
||||
} from '../../src/config/types';
|
||||
import { getParseErrorPaths } from '../../src/utils/zod';
|
||||
import { update } from 'lodash-es';
|
||||
|
||||
describe('general functions', () => {
|
||||
it('should set value', () => {
|
||||
@@ -3193,5 +3192,116 @@ describe('should handle version specific upgrades', () => {
|
||||
});
|
||||
postUpgradeChecks(config);
|
||||
});
|
||||
|
||||
describe('title controls to status bar', () => {
|
||||
it('when mode is none', () => {
|
||||
const config = {
|
||||
type: 'custom:frigate-card',
|
||||
cameras: [{}],
|
||||
live: {
|
||||
controls: {
|
||||
title: {
|
||||
mode: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
media_viewer: {
|
||||
controls: {
|
||||
title: {
|
||||
mode: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(upgradeConfig(config)).toBeTruthy();
|
||||
expect(config).toEqual({
|
||||
type: 'custom:frigate-card',
|
||||
cameras: [{}],
|
||||
live: { controls: {} },
|
||||
media_viewer: { controls: {} },
|
||||
status_bar: {
|
||||
style: 'none',
|
||||
},
|
||||
});
|
||||
|
||||
postUpgradeChecks(config);
|
||||
});
|
||||
|
||||
describe('when mode is invalid type', () => {
|
||||
it.each([[{ mode: { should_not_be: 'an object' } }], ['sideways']])(
|
||||
'%s',
|
||||
(mode: unknown) => {
|
||||
const config = {
|
||||
type: 'custom:frigate-card',
|
||||
cameras: [{}],
|
||||
live: {
|
||||
controls: {
|
||||
title: {
|
||||
mode,
|
||||
},
|
||||
},
|
||||
},
|
||||
media_viewer: {
|
||||
controls: {
|
||||
title: {
|
||||
mode,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(upgradeConfig(config)).toBeTruthy();
|
||||
expect(config).toEqual({
|
||||
type: 'custom:frigate-card',
|
||||
cameras: [{}],
|
||||
live: { controls: {} },
|
||||
media_viewer: { controls: {} },
|
||||
});
|
||||
|
||||
postUpgradeChecks(config);
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
describe.each([['bottom'], ['top']])('on the %s', (position: string) => {
|
||||
it.each([
|
||||
[`popup-${position}-left` as const],
|
||||
[`popup-${position}-right` as const],
|
||||
])('%s', (mode: string) => {
|
||||
const config = {
|
||||
type: 'custom:frigate-card',
|
||||
cameras: [{}],
|
||||
live: {
|
||||
controls: {
|
||||
title: {
|
||||
mode,
|
||||
},
|
||||
},
|
||||
},
|
||||
media_viewer: {
|
||||
controls: {
|
||||
title: {
|
||||
mode,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(upgradeConfig(config)).toBeTruthy();
|
||||
expect(config).toEqual({
|
||||
type: 'custom:frigate-card',
|
||||
cameras: [{}],
|
||||
live: { controls: {} },
|
||||
media_viewer: { controls: {} },
|
||||
status_bar: {
|
||||
position,
|
||||
},
|
||||
});
|
||||
|
||||
postUpgradeChecks(config);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -13,7 +13,6 @@ it('low performance profile', () => {
|
||||
'live.controls.thumbnails.show_favorite_control': false,
|
||||
'live.controls.thumbnails.show_timeline_control': false,
|
||||
'live.controls.timeline.show_recordings': false,
|
||||
'live.controls.title.mode': 'none',
|
||||
'live.draggable': false,
|
||||
'live.lazy_unload': 'all',
|
||||
'live.show_image_during_load': false,
|
||||
@@ -32,7 +31,6 @@ it('low performance profile', () => {
|
||||
'media_viewer.controls.thumbnails.show_favorite_control': false,
|
||||
'media_viewer.controls.thumbnails.show_timeline_control': false,
|
||||
'media_viewer.controls.timeline.show_recordings': false,
|
||||
'media_viewer.controls.title.mode': 'none',
|
||||
'media_viewer.draggable': false,
|
||||
'media_viewer.snapshot_click_plays_clip': false,
|
||||
'media_viewer.transition_effect': 'none',
|
||||
@@ -44,6 +42,7 @@ it('low performance profile', () => {
|
||||
'performance.features.media_chunk_size': 10,
|
||||
'performance.style.border_radius': false,
|
||||
'performance.style.box_shadow': false,
|
||||
'status_bar.style': 'none',
|
||||
'timeline.controls.thumbnails.mode': 'none',
|
||||
'timeline.controls.thumbnails.show_details': false,
|
||||
'timeline.controls.thumbnails.show_download_control': false,
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
customSchema,
|
||||
dimensionsConfigSchema,
|
||||
frigateCardCustomActionsBaseSchema,
|
||||
frigateCardCustomActionSchema,
|
||||
} from '../../src/config/types';
|
||||
import { createConfig } from '../test-utils';
|
||||
|
||||
@@ -273,6 +274,30 @@ describe('config defaults', () => {
|
||||
box_shadow: true,
|
||||
},
|
||||
},
|
||||
status_bar: {
|
||||
height: 46,
|
||||
items: {
|
||||
engine: {
|
||||
enabled: true,
|
||||
priority: 50,
|
||||
},
|
||||
resolution: {
|
||||
enabled: true,
|
||||
priority: 50,
|
||||
},
|
||||
technology: {
|
||||
enabled: true,
|
||||
priority: 50,
|
||||
},
|
||||
title: {
|
||||
enabled: true,
|
||||
priority: 50,
|
||||
},
|
||||
},
|
||||
popup_seconds: 3,
|
||||
position: 'bottom',
|
||||
style: 'popup',
|
||||
},
|
||||
timeline: {
|
||||
clustering_threshold: 3,
|
||||
controls: {
|
||||
@@ -507,7 +532,7 @@ describe('should convert webrtc card PTZ to Frigate card PTZ', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('should lazy evaluate', () => {
|
||||
describe('should lazy evaluate schemas', () => {
|
||||
it('conditional picture element', () => {
|
||||
expect(
|
||||
conditionalSchema.parse({
|
||||
@@ -555,6 +580,21 @@ describe('should lazy evaluate', () => {
|
||||
type: 'conditional',
|
||||
});
|
||||
});
|
||||
|
||||
it('status bar actions', () => {
|
||||
const input = {
|
||||
action: 'fire-dom-event',
|
||||
frigate_card_action: 'status_bar',
|
||||
status_bar_action: 'reset',
|
||||
items: [
|
||||
{
|
||||
type: 'custom:frigate-card-status-bar-string',
|
||||
string: 'Item',
|
||||
},
|
||||
],
|
||||
};
|
||||
expect(frigateCardCustomActionSchema.parse(input)).toEqual(input);
|
||||
});
|
||||
});
|
||||
|
||||
describe('should handle custom frigate elements', () => {
|
||||
@@ -621,3 +661,41 @@ it('media viewer should not support microphone based conditions', () => {
|
||||
}),
|
||||
).toThrowError();
|
||||
});
|
||||
|
||||
describe('automations should require at least one action', () => {
|
||||
it('no action', () => {
|
||||
expect(() =>
|
||||
createConfig({
|
||||
cameras: [{}],
|
||||
automations: [{ conditions: [] }],
|
||||
}),
|
||||
).toThrowError(/Automations must include at least one action/);
|
||||
});
|
||||
|
||||
it('empty actions', () => {
|
||||
expect(() =>
|
||||
createConfig({
|
||||
cameras: [{}],
|
||||
automations: [{ conditions: [], actions: [], actions_not: [] }],
|
||||
}),
|
||||
).toThrowError(/Automations must include at least one action/);
|
||||
});
|
||||
|
||||
it('at least one action', () => {
|
||||
expect(() =>
|
||||
createConfig({
|
||||
cameras: [{}],
|
||||
automations: [
|
||||
{
|
||||
conditions: [],
|
||||
actions: [
|
||||
{
|
||||
action: 'fire-dom-event',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}),
|
||||
).not.toThrowError();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user