feat: Add custom reload action to reload dashboard (#2217)

- Closes: #2215

---------

Co-authored-by: Felipe Santos <felipecassiors@gmail.com>
This commit is contained in:
Dermot Duffy
2025-10-14 07:37:50 -07:00
committed by GitHub
co-authored by Felipe Santos
parent 7edaac079e
commit 1f41781a84
6 changed files with 61 additions and 0 deletions
@@ -434,6 +434,15 @@ action: custom:advanced-camera-card-action
advanced_camera_card_action: recordings
```
## `reload`
Reload the entire dashboard.
```yaml
action: custom:advanced-camera-card-action
advanced_camera_card_action: reload
```
## `screenshot`
Take a screenshot of the selected media (e.g. a still from a video).
@@ -854,4 +863,10 @@ elements:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: folders
folder: my-folder
- type: custom:advanced-camera-card-menu-icon
icon: mdi:reload
title: Reload
tap_action:
- action: custom:advanced-camera-card-action
advanced_camera_card_action: reload
```
@@ -0,0 +1,11 @@
import { GeneralActionConfig } from '../../../config/schema/actions/custom/general';
import { CardActionsAPI } from '../../types';
import { AdvancedCameraCardAction } from './base';
export class ReloadAction extends AdvancedCameraCardAction<GeneralActionConfig> {
public async execute(api: CardActionsAPI): Promise<void> {
await super.execute(api);
window.location.reload();
}
}
+3
View File
@@ -30,6 +30,7 @@ import { PTZAction } from './actions/ptz';
import { PTZControlsAction } from './actions/ptz-controls';
import { PTZDigitalAction } from './actions/ptz-digital';
import { PTZMultiAction } from './actions/ptz-multi';
import { ReloadAction } from './actions/reload';
import { ScreenshotAction } from './actions/screenshot';
import { SleepAction } from './actions/sleep';
import { StatusBarAction } from './actions/status-bar';
@@ -150,6 +151,8 @@ export class ActionFactory {
return new LogAction(context, action, options?.config);
case 'status_bar':
return new StatusBarAction(context, action, options?.config);
case 'reload':
return new ReloadAction(context, action, options?.config);
case INTERNAL_CALLBACK_ACTION:
return new InternalCallbackAction(context, action, options?.config);
}
@@ -17,6 +17,7 @@ const GENERAL_ACTIONS = [
'mute',
'pause',
'play',
'reload',
'screenshot',
'unmute',
] as const;
@@ -0,0 +1,29 @@
import { afterEach, describe, expect, it, vi } from 'vitest';
import { mock } from 'vitest-mock-extended';
import { ReloadAction } from '../../../../src/card-controller/actions/actions/reload';
import { createCardAPI } from '../../../test-utils';
// @vitest-environment jsdom
describe('should handle reload action', async () => {
afterEach(() => {
vi.restoreAllMocks();
});
it('should handle reload action', async () => {
const api = createCardAPI();
const action = new ReloadAction(
{},
{
action: 'fire-dom-event',
advanced_camera_card_action: 'reload',
},
);
const location: Location & { origin: string } = mock<Location>();
vi.spyOn(window, 'location', 'get').mockReturnValue(location);
await action.execute(api);
expect(location.reload).toBeCalledTimes(1);
});
});
@@ -27,6 +27,7 @@ import { PTZAction } from '../../../src/card-controller/actions/actions/ptz';
import { PTZControlsAction } from '../../../src/card-controller/actions/actions/ptz-controls';
import { PTZDigitalAction } from '../../../src/card-controller/actions/actions/ptz-digital';
import { PTZMultiAction } from '../../../src/card-controller/actions/actions/ptz-multi';
import { ReloadAction } from '../../../src/card-controller/actions/actions/reload';
import { ScreenshotAction } from '../../../src/card-controller/actions/actions/screenshot';
import { SleepAction } from '../../../src/card-controller/actions/actions/sleep';
import { StatusBarAction } from '../../../src/card-controller/actions/actions/status-bar';
@@ -186,6 +187,7 @@ describe('ActionFactory', () => {
},
InternalCallbackAction,
],
[{ advanced_camera_card_action: 'reload' as const }, ReloadAction],
])(
'advanced_camera_card_action: $advanced_camera_card_action',
(action: Partial<ActionConfig>, classObject: object) => {