();
+
let databaseIcon = '';
let databaseType = '';
@@ -24,6 +30,12 @@ export const DatabaseCardComponent = ({
databaseType = 'PostgreSQL';
}
+ useEffect(() => {
+ if (!database.id) return;
+
+ backupConfigApi.getBackupConfigByDbID(database.id).then((res) => setStorage(res?.storage));
+ }, [database.id]);
+
return (
Database type: {databaseType}
-
+ {storage && (
+
+
Storage:
+
+ {storage.name}{' '}
+ {storage.type && (
+
+ )}
+
+
+ )}
+
{database.lastBackupTime && (
Last backup
diff --git a/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx b/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx
index 541d9e4..2922dfd 100644
--- a/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx
+++ b/frontend/src/features/notifiers/ui/edit/EditNotifierComponent.tsx
@@ -9,6 +9,7 @@ import {
validateDiscordNotifier,
validateEmailNotifier,
validateSlackNotifier,
+ validateTeamsNotifier,
validateTelegramNotifier,
validateWebhookNotifier,
} from '../../../../entity/notifiers';
@@ -17,6 +18,7 @@ import { ToastHelper } from '../../../../shared/toast';
import { EditDiscordNotifierComponent } from './notifiers/EditDiscordNotifierComponent';
import { EditEmailNotifierComponent } from './notifiers/EditEmailNotifierComponent';
import { EditSlackNotifierComponent } from './notifiers/EditSlackNotifierComponent';
+import { EditTeamsNotifierComponent } from './notifiers/EditTeamsNotifierComponent';
import { EditTelegramNotifierComponent } from './notifiers/EditTelegramNotifierComponent';
import { EditWebhookNotifierComponent } from './notifiers/EditWebhookNotifierComponent';
@@ -90,6 +92,7 @@ export function EditNotifierComponent({
notifier.emailNotifier = undefined;
notifier.telegramNotifier = undefined;
+ notifier.teamsNotifier = undefined;
if (type === NotifierType.TELEGRAM) {
notifier.telegramNotifier = {
@@ -128,6 +131,10 @@ export function EditNotifierComponent({
};
}
+ if (type === NotifierType.TEAMS) {
+ notifier.teamsNotifier = { powerAutomateUrl: '' };
+ }
+
setNotifier(
JSON.parse(
JSON.stringify({
@@ -183,6 +190,10 @@ export function EditNotifierComponent({
return validateDiscordNotifier(notifier.discordNotifier);
}
+ if (notifier.notifierType === NotifierType.TEAMS && notifier.teamsNotifier) {
+ return validateTeamsNotifier(notifier.teamsNotifier);
+ }
+
return false;
};
@@ -218,6 +229,7 @@ export function EditNotifierComponent({
{ label: 'Webhook', value: NotifierType.WEBHOOK },
{ label: 'Slack', value: NotifierType.SLACK },
{ label: 'Discord', value: NotifierType.DISCORD },
+ { label: 'Teams', value: NotifierType.TEAMS },
]}
onChange={(value) => {
setNotifierType(value);
@@ -272,6 +284,13 @@ export function EditNotifierComponent({
setIsUnsaved={setIsUnsaved}
/>
)}
+ {notifier?.notifierType === NotifierType.TEAMS && (
+
+ )}
diff --git a/frontend/src/features/notifiers/ui/edit/notifiers/EditTeamsNotifierComponent.tsx b/frontend/src/features/notifiers/ui/edit/notifiers/EditTeamsNotifierComponent.tsx
new file mode 100644
index 0000000..8d53644
--- /dev/null
+++ b/frontend/src/features/notifiers/ui/edit/notifiers/EditTeamsNotifierComponent.tsx
@@ -0,0 +1,58 @@
+import { InfoCircleOutlined } from '@ant-design/icons';
+import { Input, Tooltip } from 'antd';
+import React from 'react';
+
+import type { Notifier } from '../../../../../entity/notifiers';
+
+interface Props {
+ notifier: Notifier;
+ setNotifier: (notifier: Notifier) => void;
+ setIsUnsaved: (isUnsaved: boolean) => void;
+}
+
+export function EditTeamsNotifierComponent({ notifier, setNotifier, setIsUnsaved }: Props) {
+ const value = notifier?.teamsNotifier?.powerAutomateUrl || '';
+
+ const onChange = (e: React.ChangeEvent
) => {
+ const powerAutomateUrl = e.target.value.trim();
+ setNotifier({
+ ...notifier,
+ teamsNotifier: {
+ ...(notifier.teamsNotifier ?? {}),
+ powerAutomateUrl,
+ },
+ });
+ setIsUnsaved(true);
+ };
+
+ return (
+ <>
+
+
Power Automate URL
+
+
+
+
+
+
+
+
+
+
+
+ 1) In Power Automate create Flow with triggers When an HTTP request is received.
+
+ 2) Press Save — you can see URL. Copy urk to this row.
+
+ >
+ );
+}
diff --git a/frontend/src/features/notifiers/ui/show/ShowNotifierComponent.tsx b/frontend/src/features/notifiers/ui/show/ShowNotifierComponent.tsx
index 2a8a5a5..e730ee0 100644
--- a/frontend/src/features/notifiers/ui/show/ShowNotifierComponent.tsx
+++ b/frontend/src/features/notifiers/ui/show/ShowNotifierComponent.tsx
@@ -4,6 +4,7 @@ import { getNotifierNameFromType } from '../../../../entity/notifiers/models/get
import { ShowDiscordNotifierComponent } from './notifier/ShowDiscordNotifierComponent';
import { ShowEmailNotifierComponent } from './notifier/ShowEmailNotifierComponent';
import { ShowSlackNotifierComponent } from './notifier/ShowSlackNotifierComponent';
+import { ShowTeamsNotifierComponent } from './notifier/ShowTeamsNotifierComponent';
import { ShowTelegramNotifierComponent } from './notifier/ShowTelegramNotifierComponent';
import { ShowWebhookNotifierComponent } from './notifier/ShowWebhookNotifierComponent';
@@ -41,6 +42,10 @@ export function ShowNotifierComponent({ notifier }: Props) {
{notifier?.notifierType === NotifierType.DISCORD && (
)}
+
+ {notifier?.notifierType === NotifierType.TEAMS && (
+
+ )}
);
diff --git a/frontend/src/features/notifiers/ui/show/notifier/ShowTeamsNotifierComponent.tsx b/frontend/src/features/notifiers/ui/show/notifier/ShowTeamsNotifierComponent.tsx
new file mode 100644
index 0000000..33848d1
--- /dev/null
+++ b/frontend/src/features/notifiers/ui/show/notifier/ShowTeamsNotifierComponent.tsx
@@ -0,0 +1,42 @@
+import { useState } from 'react';
+
+import type { Notifier } from '../../../../../entity/notifiers';
+
+interface Props {
+ notifier: Notifier;
+}
+
+export function ShowTeamsNotifierComponent({ notifier }: Props) {
+ const url = notifier?.teamsNotifier?.powerAutomateUrl || '';
+ const [expanded, setExpanded] = useState(false);
+
+ const MAX = 20;
+ const isLong = url.length > MAX;
+ const display = expanded ? url : isLong ? `${url.slice(0, MAX)}…` : url;
+
+ return (
+ <>
+
+
Power Automate URL:
+
+ {url ? (
+ <>
+ {display}
+ {isLong && (
+
+ )}
+ >
+ ) : (
+ '—'
+ )}
+
+
+ >
+ );
+}