mirror of
https://github.com/umami-software/umami.git
synced 2026-02-08 22:57:12 +01:00
Merge branch 'dev' into dash-inactive
This commit is contained in:
commit
65d09a57d1
15 changed files with 529 additions and 458 deletions
|
|
@ -10,6 +10,8 @@ import TeamsButton from 'components/input/TeamsButton';
|
|||
import Icons from 'components/icons';
|
||||
import { useMessages, useNavigation, useTeamUrl } from 'components/hooks';
|
||||
import styles from './NavBar.module.css';
|
||||
import { useEffect } from 'react';
|
||||
import { getItem, setItem } from 'next-basics';
|
||||
|
||||
export function NavBar() {
|
||||
const { formatMessage, labels } = useMessages();
|
||||
|
|
@ -74,10 +76,21 @@ export function NavBar() {
|
|||
|
||||
const handleTeamChange = (teamId: string) => {
|
||||
const url = teamId ? `/teams/${teamId}` : '/';
|
||||
|
||||
setItem('umami.team', { id: teamId });
|
||||
router.push(cloudMode ? `${process.env.cloudUrl}${url}` : url);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const teamIdLocal = getItem('umami.team')?.id;
|
||||
if (teamIdLocal && pathname !== '/' && pathname !== '/dashboard') {
|
||||
const url = '/';
|
||||
router.push(cloudMode ? `${process.env.cloudUrl}${url}` : url);
|
||||
} else if (teamIdLocal) {
|
||||
const url = `/teams/${teamIdLocal}/dashboard`;
|
||||
router.push(cloudMode ? `${process.env.cloudUrl}${url}` : url);
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className={styles.navbar}>
|
||||
<div className={styles.logo}>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { useState, useMemo } from 'react';
|
||||
import { useState, useMemo, useEffect } from 'react';
|
||||
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
|
||||
import classNames from 'classnames';
|
||||
import { Button, Loading } from 'react-basics';
|
||||
|
|
@ -16,12 +16,25 @@ export function DashboardEdit({ teamId }: { teamId: string }) {
|
|||
const { formatMessage, labels } = useMessages();
|
||||
const [order, setOrder] = useState(websiteOrder || []);
|
||||
const [active, setActive] = useState(websiteActive || []);
|
||||
const [websites, setWebsites] = useState([]);
|
||||
|
||||
const {
|
||||
result,
|
||||
query: { isLoading },
|
||||
setParams,
|
||||
} = useWebsites({ teamId });
|
||||
|
||||
const websites = result?.data;
|
||||
useEffect(() => {
|
||||
if (result?.data) {
|
||||
setWebsites(prevWebsites => {
|
||||
const newWebsites = [...prevWebsites, ...result.data];
|
||||
if (newWebsites.length < result.count) {
|
||||
setParams(prevParams => ({ ...prevParams, page: prevParams.page + 1 }));
|
||||
}
|
||||
return newWebsites;
|
||||
});
|
||||
}
|
||||
}, [result]);
|
||||
|
||||
const ordered = useMemo(() => {
|
||||
if (websites) {
|
||||
|
|
|
|||
|
|
@ -59,5 +59,6 @@
|
|||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding-inline-end: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { UseQueryOptions } from '@tanstack/react-query';
|
||||
import { useApi } from '../useApi';
|
||||
import { useFilterParams } from '../useFilterParams';
|
||||
import { useSearchParams } from 'next/navigation';
|
||||
|
||||
export function useWebsiteMetrics(
|
||||
websiteId: string,
|
||||
|
|
@ -9,6 +10,7 @@ export function useWebsiteMetrics(
|
|||
) {
|
||||
const { get, useQuery } = useApi();
|
||||
const params = useFilterParams(websiteId);
|
||||
const searchParams = useSearchParams();
|
||||
|
||||
return useQuery({
|
||||
queryKey: [
|
||||
|
|
@ -20,12 +22,9 @@ export function useWebsiteMetrics(
|
|||
},
|
||||
],
|
||||
queryFn: async () => {
|
||||
const filters = { ...params };
|
||||
|
||||
filters[queryParams.type] = undefined;
|
||||
|
||||
const data = await get(`/websites/${websiteId}/metrics`, {
|
||||
...filters,
|
||||
...params,
|
||||
[searchParams.get('view')]: undefined,
|
||||
...queryParams,
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@
|
|||
"label.edit-member": "Modifier le membre",
|
||||
"label.enable-share-url": "Activer l'URL de partage",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.entry": "URL d'entrée",
|
||||
"label.event": "Évènement",
|
||||
"label.event-data": "Données d'évènements",
|
||||
"label.events": "Évènements",
|
||||
|
|
@ -78,12 +78,12 @@
|
|||
"label.filter-combined": "Combiné",
|
||||
"label.filter-raw": "Brut",
|
||||
"label.filters": "Filtres",
|
||||
"label.first-seen": "First seen",
|
||||
"label.first-seen": "Vu pour la première fois",
|
||||
"label.funnel": "Entonnoir",
|
||||
"label.funnel-description": "Suivi des conversions et des taux d'abandons.",
|
||||
"label.goal": "Goal",
|
||||
"label.goals": "Goals",
|
||||
"label.goals-description": "Track your goals for pageviews and events.",
|
||||
"label.goals-description": "Suivez vos objectifs en matière de pages vues et d'événements.",
|
||||
"label.greater-than": "Supérieur à",
|
||||
"label.greater-than-equals": "Supérieur ou égal à",
|
||||
"label.host": "Host",
|
||||
|
|
@ -97,7 +97,7 @@
|
|||
"label.join": "Rejoindre",
|
||||
"label.join-team": "Rejoindre une équipe",
|
||||
"label.journey": "Journey",
|
||||
"label.journey-description": "Understand how users navigate through your website.",
|
||||
"label.journey-description": "Comprendre comment les utilisateurs naviguent sur votre site web.",
|
||||
"label.language": "Langue",
|
||||
"label.languages": "Langues",
|
||||
"label.laptop": "Portable",
|
||||
|
|
@ -137,12 +137,12 @@
|
|||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.powered-by": "Propulsé par {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"label.previous": "Précédent",
|
||||
"label.previous-period": "Période précédente",
|
||||
"label.previous-year": "Année précédente",
|
||||
"label.profile": "Profil",
|
||||
"label.properties": "Properties",
|
||||
"label.property": "Property",
|
||||
"label.properties": "Propriétés",
|
||||
"label.property": "Propriété",
|
||||
"label.queries": "Requêtes",
|
||||
"label.query": "Requête",
|
||||
"label.query-parameters": "Paramètres de requête",
|
||||
|
|
@ -162,14 +162,14 @@
|
|||
"label.retention": "Rétention",
|
||||
"label.retention-description": "Mesure de l'attractivité du site en visualisant les taux de visiteurs qui reviennent.",
|
||||
"label.revenue": "Revenue",
|
||||
"label.revenue-description": "Look into your revenue across time.",
|
||||
"label.revenue-property": "Revenue Property",
|
||||
"label.revenue-description": "Examinez vos revenus au fil du temps.",
|
||||
"label.revenue-property": "Propriétés des revenues",
|
||||
"label.role": "Rôle",
|
||||
"label.run-query": "Éxécuter la requête",
|
||||
"label.save": "Enregistrer",
|
||||
"label.screens": "Résolutions d'écran",
|
||||
"label.search": "Rechercher",
|
||||
"label.select": "Select",
|
||||
"label.select": "Selectionner",
|
||||
"label.select-date": "Choisir une période",
|
||||
"label.select-role": "Choisir un rôle",
|
||||
"label.select-website": "Choisir un site",
|
||||
|
|
@ -178,17 +178,17 @@
|
|||
"label.settings": "Paramètres",
|
||||
"label.share-url": "URL de partage",
|
||||
"label.single-day": "Journée",
|
||||
"label.start-step": "Start Step",
|
||||
"label.start-step": "Etape de démarrage",
|
||||
"label.steps": "Étapes",
|
||||
"label.sum": "Somme",
|
||||
"label.tablet": "Tablette",
|
||||
"label.team": "Équipe",
|
||||
"label.team-id": "ID d'équipe",
|
||||
"label.team-manager": "Team manager",
|
||||
"label.team-manager": "Manager de l'équipe",
|
||||
"label.team-member": "Membre de l'équipe",
|
||||
"label.team-name": "Nom de l'équipe",
|
||||
"label.team-owner": "Propriétaire de l'équipe",
|
||||
"label.team-view-only": "Team view only",
|
||||
"label.team-view-only": "Vue d'équipe uniquement",
|
||||
"label.team-websites": "Sites d'équipes",
|
||||
"label.teams": "Équipes",
|
||||
"label.theme": "Thème",
|
||||
|
|
@ -209,14 +209,14 @@
|
|||
"label.type": "Type",
|
||||
"label.unique": "Unique",
|
||||
"label.unique-visitors": "Visiteurs uniques",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "Clients uniques",
|
||||
"label.unknown": "Inconnu",
|
||||
"label.untitled": "Sans titre",
|
||||
"label.update": "Modifier",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.user": "Utilisateur",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "Propriétés d'utilisateurs",
|
||||
"label.username": "Nom d'utilisateur",
|
||||
"label.users": "Utilisateurs",
|
||||
"label.utm": "UTM",
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
"label.add": "Adaugă",
|
||||
"label.add-description": "Adaugă descriere",
|
||||
"label.add-member": "Adaugă membru",
|
||||
"label.add-step": "Add step",
|
||||
"label.add-website": "Adăugare site web",
|
||||
"label.add-step": "Adaugă pas",
|
||||
"label.add-website": "Adaugă site web",
|
||||
"label.admin": "Administrator",
|
||||
"label.after": "După",
|
||||
"label.all": "Toate",
|
||||
|
|
@ -24,12 +24,12 @@
|
|||
"label.cities": "Orașe",
|
||||
"label.city": "Oraș",
|
||||
"label.clear-all": "Șterge tot",
|
||||
"label.compare": "Compare",
|
||||
"label.compare": "Compară",
|
||||
"label.confirm": "Confirm",
|
||||
"label.confirm-password": "Confirmare parolă",
|
||||
"label.contains": "Conține",
|
||||
"label.continue": "Continuă",
|
||||
"label.count": "Count",
|
||||
"label.count": "Număr",
|
||||
"label.countries": "Țări",
|
||||
"label.country": "Țară",
|
||||
"label.create": "Crează",
|
||||
|
|
@ -37,21 +37,21 @@
|
|||
"label.create-team": "Crează echipă",
|
||||
"label.create-user": "Crează utilizator",
|
||||
"label.created": "Creat",
|
||||
"label.created-by": "Created By",
|
||||
"label.current": "Current",
|
||||
"label.created-by": "Creat de",
|
||||
"label.current": "Curent",
|
||||
"label.current-password": "Parola curentă",
|
||||
"label.custom-range": "Interval personalizat",
|
||||
"label.dashboard": "Tablou de bord",
|
||||
"label.data": "Date",
|
||||
"label.date": "Data",
|
||||
"label.date-range": "Interval de date",
|
||||
"label.date": "Dată",
|
||||
"label.date-range": "Interval",
|
||||
"label.day": "Zi",
|
||||
"label.default-date-range": "Interval de date implicit",
|
||||
"label.default-date-range": "Interval implicit",
|
||||
"label.delete": "Șterge",
|
||||
"label.delete-report": "Șterge raport",
|
||||
"label.delete-team": "Șterge echipă",
|
||||
"label.delete-user": "Șterge utilizator",
|
||||
"label.delete-website": "Ștergere site web",
|
||||
"label.delete-website": "Șterge site web",
|
||||
"label.description": "Descriere",
|
||||
"label.desktop": "Desktop",
|
||||
"label.details": "Detalii",
|
||||
|
|
@ -65,12 +65,12 @@
|
|||
"label.edit-dashboard": "Editare tablou de bord",
|
||||
"label.edit-member": "Editare membru",
|
||||
"label.enable-share-url": "Activare adresă URL de distribuire",
|
||||
"label.end-step": "End Step",
|
||||
"label.entry": "Entry URL",
|
||||
"label.end-step": "Pas final",
|
||||
"label.entry": "URL de intrare",
|
||||
"label.event": "Eveniment",
|
||||
"label.event-data": "Date despre eveniment",
|
||||
"label.events": "Evenimente",
|
||||
"label.exit": "Exit URL",
|
||||
"label.exit": "URL de ieșire",
|
||||
"label.false": "Fals",
|
||||
"label.field": "Câmp",
|
||||
"label.fields": "Câmpuri",
|
||||
|
|
@ -78,12 +78,12 @@
|
|||
"label.filter-combined": "Combinat",
|
||||
"label.filter-raw": "Brut",
|
||||
"label.filters": "Filtre",
|
||||
"label.first-seen": "First seen",
|
||||
"label.first-seen": "Văzut pentru prima dată",
|
||||
"label.funnel": "Parcursul utilizatorului",
|
||||
"label.funnel-description": "Înțelege rata de conversie și rata de abandon a utilizatorilor.",
|
||||
"label.goal": "Goal",
|
||||
"label.goals": "Goals",
|
||||
"label.goals-description": "Track your goals for pageviews and events.",
|
||||
"label.goal": "Obiectiv",
|
||||
"label.goals": "Obiective",
|
||||
"label.goals-description": "Urmărește obiectivele de vizualizări și evenimente.",
|
||||
"label.greater-than": "Mai mare decât",
|
||||
"label.greater-than-equals": "Mai mare sau egal cu",
|
||||
"label.host": "Host",
|
||||
|
|
@ -96,15 +96,15 @@
|
|||
"label.is-set": "Este setat",
|
||||
"label.join": "Alătură-te",
|
||||
"label.join-team": "Alătură-te echipei",
|
||||
"label.journey": "Journey",
|
||||
"label.journey-description": "Understand how users navigate through your website.",
|
||||
"label.journey": "Traseu",
|
||||
"label.journey-description": "Înțelege cum navighează vizitatorii prin website.",
|
||||
"label.language": "Limbă",
|
||||
"label.languages": "Limbi",
|
||||
"label.laptop": "Laptop",
|
||||
"label.last-days": "Ultimele {x} zile",
|
||||
"label.last-hours": "Ultimele {x} ore",
|
||||
"label.last-months": "Last {x} months",
|
||||
"label.last-seen": "Last seen",
|
||||
"label.last-months": "Ultimele {x} luni",
|
||||
"label.last-seen": "Văzut ultima dată",
|
||||
"label.leave": "Părăsește",
|
||||
"label.leave-team": "Părăsește echipa",
|
||||
"label.less-than": "Mai puțin decât",
|
||||
|
|
@ -134,15 +134,15 @@
|
|||
"label.pageTitle": "Titlul paginii",
|
||||
"label.pages": "Pagini",
|
||||
"label.password": "Parolă",
|
||||
"label.path": "Path",
|
||||
"label.paths": "Paths",
|
||||
"label.path": "Rută",
|
||||
"label.paths": "Rute",
|
||||
"label.powered-by": "Cu sprijinul {name}",
|
||||
"label.previous": "Previous",
|
||||
"label.previous-period": "Previous period",
|
||||
"label.previous-year": "Previous year",
|
||||
"label.previous": "Anterior",
|
||||
"label.previous-period": "Perioda anterioară",
|
||||
"label.previous-year": "Anul anterior",
|
||||
"label.profile": "Profil",
|
||||
"label.properties": "Properties",
|
||||
"label.property": "Property",
|
||||
"label.properties": "Proprietăți",
|
||||
"label.property": "Proprietate",
|
||||
"label.queries": "Interogări",
|
||||
"label.query": "Interogare",
|
||||
"label.query-parameters": "Parametri de interogare",
|
||||
|
|
@ -161,8 +161,8 @@
|
|||
"label.reset-website": "Resetează statisticile pentru site",
|
||||
"label.retention": "Retenție",
|
||||
"label.retention-description": "Măsoară atractivitatea site-ului tău prin urmărirea frecvenței cu care utilizatorii se întorc.",
|
||||
"label.revenue": "Revenue",
|
||||
"label.revenue-description": "Look into your revenue across time.",
|
||||
"label.revenue": "Venit",
|
||||
"label.revenue-description": "Urmărește venitul în timp.",
|
||||
"label.revenue-property": "Revenue Property",
|
||||
"label.role": "Rol",
|
||||
"label.run-query": "Execută interogarea",
|
||||
|
|
@ -173,18 +173,18 @@
|
|||
"label.select-date": "Selectează data",
|
||||
"label.select-role": "Selectează rolul",
|
||||
"label.select-website": "Selectează website",
|
||||
"label.session": "Session",
|
||||
"label.session": "Sesiune",
|
||||
"label.sessions": "Sesiuni",
|
||||
"label.settings": "Setări",
|
||||
"label.share-url": "Partajare URL",
|
||||
"label.single-day": "O singură zi",
|
||||
"label.start-step": "Start Step",
|
||||
"label.steps": "Steps",
|
||||
"label.start-step": "Pas de început",
|
||||
"label.steps": "Pași",
|
||||
"label.sum": "Sumă",
|
||||
"label.tablet": "Tabletă",
|
||||
"label.team": "Echipă",
|
||||
"label.team-id": "ID Echipa",
|
||||
"label.team-manager": "Team manager",
|
||||
"label.team-id": "ID Echipă",
|
||||
"label.team-manager": "Manager echipă",
|
||||
"label.team-member": "Membru echipă",
|
||||
"label.team-name": "Nume echipă",
|
||||
"label.team-owner": "Titular echipă",
|
||||
|
|
@ -202,34 +202,34 @@
|
|||
"label.total": "Total",
|
||||
"label.total-records": "Total înregistrări",
|
||||
"label.tracking-code": "Cod de urmărire",
|
||||
"label.transactions": "Transactions",
|
||||
"label.transactions": "Tranzacții",
|
||||
"label.transfer": "Transfer",
|
||||
"label.transfer-website": "Transfer website",
|
||||
"label.true": "Adevărat",
|
||||
"label.type": "Tip",
|
||||
"label.unique": "Unici",
|
||||
"label.unique-visitors": "Vizitatori unici",
|
||||
"label.uniqueCustomers": "Unique Customers",
|
||||
"label.uniqueCustomers": "Clienți unici",
|
||||
"label.unknown": "Necunoscut",
|
||||
"label.untitled": "Fără titlu",
|
||||
"label.update": "Update",
|
||||
"label.url": "URL",
|
||||
"label.urls": "URLs",
|
||||
"label.user": "Utilizator",
|
||||
"label.user-property": "User Property",
|
||||
"label.user-property": "Proprietatea utilizatorului",
|
||||
"label.username": "Nume utilizator",
|
||||
"label.users": "Utilizatori",
|
||||
"label.utm": "UTM",
|
||||
"label.utm-description": "Track your campaigns through UTM parameters.",
|
||||
"label.utm-description": "Urmărește campaniile tale cu parametri UTM.",
|
||||
"label.value": "Valoare",
|
||||
"label.view": "Vizualizare",
|
||||
"label.view-details": "Vizualizare detalii",
|
||||
"label.view-only": "Doar vizualizare",
|
||||
"label.views": "Vizualizări",
|
||||
"label.views-per-visit": "Views per visit",
|
||||
"label.views-per-visit": "Vizualizări per vizită",
|
||||
"label.visit-duration": "Timp mediu de vizitare",
|
||||
"label.visitors": "Vizitatori",
|
||||
"label.visits": "Visits",
|
||||
"label.visits": "Vizite",
|
||||
"label.website": "Website",
|
||||
"label.website-id": "ID Website",
|
||||
"label.websites": "Site-uri web",
|
||||
|
|
@ -237,7 +237,7 @@
|
|||
"label.yesterday": "Ieri",
|
||||
"message.action-confirmation": "Scrie {confirmation} în câmpul de mai jos pentru a confirma.",
|
||||
"message.active-users": "{x} {x, plural, one {vizitator activ} other {vizitatori activi}}",
|
||||
"message.collected-data": "Collected data",
|
||||
"message.collected-data": "Date colectate",
|
||||
"message.confirm-delete": "Ești sigur că vrei să ștergi {target}?",
|
||||
"message.confirm-leave": "Ești sigur că vrei să părăsești {target}?",
|
||||
"message.confirm-remove": "Ești sigur că vrei să ștergi {target}?",
|
||||
|
|
|
|||
|
|
@ -239,12 +239,12 @@ export const CHART_COLORS = [
|
|||
];
|
||||
|
||||
export const DOMAIN_REGEX =
|
||||
/^(localhost(:[1-9]\d{0,4})?|((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9-]+(-[a-z0-9-]+)*\.)+(xn--)?[a-z0-9-]{2,63})$/;
|
||||
/^(localhost(:[1-9]\d{0,4})?|((?=[a-z0-9-_]{1,63}\.)(xn--)?[a-z0-9-_]+(-[a-z0-9-_]+)*\.)+(xn--)?[a-z0-9-_]{2,63})$/;
|
||||
export const SHARE_ID_REGEX = /^[a-zA-Z0-9]{8,16}$/;
|
||||
export const UUID_REGEX =
|
||||
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/;
|
||||
export const HOSTNAME_REGEX =
|
||||
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/;
|
||||
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-_]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-_]*[A-Za-z0-9])$/;
|
||||
export const IP_REGEX =
|
||||
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(?:(?:[0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:(?:(:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/;
|
||||
export const DATETIME_REGEX =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue