Skip to content

Commit

Permalink
Merge pull request #1994 from umami-software/dev
Browse files Browse the repository at this point in the history
v2.2.0
  • Loading branch information
mikecao committed Apr 26, 2023
2 parents 26a9cb6 + 9345c9a commit 46615fe
Show file tree
Hide file tree
Showing 25 changed files with 594 additions and 502 deletions.
33 changes: 33 additions & 0 deletions components/common/ErrorBoundary.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* eslint-disable no-console */
import { ErrorBoundary as Boundary } from 'react-error-boundary';
import { Button } from 'react-basics';
import useMessages from 'hooks/useMessages';
import styles from './ErrorBoundry.module.css';

const logError = (error, info) => {
console.error(error, info.componentStack);
};

export function ErrorBoundary({ children }) {
const { formatMessage, messages } = useMessages();

const fallbackRender = ({ error, resetErrorBoundary }) => {
console.log({ error });
return (
<div className={styles.error} role="alert">
<h1>{formatMessage(messages.error)}</h1>
<h3>{error.message}</h3>
<pre>{error.stack}</pre>
<Button onClick={resetErrorBoundary}>OK</Button>
</div>
);
};

return (
<Boundary fallbackRender={fallbackRender} onError={logError}>
{children}
</Boundary>
);
}

export default ErrorBoundary;
19 changes: 19 additions & 0 deletions components/common/ErrorBoundry.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.error {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
z-index: var(--z-index-overlay);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 600px;
gap: 20px;
}

.error button {
align-self: center;
}
16 changes: 7 additions & 9 deletions components/common/FilterLink.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,16 @@ export function FilterLink({ id, value, label, externalUrl, children, className
const selected = query[id] === value;

return (
<div className={classNames(styles.row, className)}>
<div
className={classNames(styles.row, className, {
[styles.inactive]: active && !selected,
[styles.active]: active && selected,
})}
>
{children}
{!value && `(${label || formatMessage(labels.unknown)})`}
{value && (
<Link
href={resolveUrl({ [id]: value })}
className={classNames(styles.label, {
[styles.inactive]: active && !selected,
[styles.active]: active && selected,
})}
replace
>
<Link href={resolveUrl({ [id]: value })} className={styles.label} replace>
{safeDecodeURI(label || value)}
</Link>
)}
Expand Down
8 changes: 6 additions & 2 deletions components/common/FilterLink.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
gap: 10px;
}

.row .inactive {
.row.inactive {
color: var(--base500);
}

.row .active {
.row.inactive img {
opacity: 0.35;
}

.row.active {
color: var(--base900);
font-weight: 600;
}
Expand Down
6 changes: 3 additions & 3 deletions components/input/DateFilter.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export function DateFilter({ websiteId, value, className }) {
if (data) {
setDateRange({ value, ...getDateRangeValues(new Date(data.createdAt), Date.now()) });
}
} else {
} else if (value !== 'all') {
setDateRange(value);
}
}
Expand Down Expand Up @@ -61,7 +61,7 @@ export function DateFilter({ websiteId, value, className }) {
value: '90day',
},
{ label: formatMessage(labels.thisYear), value: '1year' },
{
websiteId && {
label: formatMessage(labels.allTime),
value: 'all',
divider: true,
Expand All @@ -71,7 +71,7 @@ export function DateFilter({ websiteId, value, className }) {
value: 'custom',
divider: true,
},
];
].filter(n => n);

const renderValue = value => {
return value === 'custom' ? (
Expand Down
2 changes: 1 addition & 1 deletion components/metrics/CountriesTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export function CountriesTable({ websiteId, ...props }) {
value={countryNames[code] && code}
label={countryNames[code]}
>
<img src={`/images/flags/${code.toLowerCase()}.png`} alt={code} />
<img src={`/images/flags/${code?.toLowerCase() || 'xx'}.png`} alt={code} />
</FilterLink>
);
}
Expand Down
2 changes: 1 addition & 1 deletion components/metrics/RegionsTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function RegionsTable({ websiteId, ...props }) {
const renderLink = ({ x: code }) => {
return (
<FilterLink id="region" className={locale} value={code} label={renderLabel(code)}>
<img src={`/images/flags/${code.split('-')[0].toLowerCase()}.png`} alt={code} />
<img src={`/images/flags/${code?.split('-')?.[0]?.toLowerCase() || 'xx'}.png`} alt={code} />
</FilterLink>
);
};
Expand Down
11 changes: 8 additions & 3 deletions components/pages/settings/users/UsersList.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,15 @@ export function UsersList() {
const { toast, showToast } = useToast();
const hasData = data && data.length !== 0;

const handleSave = () => refetch();
const handleSave = () => {
refetch().then(() => showToast({ message: formatMessage(messages.saved), variant: 'success' }));
};

const handleDelete = () =>
showToast({ message: formatMessage(messages.userDeleted), variant: 'success' });
const handleDelete = () => {
refetch().then(() =>
showToast({ message: formatMessage(messages.userDeleted), variant: 'success' }),
);
};

return (
<Page loading={isLoading} error={error}>
Expand Down
12 changes: 6 additions & 6 deletions lang/ar-SA.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"label.access-code": "Access code",
"label.actions": "اجراءات",
"label.access-code": "كود الدعوة",
"label.actions": "الإجراءات",
"label.activity-log": "سجل الأحداث",
"label.add-website": "إضافة موقع",
"label.admin": "مدير",
Expand Down Expand Up @@ -59,7 +59,7 @@
"label.more": "المزيد",
"label.name": "الإسم",
"label.new-password": "كلمة مرور جديدة",
"label.none": "لا شيء",
"label.none": "غير معرف",
"label.operating-systems": "نظام التشغيل",
"label.owner": "المالك",
"label.page-views": "مشاهدات الصفحة",
Expand Down Expand Up @@ -109,8 +109,8 @@
"label.users": "المستخدمين",
"label.view": "عرض",
"label.view-details": "عرض التفاصيل",
"label.views": "مشاهدات",
"label.visitors": "زوار",
"label.views": "المشاهدات",
"label.visitors": "الزوار",
"label.website-id": "معرف الموقع",
"label.websites": "المواقع",
"label.yesterday": "الأمس",
Expand All @@ -136,7 +136,7 @@
"message.saved": "تم الحفظ بنجاح.",
"message.share-url": "هذا الرابط الذي تم مشاركته بشكل عام لـ {target}.",
"message.team-already-member": "أنت عضو في المجموعة",
"message.team-not-found": "لم يتم العثور على المجموعة found.",
"message.team-not-found": "لم يتم العثور على المجموعة",
"message.tracking-code": "كود التتبع",
"message.user-deleted": "تم حذف المستخدم.",
"message.visitor-log": "زائر من {country} يستخدم {browser} على {os} {device}",
Expand Down
108 changes: 54 additions & 54 deletions lang/es-MX.json
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
{
"label.access-code": "Access code",
"label.access-code": "Código de acceso",
"label.actions": "Acciones",
"label.activity-log": "Activity log",
"label.add-website": "Agregar sitio",
"label.activity-log": "Registro de actividad",
"label.add-website": "Nuevo sitio web",
"label.admin": "Administrador",
"label.all": "Todos",
"label.all-time": "Todos los tiempos",
"label.analytics": "Analytics",
"label.analytics": "Analíticas",
"label.average-visit-time": "Tiempo promedio de visita",
"label.back": "Atrás",
"label.bounce-rate": "Porcentaje de rebote",
"label.browsers": "Navegadores",
"label.cancel": "Cancelar",
"label.change-password": "Cambiar contraseña",
"label.cities": "Cities",
"label.clear-all": "Clear all",
"label.confirm": "Confirm",
"label.cities": "Ciudades",
"label.clear-all": "Limpiar todo",
"label.confirm": "Confirmar",
"label.confirm-password": "Confirmar contraseña",
"label.continue": "Continue",
"label.continue": "Continuar",
"label.countries": "Países",
"label.create-team": "Create team",
"label.create-user": "Create user",
"label.created": "Created",
"label.create-team": "Crear equipo",
"label.create-user": "Crear usuario",
"label.created": "Creado",
"label.current-password": "Contraseña actual",
"label.custom-range": "Intervalo personalizado",
"label.dashboard": "Panel de control",
"label.data": "Data",
"label.date-range": "Fechas",
"label.data": "Datos",
"label.date-range": "Intervalo de fechas",
"label.default-date-range": "Intervalo por defecto",
"label.delete": "Eliminar",
"label.delete-team": "Delete team",
"label.delete-user": "Delete user",
"label.delete-team": "Eliminar team",
"label.delete-user": "Eliminar usuario",
"label.delete-website": "Eliminar sitio",
"label.desktop": "Escritorio",
"label.details": "Details",
"label.details": "Detalles",
"label.devices": "Dispositivos",
"label.dismiss": "Ignorar",
"label.domain": "Dominio",
Expand All @@ -43,18 +43,18 @@
"label.events": "Eventos",
"label.filter-combined": "Combinado",
"label.filter-raw": "Personalizado",
"label.join": "Join",
"label.join-team": "Join team",
"label.join": "Unir",
"label.join-team": "Unir a equipo",
"label.language": "Idioma",
"label.languages": "Idiomas",
"label.laptop": "Portátil",
"label.last-days": "Últimos {x} días",
"label.last-hours": "Últimas {x} horas",
"label.leave": "Leave",
"label.leave-team": "Leave team",
"label.leave": "Abandonar",
"label.leave-team": "Abandonar equipo",
"label.login": "Iniciar sesión",
"label.logout": "Cerrar sesión",
"label.members": "Members",
"label.members": "Miembros",
"label.mobile": "Móvil",
"label.more": "Más",
"label.name": "Nombre",
Expand All @@ -67,80 +67,80 @@
"label.password": "Contraseña",
"label.powered-by": "Analíticas de {name}",
"label.profile": "Perfil",
"label.queries": "Queries",
"label.queries": "Consultas",
"label.query-parameters": "Parámetros de petición",
"label.realtime": "Tiempo real",
"label.referrers": "Referido desde",
"label.refresh": "Actualizar",
"label.regenerate": "Regenerate",
"label.regions": "Regions",
"label.remove": "Remove",
"label.regenerate": "Regenerar",
"label.regions": "Regiones",
"label.remove": "Quitar",
"label.required": "Obligatorio",
"label.reset": "Reiniciar",
"label.reset-website": "Reiniciar estadísticas",
"label.role": "Role",
"label.role": "Rol",
"label.save": "Guardar",
"label.screens": "Pantallas",
"label.select-website": "Select website",
"label.sessions": "Sessions",
"label.select-website": "Seleccionar sitio web",
"label.sessions": "Sesiones",
"label.settings": "Configuraciones",
"label.share-url": "Compartir URL",
"label.single-day": "Dia",
"label.single-day": "Día",
"label.tablet": "Tableta",
"label.team": "Team",
"label.team-guest": "Team guest",
"label.team-id": "Team ID",
"label.team-member": "Team member",
"label.team-owner": "Team owner",
"label.teams": "Teams",
"label.team": "Equipo",
"label.team-guest": "Invitado de equipo",
"label.team-id": "ID de equipo",
"label.team-member": "Miembro de equipo",
"label.team-owner": "Admin. del equipo",
"label.teams": "Equipos",
"label.theme": "Tema",
"label.this-month": "Este mes",
"label.this-week": "Esta semana",
"label.this-year": "Este año",
"label.timezone": "Zona horaria",
"label.title": "Title",
"label.title": "Título",
"label.today": "Hoy",
"label.toggle-charts": "Alternar gráficas",
"label.tracking-code": "Código de rastreo",
"label.unique-visitors": "Visitantes únicos",
"label.unknown": "Desconocida",
"label.user": "User",
"label.user": "Usuario",
"label.username": "Nombre de usuario",
"label.users": "Users",
"label.view": "View",
"label.users": "Usuarios",
"label.view": "Visualizar",
"label.view-details": "Ver detalles",
"label.views": "Vistas",
"label.visitors": "Visitantes",
"label.website-id": "Website ID",
"label.website-id": "ID del sitio web",
"label.websites": "Sitios",
"label.yesterday": "Ayer",
"message.active-users": "{x} {x, plural, one {activo} other {activos}}",
"message.confirm-delete": "¿Estás seguro(a) de querer eliminar {target}?",
"message.confirm-leave": "Are you sure you want to leave {target}?",
"message.confirm-reset": "¿Seguro que deseas restablecer las estadísticas de {target}?",
"message.delete-website": "Eliminar sitio",
"message.confirm-delete": "¿Seguro que quieres eliminar {target}?",
"message.confirm-leave": "¿Seguro que quieres abandonar {target}?",
"message.confirm-reset": "¿Seguro que quieres BORRAR las analíticas de {target}?",
"message.delete-website": "Eliminar sitio web",
"message.delete-website-warning": "Toda la información relacionada será eliminada.",
"message.error": "Algo falló.",
"message.event-log": "{event} on {url}",
"message.event-log": "{event} en {url}",
"message.go-to-settings": "Ir a la configuración",
"message.incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
"message.invalid-domain": "Dominio inválido",
"message.min-password-length": "Minimum length of {n} characters",
"message.min-password-length": "Longitud mínima de {n} caracteres",
"message.no-data-available": "No hay información disponible.",
"message.no-match-password": "Las contraseñas no coinciden",
"message.no-teams": "You have not created any teams.",
"message.no-users": "There are no users.",
"message.no-teams": "No has creado ningún equipo.",
"message.no-users": "No hay usuarios.",
"message.page-not-found": "Página no encontrada",
"message.reset-website": "Reiniciar estadísticas",
"message.reset-website-warning": "Todas las estadísticas de esta página serán eliminadas, pero el código de rastreo permanecerá intacto.",
"message.saved": "Guardado exitosamente.",
"message.saved": "Guardado.",
"message.share-url": "Esta es la URL compartida públicamente para {target}.",
"message.team-already-member": "You are already a member of the team.",
"message.team-not-found": "Team not found.",
"message.team-already-member": "Ya eres miembro de este equipo.",
"message.team-not-found": "Equipo no encontrado.",
"message.tracking-code": "Código de rastreo",
"message.user-deleted": "User deleted.",
"message.user-deleted": "Usuario eliminado.",
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}",
"messages.no-team-websites": "This team does not have any websites.",
"messages.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
"messages.no-websites-configured": "No tienes ningún sitio configurado.",
"messages.team-websites-info": "Websites can be viewed by anyone on the team."
"messages.team-websites-info": "Las analíticas de tus sitios pueden verse por cualquier miembro del equipo."
}
Loading

1 comment on commit 46615fe

@vercel
Copy link

@vercel vercel bot commented on 46615fe Apr 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

umami – ./

umami-app.vercel.app
umami-git-master-umami-software.vercel.app
umami-umami-software.vercel.app

Please sign in to comment.