Merge branch 'dev' into analytics

This commit is contained in:
Mike Cao 2023-12-20 09:32:54 -08:00
commit c990f377ae
14 changed files with 608 additions and 739 deletions

View File

@ -22,20 +22,8 @@
"plugins": ["@typescript-eslint", "prettier"],
"settings": {
"import/resolver": {
"alias": {
"map": [
["assets", "./src/assets"],
["components", "./src/components"],
["db", "./db"],
["hooks", "./src/components/hooks"],
["lang", "./src/lang"],
["lib", "./src/lib"],
["public", "./public"],
["queries", "./src/queries"],
["store", "./src/store"],
["styles", "./src/styles"]
],
"extensions": [".ts", ".tsx", ".js", ".jsx", ".json"]
"node": {
"moduleDirectory": ["node_modules", "src/"]
}
}
},

View File

@ -1,5 +1,6 @@
{
"compilerOptions": {
"baseUrl": "./src"
}
"baseUrl": "src"
},
"include": ["src"]
}

View File

@ -8,7 +8,7 @@ const contentSecurityPolicy = [
`img-src *`,
`script-src 'self' 'unsafe-eval' 'unsafe-inline'`,
`style-src 'self' 'unsafe-inline'`,
`connect-src 'self' api.umami.is`,
`connect-src 'self' api.umami.is cloud.umami.is`,
`frame-ancestors 'self' ${process.env.ALLOWED_FRAME_URLS || ''}`,
];

View File

@ -63,7 +63,7 @@
"dependencies": {
"@clickhouse/client": "^0.2.2",
"@fontsource/inter": "^4.5.15",
"@prisma/client": "5.6.0",
"@prisma/client": "5.7.0",
"@prisma/extension-read-replicas": "^0.3.0",
"@react-spring/web": "^9.7.3",
"@tanstack/react-query": "^5.12.2",
@ -97,7 +97,7 @@
"next-basics": "^0.39.0",
"node-fetch": "^3.2.8",
"npm-run-all": "^4.1.5",
"prisma": "5.6.0",
"prisma": "5.7.0",
"react": "^18.2.0",
"react-basics": "^0.114.0",
"react-beautiful-dnd": "^13.1.0",
@ -135,7 +135,7 @@
"cross-env": "^7.0.3",
"esbuild": "^0.17.17",
"eslint": "^8.33.0",
"eslint-config-next": "^12.2.4",
"eslint-config-next": "^14.0.4",
"eslint-config-prettier": "^8.5.0",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-import": "^2.26.0",

View File

@ -27,7 +27,7 @@ export function App({ children }) {
{children}
<UpdateNotice user={user} config={config} />
{process.env.NODE_ENV === 'production' && !pathname.includes('/share/') && (
<Script src={`telemetry.js`} />
<Script src={`/telemetry.js`} />
)}
</>
);

View File

@ -18,7 +18,7 @@ export function TeamJoinForm({ onSave, onClose }: { onSave: () => void; onClose:
const { mutate, error } = useMutation({ mutationFn: (data: any) => post('/teams/join', data) });
const ref = useRef(null);
const handleSubmit = async data => {
const handleSubmit = async (data: any) => {
mutate(data, {
onSuccess: async () => {
setValue('teams:members', Date.now());

View File

@ -7,7 +7,7 @@ import useMessages from 'components/hooks/useMessages';
import TeamsJoinButton from './TeamsJoinButton';
import TeamsAddButton from './TeamsAddButton';
export function TeamsHeader() {
export function TeamsHeader({ allowCreate = true }: { allowCreate?: boolean }) {
const { formatMessage, labels } = useMessages();
const { user } = useUser();
@ -15,7 +15,7 @@ export function TeamsHeader() {
<PageHeader title={formatMessage(labels.teams)}>
<Flexbox gap={10}>
<TeamsJoinButton />
{user.role !== ROLES.viewOnly && <TeamsAddButton />}
{allowCreate && user.role !== ROLES.viewOnly && <TeamsAddButton />}
</Flexbox>
</PageHeader>
);

View File

@ -65,7 +65,7 @@ export function TeamWebsiteAddForm({
</GridColumn>
</WebsitesDataTable>
<FormButtons flex>
<SubmitButton disabled={selected?.length === 0}>
<SubmitButton variant="primary" disabled={selected?.length === 0}>
{formatMessage(labels.addWebsite)}
</SubmitButton>
<Button onClick={onClose}>{formatMessage(labels.cancel)}</Button>

View File

@ -2,7 +2,7 @@ import useMessages from './useMessages';
import { BROWSERS } from 'lib/constants';
import useLocale from './useLocale';
import useCountryNames from './useCountryNames';
import regions from 'public/iso-3166-2.json';
import regions from '../../../public/iso-3166-2.json';
export function useFormat() {
const { formatMessage, labels } = useMessages();
@ -23,7 +23,7 @@ export function useFormat() {
};
const formatCity = (value: string, country?: string): string => {
return `${value}, ${countryNames[country]}`;
return countryNames[country] ? `${value}, ${countryNames[country]}` : value;
};
const formatDevice = (value: string): string => {

View File

@ -4,7 +4,7 @@ import useLocale from 'components/hooks/useLocale';
import useMessages from 'components/hooks/useMessages';
import useCountryNames from 'components/hooks/useCountryNames';
import MetricsTable, { MetricsTableProps } from './MetricsTable';
import regions from 'public/iso-3166-2.json';
import regions from '../../../public/iso-3166-2.json';
export function RegionsTable(props: MetricsTableProps) {
const { locale } = useLocale();

View File

@ -1,2 +1,3 @@
declare module 'cors';
declare module 'debug';
declare module 'chartjs-adapter-date-fns';

View File

@ -1,217 +0,0 @@
{
"label.access-code": "Código de acceso",
"label.actions": "Acciones",
"label.activity-log": "Registro de actividad",
"label.add": "Add",
"label.add-description": "Add description",
"label.add-website": "Nuevo sitio web",
"label.admin": "Administrador",
"label.after": "After",
"label.all": "Todos",
"label.all-time": "Todos los tiempos",
"label.analytics": "Analíticas",
"label.average": "Average",
"label.average-visit-time": "Tiempo promedio de visita",
"label.back": "Atrás",
"label.before": "Before",
"label.bounce-rate": "Porcentaje de rebote",
"label.breakdown": "Breakdown",
"label.browser": "Browser",
"label.browsers": "Navegadores",
"label.cancel": "Cancelar",
"label.change-password": "Cambiar contraseña",
"label.cities": "Ciudades",
"label.city": "City",
"label.clear-all": "Limpiar todo",
"label.confirm": "Confirmar",
"label.confirm-password": "Confirmar contraseña",
"label.contains": "Contains",
"label.continue": "Continuar",
"label.countries": "Países",
"label.country": "Country",
"label.create": "Create",
"label.create-report": "Create report",
"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": "Datos",
"label.date": "Date",
"label.date-range": "Intervalo de fechas",
"label.day": "Day",
"label.default-date-range": "Intervalo por defecto",
"label.delete": "Eliminar",
"label.delete-team": "Eliminar team",
"label.delete-user": "Eliminar usuario",
"label.delete-website": "Eliminar sitio",
"label.description": "Description",
"label.desktop": "Escritorio",
"label.details": "Detalles",
"label.device": "Device",
"label.devices": "Dispositivos",
"label.dismiss": "Ignorar",
"label.does-not-contain": "Does not contain",
"label.domain": "Dominio",
"label.dropoff": "Dropoff",
"label.edit": "Editar",
"label.edit-dashboard": "Editar panel",
"label.enable-share-url": "Habilitar compartir URL",
"label.event": "Evento",
"label.event-data": "Event data",
"label.events": "Eventos",
"label.false": "False",
"label.field": "Field",
"label.fields": "Fields",
"label.filter": "Filter",
"label.filter-combined": "Combinado",
"label.filter-raw": "Personalizado",
"label.filters": "Filters",
"label.funnel": "Funnel",
"label.funnel-description": "Understand the conversion and drop-off rate of users.",
"label.greater-than": "Greater than",
"label.greater-than-equals": "Greater than or equals",
"label.insights": "Insights",
"label.insights-description": "Dive deeper into your data by using segments and filters.",
"label.is": "Is",
"label.is-not": "Is not",
"label.is-not-set": "Is not set",
"label.is-set": "Is set",
"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": "Abandonar",
"label.leave-team": "Abandonar equipo",
"label.less-than": "Less than",
"label.less-than-equals": "Less than or equals",
"label.login": "Iniciar sesión",
"label.logout": "Cerrar sesión",
"label.max": "Max",
"label.members": "Miembros",
"label.min": "Min",
"label.mobile": "Móvil",
"label.more": "Más",
"label.my-websites": "My websites",
"label.name": "Nombre",
"label.new-password": "Nueva contraseña",
"label.none": "Ninguno",
"label.os": "OS",
"label.overview": "Overview",
"label.owner": "Propietario",
"label.page-of": "Page {current} of {total}",
"label.page-views": "Vistas",
"label.pageTitle": "Page title",
"label.pages": "Páginas",
"label.password": "Contraseña",
"label.powered-by": "Analíticas de {name}",
"label.profile": "Perfil",
"label.queries": "Consultas",
"label.query": "Query",
"label.query-parameters": "Parámetros de petición",
"label.realtime": "Tiempo real",
"label.referrer": "Referrer",
"label.referrers": "Referido desde",
"label.refresh": "Actualizar",
"label.regenerate": "Regenerar",
"label.region": "Region",
"label.regions": "Regiones",
"label.remove": "Quitar",
"label.reports": "Reports",
"label.required": "Obligatorio",
"label.reset": "Reiniciar",
"label.reset-website": "Reiniciar estadísticas",
"label.retention": "Retention",
"label.retention-description": "Measure your website stickiness by tracking how often users return.",
"label.role": "Rol",
"label.run-query": "Run query",
"label.save": "Guardar",
"label.screens": "Pantallas",
"label.search": "Search",
"label.select-date": "Select date",
"label.select-website": "Seleccionar sitio web",
"label.sessions": "Sesiones",
"label.settings": "Configuraciones",
"label.share-url": "Compartir URL",
"label.single-day": "Día",
"label.sum": "Sum",
"label.tablet": "Tableta",
"label.team": "Equipo",
"label.team-guest": "Invitado de equipo",
"label.team-id": "ID de equipo",
"label.team-member": "Miembro de equipo",
"label.team-name": "Team name",
"label.team-owner": "Admin. del equipo",
"label.team-websites": "Team websites",
"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": "Título",
"label.today": "Hoy",
"label.toggle-charts": "Alternar gráficas",
"label.total": "Total",
"label.total-records": "Total records",
"label.tracking-code": "Código de rastreo",
"label.true": "True",
"label.type": "Type",
"label.unique": "Unique",
"label.unique-visitors": "Visitantes únicos",
"label.unknown": "Desconocida",
"label.untitled": "Untitled",
"label.url": "URL",
"label.urls": "URLs",
"label.user": "Usuario",
"label.username": "Nombre de usuario",
"label.users": "Usuarios",
"label.value": "Value",
"label.view": "Visualizar",
"label.view-details": "Ver detalles",
"label.view-only": "View only",
"label.views": "Vistas",
"label.visitors": "Visitantes",
"label.website": "Website",
"label.website-id": "ID del sitio web",
"label.websites": "Sitios",
"label.window": "Window",
"label.yesterday": "Ayer",
"message.active-users": "{x} {x, plural, one {activo} other {activos}}",
"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-account": "To delete this account, type {confirmation} in the box below to confirm.",
"message.delete-website": "To delete this website, type {confirmation} in the box below to confirm.",
"message.delete-website-warning": "Toda la información relacionada será eliminada.",
"message.error": "Algo falló.",
"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": "Longitud mínima de {n} caracteres",
"message.new-version-available": "A new version of Umami {version} is available!",
"message.no-data-available": "No hay información disponible.",
"message.no-event-data": "No event data is available.",
"message.no-match-password": "Las contraseñas no coinciden",
"message.no-results-found": "No results were found.",
"message.no-team-websites": "Este equipo no tiene ningún sitio web configurado.",
"message.no-teams": "No has creado ningún equipo.",
"message.no-users": "No hay usuarios.",
"message.no-websites-configured": "No tienes ningún sitio configurado.",
"message.page-not-found": "Página no encontrada",
"message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.",
"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.",
"message.share-url": "Esta es la URL compartida públicamente para {target}.",
"message.team-already-member": "Ya eres miembro de este equipo.",
"message.team-not-found": "Equipo no encontrado.",
"message.team-websites-info": "Las analíticas de tus sitios pueden verse por cualquier miembro del equipo.",
"message.tracking-code": "Código de rastreo",
"message.user-deleted": "Usuario eliminado.",
"message.visitor-log": "Visitante desde {country} usando {browser} en {os} {device}"
}

View File

@ -56,7 +56,7 @@ export const languages = {
'el-GR': { label: 'Ελληνικά', dateLocale: el },
'en-GB': { label: 'English (UK)', dateLocale: enGB },
'en-US': { label: 'English (US)', dateLocale: enUS },
'es-MX': { label: 'Español', dateLocale: es },
'es-ES': { label: 'Español', dateLocale: es },
'fa-IR': { label: 'فارسی', dateLocale: faIR, dir: 'rtl' },
'fi-FI': { label: 'Suomi', dateLocale: fi },
'fo-FO': { label: 'Føroyskt' },

1082
yarn.lock

File diff suppressed because it is too large Load Diff