Merge branch 'dev' into dash-inactive

This commit is contained in:
Mike Cao 2024-11-18 13:31:30 -08:00 committed by GitHub
commit 65d09a57d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 529 additions and 458 deletions

View file

@ -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}>

View file

@ -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) {

View file

@ -59,5 +59,6 @@
align-items: center;
justify-content: space-between;
padding-inline-end: 0;
z-index: 10;
}
}

View file

@ -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,
});

View file

@ -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",

View file

@ -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}?",

View file

@ -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 =