From 43907bd07554cdb20222d7f18e8af1279a5f0372 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 3 May 2024 23:21:27 -0700 Subject: [PATCH 001/121] Fixed metrics search. --- package.json | 2 +- src/components/hooks/queries/useWebsiteMetrics.ts | 11 ++++------- src/components/metrics/MetricsTable.tsx | 12 ++++++++---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d68af5a6..d5a090df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umami", - "version": "2.11.3", + "version": "2.12.0", "description": "A simple, fast, privacy-focused alternative to Google Analytics.", "author": "Umami Software, Inc. ", "license": "MIT", diff --git a/src/components/hooks/queries/useWebsiteMetrics.ts b/src/components/hooks/queries/useWebsiteMetrics.ts index 301b2e04..dd201155 100644 --- a/src/components/hooks/queries/useWebsiteMetrics.ts +++ b/src/components/hooks/queries/useWebsiteMetrics.ts @@ -4,8 +4,7 @@ import { useFilterParams } from '../useFilterParams'; export function useWebsiteMetrics( websiteId: string, - type: string, - limit: number, + query: { type: string; limit: number; search: string }, options?: Omit void }, 'queryKey' | 'queryFn'>, ) { const { get, useQuery } = useApi(); @@ -17,19 +16,17 @@ export function useWebsiteMetrics( { websiteId, ...params, - type, - limit, + ...query, }, ], queryFn: async () => { const filters = { ...params }; - filters[type] = undefined; + filters[query.type] = undefined; const data = await get(`/websites/${websiteId}/metrics`, { ...filters, - type, - limit, + ...query, }); options?.onDataLoad?.(data); diff --git a/src/components/metrics/MetricsTable.tsx b/src/components/metrics/MetricsTable.tsx index cfabdd30..857c136b 100644 --- a/src/components/metrics/MetricsTable.tsx +++ b/src/components/metrics/MetricsTable.tsx @@ -48,10 +48,14 @@ export function MetricsTable({ const { formatMessage, labels } = useMessages(); const { dir } = useLocale(); - const { data, isLoading, isFetched, error } = useWebsiteMetrics(websiteId, type, limit, { - retryDelay: delay || DEFAULT_ANIMATION_DURATION, - onDataLoad, - }); + const { data, isLoading, isFetched, error } = useWebsiteMetrics( + websiteId, + { type, limit, search }, + { + retryDelay: delay || DEFAULT_ANIMATION_DURATION, + onDataLoad, + }, + ); const filteredData = useMemo(() => { if (data) { From 1dda711401076d15693607c2f27897a453040d65 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Sat, 4 May 2024 13:36:08 -0700 Subject: [PATCH 002/121] add date-fns-tz --- package.components.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.components.json b/package.components.json index 41e72579..2ca9458d 100644 --- a/package.components.json +++ b/package.components.json @@ -11,6 +11,7 @@ "@tanstack/react-query": "^4.33.0", "classnames": "^2.3.1", "colord": "^2.9.2", + "date-fns-tz": "^1.1.4", "immer": "^9.0.12", "moment-timezone": "^0.5.35", "next": "^13.4.0", From 8fb436ab16afbb1781a287dcd52e5ed89c370321 Mon Sep 17 00:00:00 2001 From: Andrii Leitsius Date: Sun, 5 May 2024 14:33:20 +0300 Subject: [PATCH 003/121] Update uk-UA translation --- src/lang/uk-UA.json | 230 ++++++++++++++++++++++---------------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json index 6b3e31d5..1042f3b4 100644 --- a/src/lang/uk-UA.json +++ b/src/lang/uk-UA.json @@ -1,122 +1,122 @@ { - "label.access-code": "Access code", + "label.access-code": "Код доступу", "label.actions": "Дії", - "label.activity-log": "Activity log", - "label.add": "Add", - "label.add-description": "Add description", - "label.add-member": "Add member", - "label.add-step": "Add step", + "label.activity-log": "Журнал активності", + "label.add": "Додати", + "label.add-description": "Додати опис", + "label.add-member": "Додати учасника", + "label.add-step": "Додати крок", "label.add-website": "Додати сайт", "label.admin": "Адміністратор", - "label.after": "After", + "label.after": "Після", "label.all": "Всі", "label.all-time": "Весь час", - "label.analytics": "Analytics", - "label.average": "Average", + "label.analytics": "Аналітика", + "label.average": "Середнє", "label.average-visit-time": "Середній час візиту", "label.back": "Назад", - "label.before": "Before", + "label.before": "Раніше", "label.bounce-rate": "Показник відмов", - "label.breakdown": "Breakdown", - "label.browser": "Browser", + "label.breakdown": "Розподіл", + "label.browser": "Браузер", "label.browsers": "Браузери", "label.cancel": "Відмінити", "label.change-password": "Змінити пароль", - "label.cities": "Cities", - "label.city": "City", - "label.clear-all": "Clear all", - "label.confirm": "Confirm", + "label.cities": "Міста", + "label.city": "Місто", + "label.clear-all": "Очистити все", + "label.confirm": "Підтвердити", "label.confirm-password": "Підтвердити пароль", - "label.contains": "Contains", - "label.continue": "Continue", + "label.contains": "Містить", + "label.continue": "Продовжити", "label.countries": "Країни", - "label.country": "Country", - "label.create": "Create", - "label.create-report": "Create report", - "label.create-team": "Create team", - "label.create-user": "Create user", - "label.created": "Created", - "label.created-by": "Created By", + "label.country": "Країна", + "label.create": "Створити", + "label.create-report": "Створити звіт", + "label.create-team": "Створити команду", + "label.create-user": "Створити користувача", + "label.created": "Створено", + "label.created-by": "Автор", "label.current-password": "Поточний пароль", "label.custom-range": "Довільний період", "label.dashboard": "Інформаційна панель", - "label.data": "Data", - "label.date": "Date", + "label.data": "Дані", + "label.date": "Дата", "label.date-range": "Діапазон дат", - "label.day": "Day", + "label.day": "День", "label.default-date-range": "Діапазон дат за замовчуванням", "label.delete": "Видалити", - "label.delete-report": "Delete report", - "label.delete-team": "Delete team", - "label.delete-user": "Delete user", + "label.delete-report": "Видалити звіт", + "label.delete-team": "Видалити команду", + "label.delete-user": "Видалити користувача", "label.delete-website": "Видалити сайт", - "label.description": "Description", + "label.description": "Опис", "label.desktop": "Настільний ПК", - "label.details": "Details", - "label.device": "Device", + "label.details": "Деталі", + "label.device": "Пристрій", "label.devices": "Пристрої", "label.dismiss": "Відхилити", - "label.does-not-contain": "Does not contain", + "label.does-not-contain": "Не містить", "label.domain": "Домен", "label.dropoff": "Dropoff", "label.edit": "Редагувати", - "label.edit-dashboard": "Edit dashboard", - "label.edit-member": "Edit member", + "label.edit-dashboard": "Редагувати панель", + "label.edit-member": "Редагувати учасника", "label.enable-share-url": "Дозволити ділитися посиланням", - "label.event": "Event", - "label.event-data": "Event data", + "label.event": "Подія", + "label.event-data": "Дані події", "label.events": "Події", "label.false": "False", - "label.field": "Field", - "label.fields": "Fields", - "label.filter": "Filter", + "label.field": "Поле", + "label.fields": "Поля", + "label.filter": "Фільтр", "label.filter-combined": "Об'єднані", "label.filter-raw": "Сирі дані", - "label.filters": "Filters", + "label.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.greater-than": "Більше ніж", + "label.greater-than-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": "Join", - "label.join-team": "Join team", - "label.language": "Language", + "label.is": "Є", + "label.is-not": "Не є", + "label.is-not-set": "Не встановлено", + "label.is-set": "Встановлено", + "label.join": "Приєднатись", + "label.join-team": "Приєднатись до команди", + "label.language": "Мова", "label.languages": "Мови", "label.laptop": "Ноутбук", "label.last-days": "Останні {x} днів", "label.last-hours": "Останні {x} годин", - "label.last-months": "Last {x} months", - "label.leave": "Leave", - "label.leave-team": "Leave team", - "label.less-than": "Less than", - "label.less-than-equals": "Less than or equals", + "label.last-months": "Останні {x} місяців", + "label.leave": "Покинути", + "label.leave-team": "Покинути", + "label.less-than": "Менше ніж", + "label.less-than-equals": "Менше або рівно", "label.login": "Увійти", "label.logout": "Вийти", - "label.manage": "Manage", + "label.manage": "Керувати", "label.max": "Max", - "label.member": "Member", - "label.members": "Members", + "label.member": "Учасник", + "label.members": "Учасники", "label.min": "Min", "label.mobile": "Мобільний", "label.more": "Більше", - "label.my-account": "My account", - "label.my-websites": "My websites", + "label.my-account": "Мої аккаунти", + "label.my-websites": "Мої вебсайти", "label.name": "Ім'я", "label.new-password": "Новий пароль", "label.none": "None", "label.number-of-records": "{x} {x, plural, one {record} other {records}}", "label.ok": "OK", "label.os": "OS", - "label.overview": "Overview", + "label.overview": "Огляд", "label.owner": "Власник", - "label.page-of": "Page {current} of {total}", + "label.page-of": "Сторінка {current} з {total}", "label.page-views": "Перегляди сторінок", - "label.pageTitle": "Page title", + "label.pageTitle": "Загловок сторінки", "label.pages": "Сторінки", "label.password": "Пароль", "label.powered-by": "На базі {name}", @@ -129,46 +129,46 @@ "label.referrers": "Джерела", "label.refresh": "Оновити", "label.regenerate": "Regenerate", - "label.region": "Region", - "label.regions": "Regions", - "label.remove": "Remove", - "label.remove-member": "Remove member", - "label.reports": "Reports", + "label.region": "Регіон", + "label.regions": "Регіони", + "label.remove": "Видалити", + "label.remove-member": "Видалити учасника", + "label.reports": "Звіти", "label.required": "Обов'язкове", "label.reset": "Скинути", "label.reset-website": "Скинути статистику сайту", "label.retention": "Retention", "label.retention-description": "Measure your website stickiness by tracking how often users return.", - "label.role": "Role", + "label.role": "Роль", "label.run-query": "Run query", "label.save": "Зберегти", - "label.screens": "Screens", - "label.search": "Search", - "label.select": "Select", + "label.screens": "Екрани", + "label.search": "Пошук", + "label.select": "Вибір", "label.select-date": "Select date", "label.select-role": "Select role", "label.select-website": "Select website", - "label.sessions": "Sessions", + "label.sessions": "Сесії", "label.settings": "Налаштування", "label.share-url": "Поділитися посилання", "label.single-day": "Один день", - "label.steps": "Steps", - "label.sum": "Sum", + "label.steps": "Кроки", + "label.sum": "Сума", "label.tablet": "Планшет", - "label.team": "Team", - "label.team-id": "Team ID", - "label.team-member": "Team member", - "label.team-name": "Team name", - "label.team-owner": "Team owner", - "label.team-view-only": "Team view only", - "label.team-websites": "Team websites", - "label.teams": "Teams", - "label.theme": "Theme", + "label.team": "Команда", + "label.team-id": "ID команди", + "label.team-member": "Учасник команди", + "label.team-name": "Назва команди", + "label.team-owner": "Власник команди", + "label.team-view-only": "Лише для перегляду командою", + "label.team-websites": "Вебсайти команди", + "label.teams": "Команди", + "label.theme": "Теми", "label.this-month": "Цього місяця", "label.this-week": "Цього тижня", "label.this-year": "Цього ріку", "label.timezone": "Часовий пояс", - "label.title": "Title", + "label.title": "Загловок", "label.today": "Сьогодні", "label.toggle-charts": "Переключити графіки", "label.total": "Total", @@ -177,39 +177,39 @@ "label.transfer": "Transfer", "label.transfer-website": "Transfer website", "label.true": "True", - "label.type": "Type", - "label.unique": "Unique", + "label.type": "Типу", + "label.unique": "Унікальний", "label.unique-visitors": "Унікальні відвідувачі", "label.unknown": "Невідомо", - "label.untitled": "Untitled", - "label.update": "Update", + "label.untitled": "Без заголовку", + "label.update": "Оновити", "label.url": "URL", "label.urls": "URLs", - "label.user": "User", + "label.user": "Користувач", "label.username": "Ім'я користувача", - "label.users": "Users", + "label.users": "Користувачі", "label.utm": "UTM", "label.utm-description": "Track your campaigns through UTM parameters.", - "label.value": "Value", - "label.view": "View", + "label.value": "Значення", + "label.view": "Перегляд", "label.view-details": "Переглянути деталі", - "label.view-only": "View only", + "label.view-only": "Лише для перегляду", "label.views": "Перегляди", - "label.views-per-visit": "Views per visit", + "label.views-per-visit": "Перегляди за візит", "label.visitors": "Відвідувачі", - "label.visits": "Visits", - "label.website": "Website", - "label.website-id": "Website ID", + "label.visits": "Відвідування", + "label.website": "Вебсайт", + "label.website-id": "Вебсайт ID", "label.websites": "Сайти", - "label.window": "Window", - "label.yesterday": "Yesterday", - "message.action-confirmation": "Type {confirmation} in the box below to confirm.", + "label.window": "Вікно", + "label.yesterday": "Вчора", + "message.action-confirmation": "Введі {confirmation} у поле нижче для підтвердження.", "message.active-users": "{x} поточних відвідувачів", "message.confirm-delete": "Ви впевнені, що бажаєте видалити {target}?", - "message.confirm-leave": "Are you sure you want to leave {target}?", - "message.confirm-remove": "Are you sure you want to remove {target}?", + "message.confirm-leave": "Ви впевнені, що хочете покинути {target}?", + "message.confirm-remove": "Ви впевнеі, що хочете видалити {target}?", "message.confirm-reset": "Ви впевнені, що бажаєте скинути статистику для {target}?", - "message.delete-team-warning": "Deleting a team will also delete all team websites.", + "message.delete-team-warning": "Видалення команди також видалить усі вебсайти команди.", "message.delete-website-warning": "Усі пов'язані дані будуть видалені також.", "message.error": "Щось пішло не так.", "message.event-log": "{event} on {url}", @@ -221,26 +221,26 @@ "message.no-data-available": "Немає даних.", "message.no-event-data": "No event data is available.", "message.no-match-password": "Паролі не співпадають", - "message.no-results-found": "No results were found.", - "message.no-team-websites": "This team does not have any websites.", - "message.no-teams": "You have not created any teams.", - "message.no-users": "There are no users.", + "message.no-results-found": "Результатів не знайдено.", + "message.no-team-websites": "Ця команди не має жодних вебсайтів.", + "message.no-teams": "Ви не створили жодної команди.", + "message.no-users": "Користувачів не має.", "message.no-websites-configured": "У вас немає налаштованих сайтів.", "message.page-not-found": "Сторінку не знайдено.", "message.reset-website": "To reset this website, type {confirmation} in the box below to confirm.", "message.reset-website-warning": "Вся статистика для цього сайту буде видалена, проте код відслідковування буде продовжувати працювати.", "message.saved": "Збережено успішно.", "message.share-url": "Це публічне посилання для {target}.", - "message.team-already-member": "You are already a member of the team.", - "message.team-not-found": "Team not found.", - "message.team-websites-info": "Websites can be viewed by anyone on the team.", + "message.team-already-member": "Ви уже є учасником цієї команди.", + "message.team-not-found": "Команду не знайдено.", + "message.team-websites-info": "Вебсайти може переглядати кожен учаник команди.", "message.tracking-code": "Код для відслідковування", "message.transfer-team-website-to-user": "Transfer this website to your account?", "message.transfer-user-website-to-team": "Select the team to transfer this website to.", "message.transfer-website": "Transfer website ownership to your account or another team.", "message.triggered-event": "Triggered event", - "message.user-deleted": "User deleted.", - "message.viewed-page": "Viewed page", + "message.user-deleted": "Користувача видалено.", + "message.viewed-page": "Переглянута сторінка", "message.visitor-log": "Відвідувач з {country} використовуючи {browser} на {os} {device}", "message.visitors-dropped-off": "Visitors dropped off" } From 60e7257656e8ed2cf071b386232ffdb96b8b1800 Mon Sep 17 00:00:00 2001 From: Brian Cao Date: Sun, 5 May 2024 22:15:47 -0700 Subject: [PATCH 004/121] Goals report CH --- .../(main)/reports/[reportId]/ReportPage.tsx | 2 + .../(main)/reports/create/ReportTemplates.tsx | 6 + .../reports/goals/GoalsAddForm.module.css | 7 + src/app/(main)/reports/goals/GoalsAddForm.tsx | 95 ++++++++ .../reports/goals/GoalsChart.module.css | 87 +++++++ src/app/(main)/reports/goals/GoalsChart.tsx | 49 ++++ .../reports/goals/GoalsParameters.module.css | 26 ++ .../(main)/reports/goals/GoalsParameters.tsx | 123 ++++++++++ .../reports/goals/GoalsReport.module.css | 10 + src/app/(main)/reports/goals/GoalsReport.tsx | 27 +++ .../(main)/reports/goals/GoalsReportPage.tsx | 6 + src/app/(main)/reports/goals/page.tsx | 10 + src/app/(main)/reports/utm/page.tsx | 2 +- src/components/messages.ts | 7 + src/lib/clickhouse.ts | 5 +- src/lib/constants.ts | 1 + src/pages/api/reports/[reportId].ts | 2 +- src/pages/api/reports/goals.ts | 70 ++++++ src/pages/api/reports/index.ts | 2 +- src/queries/analytics/reports/getGoals.ts | 225 ++++++++++++++++++ 20 files changed, 758 insertions(+), 4 deletions(-) create mode 100644 src/app/(main)/reports/goals/GoalsAddForm.module.css create mode 100644 src/app/(main)/reports/goals/GoalsAddForm.tsx create mode 100644 src/app/(main)/reports/goals/GoalsChart.module.css create mode 100644 src/app/(main)/reports/goals/GoalsChart.tsx create mode 100644 src/app/(main)/reports/goals/GoalsParameters.module.css create mode 100644 src/app/(main)/reports/goals/GoalsParameters.tsx create mode 100644 src/app/(main)/reports/goals/GoalsReport.module.css create mode 100644 src/app/(main)/reports/goals/GoalsReport.tsx create mode 100644 src/app/(main)/reports/goals/GoalsReportPage.tsx create mode 100644 src/app/(main)/reports/goals/page.tsx create mode 100644 src/pages/api/reports/goals.ts create mode 100644 src/queries/analytics/reports/getGoals.ts diff --git a/src/app/(main)/reports/[reportId]/ReportPage.tsx b/src/app/(main)/reports/[reportId]/ReportPage.tsx index 7ecebd31..f28942b7 100644 --- a/src/app/(main)/reports/[reportId]/ReportPage.tsx +++ b/src/app/(main)/reports/[reportId]/ReportPage.tsx @@ -4,6 +4,7 @@ import EventDataReport from '../event-data/EventDataReport'; import InsightsReport from '../insights/InsightsReport'; import RetentionReport from '../retention/RetentionReport'; import UTMReport from '../utm/UTMReport'; +import GoalReport from '../goals/GoalsReport'; import { useReport } from 'components/hooks'; const reports = { @@ -12,6 +13,7 @@ const reports = { insights: InsightsReport, retention: RetentionReport, utm: UTMReport, + goals: GoalReport, }; export default function ReportPage({ reportId }: { reportId: string }) { diff --git a/src/app/(main)/reports/create/ReportTemplates.tsx b/src/app/(main)/reports/create/ReportTemplates.tsx index 1bd84aec..ac29f5c3 100644 --- a/src/app/(main)/reports/create/ReportTemplates.tsx +++ b/src/app/(main)/reports/create/ReportTemplates.tsx @@ -37,6 +37,12 @@ export function ReportTemplates({ showHeader = true }: { showHeader?: boolean }) url: renderTeamUrl('/reports/utm'), icon: , }, + { + title: formatMessage(labels.goals), + description: formatMessage(labels.goalsDescription), + url: renderTeamUrl('/reports/goals'), + icon: , + }, ]; return ( diff --git a/src/app/(main)/reports/goals/GoalsAddForm.module.css b/src/app/(main)/reports/goals/GoalsAddForm.module.css new file mode 100644 index 00000000..a254ff08 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsAddForm.module.css @@ -0,0 +1,7 @@ +.dropdown { + width: 140px; +} + +.input { + width: 200px; +} diff --git a/src/app/(main)/reports/goals/GoalsAddForm.tsx b/src/app/(main)/reports/goals/GoalsAddForm.tsx new file mode 100644 index 00000000..fdfa7aad --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsAddForm.tsx @@ -0,0 +1,95 @@ +import { useMessages } from 'components/hooks'; +import { useState } from 'react'; +import { Button, Dropdown, Flexbox, FormRow, Item, TextField } from 'react-basics'; +import styles from './GoalsAddForm.module.css'; + +export function GoalsAddForm({ + type: defaultType = 'url', + value: defaultValue = '', + goal: defaultGoal = 10, + onChange, +}: { + type?: string; + value?: string; + goal?: number; + onChange?: (step: { type: string; value: string; goal: number }) => void; +}) { + const [type, setType] = useState(defaultType); + const [value, setValue] = useState(defaultValue); + const [goal, setGoal] = useState(defaultGoal); + const { formatMessage, labels } = useMessages(); + const items = [ + { label: formatMessage(labels.url), value: 'url' }, + { label: formatMessage(labels.event), value: 'event' }, + ]; + const isDisabled = !type || !value; + + const handleSave = () => { + onChange({ type, value, goal }); + setValue(''); + setGoal(10); + }; + + const handleChange = (e, set) => { + set(e.target.value); + }; + + const handleKeyDown = e => { + if (e.key === 'Enter') { + e.stopPropagation(); + handleSave(); + } + }; + + const renderTypeValue = (value: any) => { + return items.find(item => item.value === value)?.label; + }; + + return ( + + + + setType(value)} + > + {({ value, label }) => { + return {label}; + }} + + handleChange(e, setValue)} + autoFocus={true} + autoComplete="off" + onKeyDown={handleKeyDown} + /> + + + + + handleChange(e, setGoal)} + autoFocus={true} + autoComplete="off" + onKeyDown={handleKeyDown} + /> + . + + + + + + + ); +} + +export default GoalsAddForm; diff --git a/src/app/(main)/reports/goals/GoalsChart.module.css b/src/app/(main)/reports/goals/GoalsChart.module.css new file mode 100644 index 00000000..c9f158d2 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsChart.module.css @@ -0,0 +1,87 @@ +.chart { + display: grid; +} + +.num { + display: flex; + align-items: center; + justify-content: center; + border-radius: 100%; + width: 50px; + height: 50px; + font-size: 16px; + font-weight: 700; + color: var(--base800); + background: var(--base100); + z-index: 1; +} + +.step { + display: grid; + grid-template-columns: max-content 1fr; + column-gap: 30px; + position: relative; + padding-bottom: 60px; +} + +.card { + display: grid; + gap: 20px; + margin-top: 14px; +} + +.header { + display: flex; + flex-direction: column; + gap: 20px; +} + +.bar { + display: flex; + align-items: center; + justify-content: flex-end; + background: var(--base900); + height: 30px; + border-radius: 5px; + overflow: hidden; + position: relative; +} + +.label { + color: var(--base600); + font-weight: 700; + text-transform: uppercase; +} + +.track { + background-color: var(--base100); + border-radius: 5px; +} + +.item { + font-size: 20px; + color: var(--base900); + font-weight: 700; +} + +.metric { + color: var(--base700); + display: flex; + justify-content: space-between; + gap: 10px; + margin: 10px 0; + text-transform: lowercase; +} + +.visitors { + color: var(--base900); + font-size: 24px; + font-weight: 900; + margin-right: 10px; +} + +.percent { + font-size: 20px; + font-weight: 700; + align-self: flex-end; +} diff --git a/src/app/(main)/reports/goals/GoalsChart.tsx b/src/app/(main)/reports/goals/GoalsChart.tsx new file mode 100644 index 00000000..7cebbe21 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsChart.tsx @@ -0,0 +1,49 @@ +import { useContext } from 'react'; +import classNames from 'classnames'; +import { useMessages } from 'components/hooks'; +import { ReportContext } from '../[reportId]/Report'; +import { formatLongNumber } from 'lib/format'; +import styles from './GoalsChart.module.css'; + +export function GoalsChart({ className }: { className?: string; isLoading?: boolean }) { + const { report } = useContext(ReportContext); + const { formatMessage, labels } = useMessages(); + + const { data } = report || {}; + + return ( +
+ {data?.map(({ type, value, goal, result }, index: number) => { + return ( +
+
{index + 1}
+
+
+ + {formatMessage(type === 'url' ? labels.viewedPage : labels.triggeredEvent)} + + {value} +
+
+
+ {formatLongNumber(result)} + {formatMessage(labels.visitors)} +
+
+ {formatLongNumber(goal)} + {formatMessage(labels.goal)} +
+
{(result / goal).toFixed(2)}%
+
+
+
+
+
+
+ ); + })} +
+ ); +} + +export default GoalsChart; diff --git a/src/app/(main)/reports/goals/GoalsParameters.module.css b/src/app/(main)/reports/goals/GoalsParameters.module.css new file mode 100644 index 00000000..421433f0 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsParameters.module.css @@ -0,0 +1,26 @@ +.item { + display: flex; + align-items: center; + gap: 10px; + width: 100%; +} + +.type { + color: var(--base700); +} + +.value { + display: flex; + align-self: center; + gap: 20px; +} + +.goal { + color: var(--blue900); + background-color: var(--blue100); + font-size: 12px; + font-weight: 900; + padding: 2px 8px; + border-radius: 5px; + white-space: nowrap; +} diff --git a/src/app/(main)/reports/goals/GoalsParameters.tsx b/src/app/(main)/reports/goals/GoalsParameters.tsx new file mode 100644 index 00000000..b4743d2d --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsParameters.tsx @@ -0,0 +1,123 @@ +import { useMessages } from 'components/hooks'; +import Icons from 'components/icons'; +import { formatNumber } from 'lib/format'; +import { useContext } from 'react'; +import { + Button, + Form, + FormButtons, + FormRow, + Icon, + Popup, + PopupTrigger, + SubmitButton, +} from 'react-basics'; +import BaseParameters from '../[reportId]/BaseParameters'; +import ParameterList from '../[reportId]/ParameterList'; +import PopupForm from '../[reportId]/PopupForm'; +import { ReportContext } from '../[reportId]/Report'; +import GoalsAddForm from './GoalsAddForm'; +import styles from './GoalsParameters.module.css'; + +export function GoalsParameters() { + const { report, runReport, updateReport, isRunning } = useContext(ReportContext); + const { formatMessage, labels } = useMessages(); + + const { id, parameters } = report || {}; + const { websiteId, dateRange, goals } = parameters || {}; + const queryDisabled = !websiteId || !dateRange || goals?.length < 1; + + const handleSubmit = (data: any, e: any) => { + e.stopPropagation(); + e.preventDefault(); + + if (!queryDisabled) { + runReport(data); + } + }; + + const handleAddGoals = (goal: { type: string; value: string }) => { + updateReport({ parameters: { goals: parameters.goals.concat(goal) } }); + }; + + const handleUpdateGoals = ( + close: () => void, + index: number, + goal: { type: string; value: string }, + ) => { + const goals = [...parameters.goals]; + goals[index] = goal; + updateReport({ parameters: { goals } }); + close(); + }; + + const handleRemoveGoals = (index: number) => { + const goals = [...parameters.goals]; + delete goals[index]; + updateReport({ parameters: { goals: goals.filter(n => n) } }); + }; + + const AddGoalsButton = () => { + return ( + + + + + + + + + ); + }; + + return ( +
+ + }> + + {goals.map((goal: { type: string; value: string; goal: number }, index: number) => { + return ( + + handleRemoveGoals(index)} + > +
+
+ {goal.type === 'url' ? : } +
+
{goal.value}
+
{formatNumber(goal.goal)}
+
+
+ + {(close: () => void) => ( + + + + )} + +
+ ); + })} +
+
+ + + {formatMessage(labels.runQuery)} + + + + ); +} + +export default GoalsParameters; diff --git a/src/app/(main)/reports/goals/GoalsReport.module.css b/src/app/(main)/reports/goals/GoalsReport.module.css new file mode 100644 index 00000000..aed66b74 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsReport.module.css @@ -0,0 +1,10 @@ +.filters { + display: flex; + flex-direction: column; + justify-content: space-between; + border: 1px solid var(--base400); + border-radius: var(--border-radius); + line-height: 32px; + padding: 10px; + overflow: hidden; +} diff --git a/src/app/(main)/reports/goals/GoalsReport.tsx b/src/app/(main)/reports/goals/GoalsReport.tsx new file mode 100644 index 00000000..d6171c31 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsReport.tsx @@ -0,0 +1,27 @@ +import GoalsChart from './GoalsChart'; +import GoalsParameters from './GoalsParameters'; +import Report from '../[reportId]/Report'; +import ReportHeader from '../[reportId]/ReportHeader'; +import ReportMenu from '../[reportId]/ReportMenu'; +import ReportBody from '../[reportId]/ReportBody'; +import Goals from 'assets/funnel.svg'; +import { REPORT_TYPES } from 'lib/constants'; + +const defaultParameters = { + type: REPORT_TYPES.goals, + parameters: { goals: [] }, +}; + +export default function GoalsReport({ reportId }: { reportId?: string }) { + return ( + + } /> + + + + + + + + ); +} diff --git a/src/app/(main)/reports/goals/GoalsReportPage.tsx b/src/app/(main)/reports/goals/GoalsReportPage.tsx new file mode 100644 index 00000000..cbab8bd0 --- /dev/null +++ b/src/app/(main)/reports/goals/GoalsReportPage.tsx @@ -0,0 +1,6 @@ +'use client'; +import GoalReport from './GoalsReport'; + +export default function GoalReportPage() { + return ; +} diff --git a/src/app/(main)/reports/goals/page.tsx b/src/app/(main)/reports/goals/page.tsx new file mode 100644 index 00000000..112ae47c --- /dev/null +++ b/src/app/(main)/reports/goals/page.tsx @@ -0,0 +1,10 @@ +import GoalsReportPage from './GoalsReportPage'; +import { Metadata } from 'next'; + +export default function () { + return ; +} + +export const metadata: Metadata = { + title: 'Goals Report', +}; diff --git a/src/app/(main)/reports/utm/page.tsx b/src/app/(main)/reports/utm/page.tsx index 12b6cc5b..7fa50660 100644 --- a/src/app/(main)/reports/utm/page.tsx +++ b/src/app/(main)/reports/utm/page.tsx @@ -6,5 +6,5 @@ export default function () { } export const metadata: Metadata = { - title: 'UTM Report', + title: 'Goals Report', }; diff --git a/src/components/messages.ts b/src/components/messages.ts index 7a11aa89..1413549f 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -235,6 +235,13 @@ export const labels = defineMessages({ }, steps: { id: 'label.steps', defaultMessage: 'Steps' }, addStep: { id: 'label.add-step', defaultMessage: 'Add step' }, + goal: { id: 'label.goal', defaultMessage: 'Goal' }, + goals: { id: 'label.goals', defaultMessage: 'Goals' }, + goalsDescription: { + id: 'label.goals-description', + defaultMessage: 'Track your goals for pageviews or events.', + }, + count: { id: 'label.count', defaultMessage: 'Count' }, }); export const messages = defineMessages({ diff --git a/src/lib/clickhouse.ts b/src/lib/clickhouse.ts index c1b9d25f..35634841 100644 --- a/src/lib/clickhouse.ts +++ b/src/lib/clickhouse.ts @@ -119,7 +119,10 @@ async function parseFilters(websiteId: string, filters: QueryFilters = {}, optio }; } -async function rawQuery(query: string, params: Record = {}): Promise { +async function rawQuery( + query: string, + params: Record = {}, +): Promise { if (process.env.LOG_QUERY) { log('QUERY:\n', query); log('PARAMETERS:\n', params); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 0b6f7d26..697a4836 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -111,6 +111,7 @@ export const DATA_TYPES = { export const REPORT_TYPES = { funnel: 'funnel', + goals: 'goals', insights: 'insights', retention: 'retention', utm: 'utm', diff --git a/src/pages/api/reports/[reportId].ts b/src/pages/api/reports/[reportId].ts index db7d0bcc..be2db82f 100644 --- a/src/pages/api/reports/[reportId].ts +++ b/src/pages/api/reports/[reportId].ts @@ -27,7 +27,7 @@ const schema: YupRequest = { websiteId: yup.string().uuid().required(), type: yup .string() - .matches(/funnel|insights|retention|utm/i) + .matches(/funnel|insights|retention|utm|goals/i) .required(), name: yup.string().max(200).required(), description: yup.string().max(500), diff --git a/src/pages/api/reports/goals.ts b/src/pages/api/reports/goals.ts new file mode 100644 index 00000000..bb766775 --- /dev/null +++ b/src/pages/api/reports/goals.ts @@ -0,0 +1,70 @@ +import { canViewWebsite } from 'lib/auth'; +import { useAuth, useCors, useValidate } from 'lib/middleware'; +import { NextApiRequestQueryBody } from 'lib/types'; +import { TimezoneTest } from 'lib/yup'; +import { NextApiResponse } from 'next'; +import { methodNotAllowed, ok, unauthorized } from 'next-basics'; +import { getGoals } from 'queries/analytics/reports/getGoals'; +import * as yup from 'yup'; + +export interface RetentionRequestBody { + websiteId: string; + dateRange: { startDate: string; endDate: string; timezone: string }; + goals: { type: string; value: string; goal: number }[]; +} + +const schema = { + POST: yup.object().shape({ + websiteId: yup.string().uuid().required(), + dateRange: yup + .object() + .shape({ + startDate: yup.date().required(), + endDate: yup.date().required(), + timezone: TimezoneTest, + }) + .required(), + goals: yup + .array() + .of( + yup.object().shape({ + type: yup.string().required(), + value: yup.string().required(), + goal: yup.number().required(), + }), + ) + .min(1) + .required(), + }), +}; + +export default async ( + req: NextApiRequestQueryBody, + res: NextApiResponse, +) => { + await useCors(req, res); + await useAuth(req, res); + await useValidate(schema, req, res); + + if (req.method === 'POST') { + const { + websiteId, + dateRange: { startDate, endDate }, + goals, + } = req.body; + + if (!(await canViewWebsite(req.auth, websiteId))) { + return unauthorized(res); + } + + const data = await getGoals(websiteId, { + startDate: new Date(startDate), + endDate: new Date(endDate), + goals, + }); + + return ok(res, data); + } + + return methodNotAllowed(res); +}; diff --git a/src/pages/api/reports/index.ts b/src/pages/api/reports/index.ts index d231f0b7..186a1821 100644 --- a/src/pages/api/reports/index.ts +++ b/src/pages/api/reports/index.ts @@ -27,7 +27,7 @@ const schema = { name: yup.string().max(200).required(), type: yup .string() - .matches(/funnel|insights|retention|utm/i) + .matches(/funnel|insights|retention|utm|goals/i) .required(), description: yup.string().max(500), parameters: yup diff --git a/src/queries/analytics/reports/getGoals.ts b/src/queries/analytics/reports/getGoals.ts new file mode 100644 index 00000000..f275d604 --- /dev/null +++ b/src/queries/analytics/reports/getGoals.ts @@ -0,0 +1,225 @@ +import clickhouse from 'lib/clickhouse'; +import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db'; +import prisma from 'lib/prisma'; + +export async function getGoals( + ...args: [ + websiteId: string, + criteria: { + startDate: Date; + endDate: Date; + goals: { type: string; value: string; goal: number }[]; + }, + ] +) { + return runQuery({ + [PRISMA]: () => relationalQuery(...args), + [CLICKHOUSE]: () => clickhouseQuery(...args), + }); +} + +async function relationalQuery( + websiteId: string, + criteria: { + startDate: Date; + endDate: Date; + goals: { type: string; value: string; goal: number }[]; + }, +): Promise { + const { startDate, endDate, goals } = criteria; + const { rawQuery } = prisma; + + const hasUrl = goals.some(a => a.type === 'url'); + const hasEvent = goals.some(a => a.type === 'event'); + + function getParameters(goals: { type: string; value: string; goal: number }[]) { + const urls = goals + .filter(a => a.type === 'url') + .reduce((acc, cv, i) => { + acc[`${cv.type}${i}`] = cv.value; + return acc; + }, {}); + + const events = goals + .filter(a => a.type === 'event') + .reduce((acc, cv, i) => { + acc[`${cv.type}${i}`] = cv.value; + return acc; + }, {}); + + return { + urls: { ...urls, startDate, endDate, websiteId }, + events: { ...events, startDate, endDate, websiteId }, + }; + } + + function getColumns(goals: { type: string; value: string; goal: number }[]) { + const urls = goals + .filter(a => a.type === 'url') + .map((a, i) => `COUNT(CASE WHEN url_path = {{url${i}}} THEN 1 END) AS URL${i}`) + .join('\n'); + const events = goals + .filter(a => a.type === 'event') + .map((a, i) => `COUNT(CASE WHEN url_path = {{event${i}}} THEN 1 END) AS EVENT${i}`) + .join('\n'); + + return { urls, events }; + } + + function getWhere(goals: { type: string; value: string; goal: number }[]) { + const urls = goals + .filter(a => a.type === 'url') + .map((a, i) => `{{url${i}}}`) + .join(','); + const events = goals + .filter(a => a.type === 'event') + .map((a, i) => `{{event${i}}}`) + .join(','); + + return { urls: `and url_path in (${urls})`, events: `and event_name in (${events})` }; + } + + const parameters = getParameters(goals); + const columns = getColumns(goals); + const where = getWhere(goals); + + const urls = hasUrl + ? await rawQuery( + ` + select + ${columns.urls} + from website_event + where websiteId = {{websiteId::uuid}} + ${where.urls} + and created_at between {{startDate}} and {{endDate}} + `, + parameters.urls, + ) + : []; + + const events = hasEvent + ? await rawQuery( + ` + select + ${columns.events} + from website_event + where websiteId = {{websiteId::uuid}} + ${where.events} + and created_at between {{startDate}} and {{endDate}} + `, + parameters.events, + ) + : []; + + return [...urls, ...events]; +} + +async function clickhouseQuery( + websiteId: string, + criteria: { + startDate: Date; + endDate: Date; + goals: { type: string; value: string; goal: number }[]; + }, +): Promise<{ type: string; value: string; goal: number; result: number }[]> { + const { startDate, endDate, goals } = criteria; + const { rawQuery } = clickhouse; + + const urls = goals.filter(a => a.type === 'url'); + const events = goals.filter(a => a.type === 'event'); + + const hasUrl = urls.length > 0; + const hasEvent = events.length > 0; + + function getParameters( + urls: { type: string; value: string; goal: number }[], + events: { type: string; value: string; goal: number }[], + ) { + const urlParam = urls.reduce((acc, cv, i) => { + acc[`${cv.type}${i}`] = cv.value; + return acc; + }, {}); + + const eventParam = events.reduce((acc, cv, i) => { + acc[`${cv.type}${i}`] = cv.value; + return acc; + }, {}); + + return { + urls: { ...urlParam, startDate, endDate, websiteId }, + events: { ...eventParam, startDate, endDate, websiteId }, + }; + } + + function getColumns( + urls: { type: string; value: string; goal: number }[], + events: { type: string; value: string; goal: number }[], + ) { + const urlColumns = urls + .map((a, i) => `countIf(url_path = {url${i}:String}) AS URL${i},`) + .join('\n') + .slice(0, -1); + const eventColumns = events + .map((a, i) => `countIf(event_name = {event${i}:String}) AS EVENT${i}`) + .join('\n') + .slice(0, -1); + + return { url: urlColumns, events: eventColumns }; + } + + function getWhere( + urls: { type: string; value: string; goal: number }[], + events: { type: string; value: string; goal: number }[], + ) { + const urlWhere = urls.map((a, i) => `{url${i}:String}`).join(','); + const eventWhere = events.map((a, i) => `{event${i}:String}`).join(','); + + return { urls: `and url_path in (${urlWhere})`, events: `and event_name in (${eventWhere})` }; + } + + const parameters = getParameters(urls, events); + const columns = getColumns(urls, events); + const where = getWhere(urls, events); + + const urlResults = hasUrl + ? await rawQuery( + ` + select + ${columns.url} + from website_event + where website_id = {websiteId:UUID} + ${where.urls} + and created_at between {startDate:DateTime64} and {endDate:DateTime64} + `, + parameters.urls, + ).then(a => { + const results = a[0]; + + return Object.keys(results).map((key, i) => { + return { ...urls[i], result: results[key] }; + }); + }) + : []; + + const eventResults = hasEvent + ? await rawQuery( + ` + select + ${columns.events} + from website_event + where website_id = {websiteId:UUID} + ${where.events} + and created_at between {startDate:DateTime64} and {endDate:DateTime64} + `, + parameters.events, + ).then(a => { + const results = a[0]; + + return Object.keys(results).map((key, i) => { + return { ...events[i], result: results[key] }; + }); + }) + : []; + + return [...urlResults, ...eventResults]; +} From 4d66d400a949976bedde82ad3f531377b3118f46 Mon Sep 17 00:00:00 2001 From: Brian Cao Date: Sun, 5 May 2024 22:28:18 -0700 Subject: [PATCH 005/121] Fix percentages. --- src/app/(main)/reports/goals/GoalsChart.tsx | 7 +++++-- src/queries/analytics/reports/getGoals.ts | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/app/(main)/reports/goals/GoalsChart.tsx b/src/app/(main)/reports/goals/GoalsChart.tsx index 7cebbe21..f20c4f9b 100644 --- a/src/app/(main)/reports/goals/GoalsChart.tsx +++ b/src/app/(main)/reports/goals/GoalsChart.tsx @@ -33,10 +33,13 @@ export function GoalsChart({ className }: { className?: string; isLoading?: bool {formatLongNumber(goal)} {formatMessage(labels.goal)} -
{(result / goal).toFixed(2)}%
+
{((result / goal) * 100).toFixed(2)}%
-
+
goal ? 100 : (result / goal) * 100}%` }} + >
diff --git a/src/queries/analytics/reports/getGoals.ts b/src/queries/analytics/reports/getGoals.ts index f275d604..d26998d0 100644 --- a/src/queries/analytics/reports/getGoals.ts +++ b/src/queries/analytics/reports/getGoals.ts @@ -196,7 +196,7 @@ async function clickhouseQuery( const results = a[0]; return Object.keys(results).map((key, i) => { - return { ...urls[i], result: results[key] }; + return { ...urls[i], goal: Number(urls[i].goal), result: Number(results[key]) }; }); }) : []; @@ -216,7 +216,7 @@ async function clickhouseQuery( const results = a[0]; return Object.keys(results).map((key, i) => { - return { ...events[i], result: results[key] }; + return { ...events[i], goal: Number(events[i].goal), result: Number(results[key]) }; }); }) : []; From 8bdb3337167bd0fa447c17ad3317ded1b85c52bd Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 7 May 2024 17:26:15 -0700 Subject: [PATCH 006/121] Remove offset from query parameters. --- src/components/hooks/useFilterParams.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/hooks/useFilterParams.ts b/src/components/hooks/useFilterParams.ts index 4fc36f39..fd76fd47 100644 --- a/src/components/hooks/useFilterParams.ts +++ b/src/components/hooks/useFilterParams.ts @@ -5,7 +5,7 @@ import { zonedTimeToUtc } from 'date-fns-tz'; export function useFilterParams(websiteId: string) { const [dateRange] = useDateRange(websiteId); - const { startDate, endDate, unit, offset } = dateRange; + const { startDate, endDate, unit } = dateRange; const { timezone } = useTimezone(); const { query: { url, referrer, title, query, os, browser, device, country, region, city, event }, @@ -15,7 +15,6 @@ export function useFilterParams(websiteId: string) { startAt: +zonedTimeToUtc(startDate, timezone), endAt: +zonedTimeToUtc(endDate, timezone), unit, - offset, timezone, url, referrer, From 42b475b0619c35301d178822e6114da8065310c4 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 7 May 2024 17:26:15 -0700 Subject: [PATCH 007/121] Remove offset from query parameters. --- src/components/hooks/useFilterParams.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/hooks/useFilterParams.ts b/src/components/hooks/useFilterParams.ts index 4fc36f39..fd76fd47 100644 --- a/src/components/hooks/useFilterParams.ts +++ b/src/components/hooks/useFilterParams.ts @@ -5,7 +5,7 @@ import { zonedTimeToUtc } from 'date-fns-tz'; export function useFilterParams(websiteId: string) { const [dateRange] = useDateRange(websiteId); - const { startDate, endDate, unit, offset } = dateRange; + const { startDate, endDate, unit } = dateRange; const { timezone } = useTimezone(); const { query: { url, referrer, title, query, os, browser, device, country, region, city, event }, @@ -15,7 +15,6 @@ export function useFilterParams(websiteId: string) { startAt: +zonedTimeToUtc(startDate, timezone), endAt: +zonedTimeToUtc(endDate, timezone), unit, - offset, timezone, url, referrer, From 3c27f08a97554ea1bac0f479dab279d3caf4f532 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 7 May 2024 22:47:39 -0700 Subject: [PATCH 008/121] Render children for data tables. --- package.json | 2 +- .../settings/websites/WebsitesDataTable.tsx | 8 ++-- .../settings/websites/WebsitesTable.tsx | 5 ++- src/components/common/DataTable.module.css | 14 ------- src/components/common/DataTable.tsx | 2 +- src/components/hooks/queries/useRealtime.ts | 2 +- .../hooks/queries/useWebsiteValues.ts | 2 +- yarn.lock | 39 +++++++++++++++---- 8 files changed, 45 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index d5a090df..3d5b74ae 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "@react-spring/web": "^9.7.3", "@tanstack/react-query": "^5.28.6", "@umami/prisma-client": "^0.14.0", - "@umami/redis-client": "^0.20.0", + "@umami/redis-client": "^0.21.0", "chalk": "^4.1.1", "chart.js": "^4.4.2", "chartjs-adapter-date-fns": "^3.0.0", diff --git a/src/app/(main)/settings/websites/WebsitesDataTable.tsx b/src/app/(main)/settings/websites/WebsitesDataTable.tsx index 6ffe6fd0..b3472942 100644 --- a/src/app/(main)/settings/websites/WebsitesDataTable.tsx +++ b/src/app/(main)/settings/websites/WebsitesDataTable.tsx @@ -18,6 +18,10 @@ export function WebsitesDataTable({ }) { const queryResult = useWebsites({ teamId }); + if (!queryResult?.result?.data?.length) { + return children; + } + return ( {({ data }) => ( @@ -27,9 +31,7 @@ export function WebsitesDataTable({ showActions={showActions} allowEdit={allowEdit} allowView={allowView} - > - {children} - + /> )} ); diff --git a/src/app/(main)/settings/websites/WebsitesTable.tsx b/src/app/(main)/settings/websites/WebsitesTable.tsx index 022191cf..dced90be 100644 --- a/src/app/(main)/settings/websites/WebsitesTable.tsx +++ b/src/app/(main)/settings/websites/WebsitesTable.tsx @@ -23,6 +23,10 @@ export function WebsitesTable({ const breakpoint = useBreakpoint(); const { renderTeamUrl } = useTeamUrl(); + if (!data?.length) { + return children; + } + return ( @@ -55,7 +59,6 @@ export function WebsitesTable({ }} )} - {children} ); } diff --git a/src/components/common/DataTable.module.css b/src/components/common/DataTable.module.css index 98d84c75..9a7cffb7 100644 --- a/src/components/common/DataTable.module.css +++ b/src/components/common/DataTable.module.css @@ -1,22 +1,8 @@ -.table { - grid-template-rows: repeat(auto-fit, max-content); -} - -.table td { - align-items: center; - max-height: max-content; -} - .search { max-width: 300px; margin: 20px 0; } -.action { - justify-content: flex-end; - gap: 5px; -} - .body { display: flex; flex-direction: column; diff --git a/src/components/common/DataTable.tsx b/src/components/common/DataTable.tsx index 4bca7fc3..ed910def 100644 --- a/src/components/common/DataTable.tsx +++ b/src/components/common/DataTable.tsx @@ -4,8 +4,8 @@ import { Banner, Loading, SearchField } from 'react-basics'; import { useMessages } from 'components/hooks'; import Empty from 'components/common/Empty'; import Pager from 'components/common/Pager'; -import styles from './DataTable.module.css'; import { FilterQueryResult } from 'lib/types'; +import styles from './DataTable.module.css'; const DEFAULT_SEARCH_DELAY = 600; diff --git a/src/components/hooks/queries/useRealtime.ts b/src/components/hooks/queries/useRealtime.ts index ccf6a62d..92b03bd0 100644 --- a/src/components/hooks/queries/useRealtime.ts +++ b/src/components/hooks/queries/useRealtime.ts @@ -1,6 +1,6 @@ import { useMemo, useRef } from 'react'; import { RealtimeData } from 'lib/types'; -import { useApi } from 'components/hooks'; +import { useApi } from './useApi'; import { REALTIME_INTERVAL, REALTIME_RANGE } from 'lib/constants'; import { startOfMinute, subMinutes } from 'date-fns'; import { percentFilter } from 'lib/filters'; diff --git a/src/components/hooks/queries/useWebsiteValues.ts b/src/components/hooks/queries/useWebsiteValues.ts index 02e26fc3..c5358df2 100644 --- a/src/components/hooks/queries/useWebsiteValues.ts +++ b/src/components/hooks/queries/useWebsiteValues.ts @@ -1,4 +1,4 @@ -import { useApi } from 'components/hooks'; +import { useApi } from './useApi'; export function useWebsiteValues({ websiteId, diff --git a/yarn.lock b/yarn.lock index 95cc310b..5720f25d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2899,10 +2899,10 @@ chalk "^4.1.2" debug "^4.3.4" -"@umami/redis-client@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@umami/redis-client/-/redis-client-0.20.0.tgz#93b4598d68983b1ad266a0a527c56533c6248bf2" - integrity sha512-ACpoO+M/J2eLWEtusjbslhR4le+rPN4h9x7TXjaVJ905icVE0Qgu5y+A7nxXjcYvlgkHk+8HPeVeeaw5P+rxqw== +"@umami/redis-client@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@umami/redis-client/-/redis-client-0.21.0.tgz#96426b28860b8b06fae8825fc2f2d9575b64e863" + integrity sha512-PpdJunvT4sAsVWIeEl+cHU6iSV2r/Df9dof2gdUwSigfD88ACsVs1/BvlWERxk/T93rTgVJWSpLvdw/oMYvkcw== dependencies: debug "^4.3.4" redis "^4.5.1" @@ -9532,7 +9532,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9605,7 +9614,14 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10366,7 +10382,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10384,6 +10400,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 90bd72cf984761c545e60a99e68452b3039d543f Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 7 May 2024 23:09:19 -0700 Subject: [PATCH 009/121] Updated data table render check. --- src/app/(main)/reports/ReportsDataTable.tsx | 7 +++++++ src/app/(main)/settings/teams/TeamsDataTable.tsx | 7 +++++++ src/app/(main)/settings/users/UsersDataTable.tsx | 13 ++++++++++++- .../(main)/settings/websites/WebsitesDataTable.tsx | 2 +- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/app/(main)/reports/ReportsDataTable.tsx b/src/app/(main)/reports/ReportsDataTable.tsx index cf5953e8..7c99fb25 100644 --- a/src/app/(main)/reports/ReportsDataTable.tsx +++ b/src/app/(main)/reports/ReportsDataTable.tsx @@ -1,16 +1,23 @@ import { useReports } from 'components/hooks'; import ReportsTable from './ReportsTable'; import DataTable from 'components/common/DataTable'; +import { ReactNode } from 'react'; export default function ReportsDataTable({ websiteId, teamId, + children, }: { websiteId?: string; teamId?: string; + children?: ReactNode; }) { const queryResult = useReports({ websiteId, teamId }); + if (queryResult?.result?.data?.length === 0) { + return children; + } + return ( {({ data }) => } diff --git a/src/app/(main)/settings/teams/TeamsDataTable.tsx b/src/app/(main)/settings/teams/TeamsDataTable.tsx index fe92b6a0..6baeba33 100644 --- a/src/app/(main)/settings/teams/TeamsDataTable.tsx +++ b/src/app/(main)/settings/teams/TeamsDataTable.tsx @@ -1,17 +1,24 @@ import DataTable from 'components/common/DataTable'; import TeamsTable from 'app/(main)/settings/teams/TeamsTable'; import { useLogin, useTeams } from 'components/hooks'; +import { ReactNode } from 'react'; export function TeamsDataTable({ allowEdit, showActions, + children, }: { allowEdit?: boolean; showActions?: boolean; + children?: ReactNode; }) { const { user } = useLogin(); const queryResult = useTeams(user.id); + if (queryResult?.result?.data?.length === 0) { + return children; + } + return ( {({ data }) => { diff --git a/src/app/(main)/settings/users/UsersDataTable.tsx b/src/app/(main)/settings/users/UsersDataTable.tsx index cfff4e71..681b4dc2 100644 --- a/src/app/(main)/settings/users/UsersDataTable.tsx +++ b/src/app/(main)/settings/users/UsersDataTable.tsx @@ -1,10 +1,21 @@ import DataTable from 'components/common/DataTable'; import { useUsers } from 'components/hooks'; import UsersTable from './UsersTable'; +import { ReactNode } from 'react'; -export function UsersDataTable({ showActions }: { showActions?: boolean }) { +export function UsersDataTable({ + showActions, + children, +}: { + showActions?: boolean; + children?: ReactNode; +}) { const queryResult = useUsers(); + if (queryResult?.result?.data?.length === 0) { + return children; + } + return ( {({ data }) => } diff --git a/src/app/(main)/settings/websites/WebsitesDataTable.tsx b/src/app/(main)/settings/websites/WebsitesDataTable.tsx index b3472942..1780dfb4 100644 --- a/src/app/(main)/settings/websites/WebsitesDataTable.tsx +++ b/src/app/(main)/settings/websites/WebsitesDataTable.tsx @@ -18,7 +18,7 @@ export function WebsitesDataTable({ }) { const queryResult = useWebsites({ teamId }); - if (!queryResult?.result?.data?.length) { + if (queryResult?.result?.data?.length === 0) { return children; } From f259130202f18c9260b7e2e6a46514d15b2ec76a Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Thu, 9 May 2024 11:55:54 -0700 Subject: [PATCH 010/121] add redis calls to website delete/reset --- src/queries/admin/website.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/queries/admin/website.ts b/src/queries/admin/website.ts index 1f513bd4..d191aa65 100644 --- a/src/queries/admin/website.ts +++ b/src/queries/admin/website.ts @@ -1,4 +1,5 @@ import { Prisma, Website } from '@prisma/client'; +import redis from '@umami/redis-client'; import prisma from 'lib/prisma'; import { PageResult, PageParams } from 'lib/types'; import WebsiteFindManyArgs = Prisma.WebsiteFindManyArgs; @@ -122,6 +123,7 @@ export async function resetWebsite( websiteId: string, ): Promise<[Prisma.BatchPayload, Prisma.BatchPayload, Website]> { const { client, transaction } = prisma; + const cloudMode = !!process.env.cloudMode; return transaction([ client.eventData.deleteMany({ @@ -139,14 +141,20 @@ export async function resetWebsite( resetAt: new Date(), }, }), - ]); + ]).then(async data => { + if (cloudMode) { + await redis.client.set(`website:${websiteId}`, data[3]); + } + + return data; + }); } export async function deleteWebsite( websiteId: string, ): Promise<[Prisma.BatchPayload, Prisma.BatchPayload, Website]> { const { client, transaction } = prisma; - const cloudMode = process.env.CLOUD_MODE; + const cloudMode = !!process.env.CLOUD_MODE; return transaction([ client.eventData.deleteMany({ @@ -173,5 +181,11 @@ export async function deleteWebsite( : client.website.delete({ where: { id: websiteId }, }), - ]); + ]).then(async data => { + if (cloudMode) { + await redis.client.del(`website:${websiteId}`); + } + + return data; + }); } From 4731c1cca32e6e64ecccab6139f4e39ab117f330 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Thu, 9 May 2024 11:55:54 -0700 Subject: [PATCH 011/121] add redis calls to website delete/reset --- src/queries/admin/website.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/queries/admin/website.ts b/src/queries/admin/website.ts index 1f513bd4..d191aa65 100644 --- a/src/queries/admin/website.ts +++ b/src/queries/admin/website.ts @@ -1,4 +1,5 @@ import { Prisma, Website } from '@prisma/client'; +import redis from '@umami/redis-client'; import prisma from 'lib/prisma'; import { PageResult, PageParams } from 'lib/types'; import WebsiteFindManyArgs = Prisma.WebsiteFindManyArgs; @@ -122,6 +123,7 @@ export async function resetWebsite( websiteId: string, ): Promise<[Prisma.BatchPayload, Prisma.BatchPayload, Website]> { const { client, transaction } = prisma; + const cloudMode = !!process.env.cloudMode; return transaction([ client.eventData.deleteMany({ @@ -139,14 +141,20 @@ export async function resetWebsite( resetAt: new Date(), }, }), - ]); + ]).then(async data => { + if (cloudMode) { + await redis.client.set(`website:${websiteId}`, data[3]); + } + + return data; + }); } export async function deleteWebsite( websiteId: string, ): Promise<[Prisma.BatchPayload, Prisma.BatchPayload, Website]> { const { client, transaction } = prisma; - const cloudMode = process.env.CLOUD_MODE; + const cloudMode = !!process.env.CLOUD_MODE; return transaction([ client.eventData.deleteMany({ @@ -173,5 +181,11 @@ export async function deleteWebsite( : client.website.delete({ where: { id: websiteId }, }), - ]); + ]).then(async data => { + if (cloudMode) { + await redis.client.del(`website:${websiteId}`); + } + + return data; + }); } From a92eb841b8e54c46965f411089031e68df61526e Mon Sep 17 00:00:00 2001 From: Eddu Date: Thu, 9 May 2024 20:02:51 -0300 Subject: [PATCH 012/121] consistent spelling in Brazilian Portuguese --- src/lang/pt-BR.json | 330 ++++++++++++++++++++++---------------------- 1 file changed, 165 insertions(+), 165 deletions(-) diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index 06154944..7fcfa087 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -1,88 +1,88 @@ { "label.access-code": "Código de acesso", "label.actions": "Ações", - "label.activity-log": "Log de atividade", - "label.add": "Add", - "label.add-description": "Add description", - "label.add-member": "Add member", - "label.add-step": "Add step", + "label.activity-log": "Registro de atividades", + "label.add": "Adicionar", + "label.add-description": "Adicionar descrição", + "label.add-member": "Adicionar membro", + "label.add-step": "Adicionar etapa", "label.add-website": "Adicionar site", "label.admin": "Administrador", "label.after": "Depois", "label.all": "Todos", "label.all-time": "Todo o período", - "label.analytics": "Estatísticas", - "label.average": "Average", - "label.average-visit-time": "Tempo médio da visita", + "label.analytics": "Análise de dados", + "label.average": "Média", + "label.average-visit-time": "Tempo médio de visita", "label.back": "Voltar", "label.before": "Antes", "label.bounce-rate": "Taxa de rejeição", - "label.breakdown": "Breakdown", - "label.browser": "Browser", + "label.breakdown": "Detalhamento", + "label.browser": "Navegador", "label.browsers": "Navegadores", "label.cancel": "Cancelar", - "label.change-password": "Alterar a senha", + "label.change-password": "Alterar senha", "label.cities": "Cidades", - "label.city": "City", + "label.city": "Cidade", "label.clear-all": "Limpar tudo", "label.confirm": "Confirmar", - "label.confirm-password": "Confirme a nova senha", - "label.contains": "Contains", + "label.confirm-password": "Confirmar nova senha", + "label.contains": "Contém", "label.continue": "Continuar", "label.countries": "Países", - "label.country": "Country", - "label.create": "Create", + "label.country": "País", + "label.create": "Criar", "label.create-report": "Criar relatório", "label.create-team": "Criar time", "label.create-user": "Criar usuário", - "label.created": "Criado", - "label.created-by": "Created By", + "label.created": "Criado(a)", + "label.created-by": "Criado(a) por", "label.current-password": "Senha atual", "label.custom-range": "Intervalo personalizado", - "label.dashboard": "Painel", - "label.data": "Data", - "label.date": "Date", + "label.dashboard": "Painel de controle", + "label.data": "Dados", + "label.date": "Data", "label.date-range": "Intervalo de datas", - "label.day": "Day", - "label.default-date-range": "Intervalo de datas predefinido", - "label.delete": "Remover", - "label.delete-report": "Delete report", - "label.delete-team": "Remover time", - "label.delete-user": "Remover usuário", - "label.delete-website": "Remover site", + "label.day": "Dia", + "label.default-date-range": "Intervalo de datas padrão", + "label.delete": "Excluir", + "label.delete-report": "Excluir relatório", + "label.delete-team": "Excluir time", + "label.delete-user": "Excluir usuário", + "label.delete-website": "Excluir site", "label.description": "Descrição", "label.desktop": "Computador", "label.details": "Detalhes", - "label.device": "Device", + "label.device": "Dispositivo", "label.devices": "Dispositivos", "label.dismiss": "Dispensar", - "label.does-not-contain": "Does not contain", + "label.does-not-contain": "Não contém", "label.domain": "Domínio", - "label.dropoff": "Dropoff", + "label.dropoff": "Abandono", "label.edit": "Editar", "label.edit-dashboard": "Editar painel", - "label.edit-member": "Edit member", - "label.enable-share-url": "Ativar link de compartilhamento", + "label.edit-member": "Editar membro", + "label.enable-share-url": "Habilitar link de compartilhamento", "label.event": "Evento", - "label.event-data": "Event data", + "label.event-data": "Dados de evento", "label.events": "Eventos", - "label.false": "False", + "label.false": "Falso", "label.field": "Campo", "label.fields": "Campos", - "label.filter": "Filter", - "label.filter-combined": "Combinado", - "label.filter-raw": "Dados brutos", - "label.filters": "Filters", + "label.filter": "Filtro", + "label.filter-combined": "Filtro combinado", + "label.filter-raw": "Filtro de dados brutos", + "label.filters": "Filtros", "label.funnel": "Funil", - "label.funnel-description": "Understand the conversion and drop-off rate of users.", + "label.funnel-description": "Entenda a conversão e taxa de abandono dos usuários.", "label.greater-than": "Maior que", - "label.greater-than-equals": "Maior que ou igual", - "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.greater-than-equals": "Maior ou igual a", + "label.insights": "Informações", + "label.insights-description": "Explore seus dados em mais profundidade usando segmentos e filtros.", + "label.is": "É", + "label.is-not": "Não é", + "label.is-not-set": "Não está definido", + "label.is-set": "Está definido", "label.join": "Entrar", "label.join-team": "Entrar no time", "label.language": "Idioma", @@ -90,157 +90,157 @@ "label.laptop": "Notebook", "label.last-days": "Últimos {x} dias", "label.last-hours": "Últimas {x} horas", - "label.last-months": "Last {x} months", + "label.last-months": "Últimos {x} meses", "label.leave": "Sair", "label.leave-team": "Sair do time", "label.less-than": "Menor que", - "label.less-than-equals": "Menor que ou igual", - "label.login": "Iniciar sessão", + "label.less-than-equals": "Menor ou igual a", + "label.login": "Entrar", "label.logout": "Sair", - "label.manage": "Manage", - "label.max": "Max", - "label.member": "Member", + "label.manage": "Gerenciar", + "label.max": "Máximo", + "label.member": "Membro", "label.members": "Membros", - "label.min": "Min", + "label.min": "Mínimo", "label.mobile": "Celular", "label.more": "Mais", - "label.my-account": "My account", - "label.my-websites": "My websites", + "label.my-account": "Minha conta", + "label.my-websites": "Meus sites", "label.name": "Nome", "label.new-password": "Nova senha", "label.none": "Nenhum", - "label.number-of-records": "{x} {x, plural, one {record} other {records}}", + "label.number-of-records": "{x} {x, plural, one {registro} other {registros}}", "label.ok": "OK", - "label.os": "OS", - "label.overview": "Overview", + "label.os": "Sistema Operacional", + "label.overview": "Visão geral", "label.owner": "Proprietário", - "label.page-of": "Page {current} of {total}", + "label.page-of": "Página {current} de {total}", "label.page-views": "Visualizações de página", - "label.pageTitle": "Page title", + "label.pageTitle": "Título da página", "label.pages": "Páginas", "label.password": "Senha", - "label.powered-by": "Distribuído por {name}", + "label.powered-by": "Desenvolvido por {name}", "label.profile": "Perfil", - "label.queries": "Parâmetros", - "label.query": "Query", - "label.query-parameters": "Parâmetros de Consulta", + "label.queries": "Buscas", + "label.query": "Busca", + "label.query-parameters": "Parâmetros da busca", "label.realtime": "Tempo real", - "label.referrer": "Referrer", + "label.referrer": "Referência", "label.referrers": "Referências", "label.refresh": "Atualizar", - "label.regenerate": "Regerar", - "label.region": "Region", + "label.regenerate": "Gerar novamente", + "label.region": "Região", "label.regions": "Regiões", "label.remove": "Remover", - "label.remove-member": "Remove member", - "label.reports": "Reports", + "label.remove-member": "Remover membro", + "label.reports": "Relatórios", "label.required": "Obrigatório", "label.reset": "Redefinir", "label.reset-website": "Redefinir estatísticas", - "label.retention": "Retention", - "label.retention-description": "Measure your website stickiness by tracking how often users return.", - "label.role": "Papel", - "label.run-query": "Executar query", + "label.retention": "Retenção", + "label.retention-description": "Analise a retenção de usuários do seu site acompanhando a frequência com que eles retornam.", + "label.role": "Função", + "label.run-query": "Executar busca", "label.save": "Salvar", "label.screens": "Telas", - "label.search": "Search", - "label.select": "Select", + "label.search": "Pesquisar", + "label.select": "Selecionar", "label.select-date": "Selecionar data", - "label.select-role": "Select role", + "label.select-role": "Selecionar função", "label.select-website": "Selecionar site", "label.sessions": "Sessões", "label.settings": "Configurações", "label.share-url": "Link de compartilhamento", "label.single-day": "Dia específico", - "label.steps": "Steps", - "label.sum": "Sum", + "label.steps": "Etapas", + "label.sum": "Soma", "label.tablet": "Tablet", "label.team": "Time", "label.team-id": "ID do Time", - "label.team-member": "Membro", - "label.team-name": "Team name", - "label.team-owner": "Proprietário", - "label.team-view-only": "Team view only", - "label.team-websites": "Team websites", - "label.teams": "Times", - "label.theme": "Tema", - "label.this-month": "Este mês", - "label.this-week": "Esta semana", - "label.this-year": "Este ano", - "label.timezone": "Fuso horário", - "label.title": "Título", - "label.today": "Hoje", - "label.toggle-charts": "Mostrar/Esconder gráficos", - "label.total": "Total", - "label.total-records": "Total records", - "label.tracking-code": "Código de rastreamento", - "label.transfer": "Transfer", - "label.transfer-website": "Transfer website", - "label.true": "True", - "label.type": "Tipo", - "label.unique": "Único", - "label.unique-visitors": "Visitantes únicos", - "label.unknown": "Desconhecido", - "label.untitled": "Sem título", - "label.update": "Update", - "label.url": "URL", - "label.urls": "URLs", - "label.user": "Usuário", - "label.username": "Nome de usuário", - "label.users": "Usuários", - "label.utm": "UTM", - "label.utm-description": "Track your campaigns through UTM parameters.", - "label.value": "Valor", - "label.view": "Ver", - "label.view-details": "Ver detalhes", - "label.view-only": "Somente visualização", - "label.views": "Visualizações", - "label.views-per-visit": "Views per visit", - "label.visitors": "Visitantes", - "label.visits": "Visits", - "label.website": "Website", - "label.website-id": "ID do Site", - "label.websites": "Sites", - "label.window": "Janela", - "label.yesterday": "Ontem", - "message.action-confirmation": "Type {confirmation} in the box below to confirm.", - "message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento", - "message.confirm-delete": "Deseja realmente remover {target}?", - "message.confirm-leave": "Você tem certeza que deseja sair de {target}?", - "message.confirm-remove": "Are you sure you want to remove {target}?", - "message.confirm-reset": "Você tem certeza que deseja redefinir as estatísticas de {target}?", - "message.delete-team-warning": "Deleting a team will also delete all team websites.", - "message.delete-website-warning": "Todos os dados associados também serão eliminados.", - "message.error": "Ocorreu um erro.", - "message.event-log": "{event} em {url}", - "message.go-to-settings": "Ir para as configurações", - "message.incorrect-username-password": "O nome de usuário e/ou senha está incorreto.", - "message.invalid-domain": "Domínio inválido", - "message.min-password-length": "Quantidade mínima de {n} caracteres", - "message.new-version-available": "Uma nova versão do Umami {version} está disponível!", - "message.no-data-available": "Sem dados disponíveis.", - "message.no-event-data": "Nenhum dado de evento está disponível.", - "message.no-match-password": "As senhas não correspondem", - "message.no-results-found": "Nenhum resultado foi encontrado.", - "message.no-team-websites": "Este time não possui nenhum site.", - "message.no-teams": "Você não criou nenhum time.", - "message.no-users": "Não há nenhum usuário.", - "message.no-websites-configured": "Nenhum site foi configurado ainda.", - "message.page-not-found": "Página não encontrada.", - "message.reset-website": "Para redefinir este site, digite {confirmation} na caixa abaixo para confirmar.", - "message.reset-website-warning": "Todas as estatísticas deste site serão removidas, mas seu código de rastreamento permanecerá intacto.", - "message.saved": "Salvo com sucesso.", - "message.share-url": "Este é o link público de compartilhamento para {target}.", - "message.team-already-member": "Você já um membro do time.", - "message.team-not-found": "Time não encontrado.", - "message.team-websites-info": "Os sites podem ser visualizados por qualquer membro da equipe.", - "message.tracking-code": "Código de rastreamento", - "message.transfer-team-website-to-user": "Transfer this website to your account?", - "message.transfer-user-website-to-team": "Select the team to transfer this website to.", - "message.transfer-website": "Transfer website ownership to your account or another team.", - "message.triggered-event": "Triggered event", - "message.user-deleted": "Usuário removido.", - "message.viewed-page": "Viewed page", - "message.visitor-log": "Visitante de {country} usando {browser} no {device} {os}", - "message.visitors-dropped-off": "Visitors dropped off" +"label.team-member": "Membro do time", +"label.team-name": "Nome do time", +"label.team-owner": "Proprietário do time", +"label.team-view-only": "Visualização apenas de time", +"label.team-websites": "Sites do time", +"label.teams": "Times", +"label.theme": "Tema", +"label.this-month": "Este mês", +"label.this-week": "Esta semana", +"label.this-year": "Este ano", +"label.timezone": "Fuso horário", +"label.title": "Título", +"label.today": "Hoje", +"label.toggle-charts": "Mostrar/Esconder gráficos", +"label.total": "Total", +"label.total-records": "Total de registros", +"label.tracking-code": "Código de rastreamento", +"label.transfer": "Transferir", +"label.transfer-website": "Transferir site", +"label.true": "Verdadeiro", +"label.type": "Tipo", +"label.unique": "Único", +"label.unique-visitors": "Visitantes únicos", +"label.unknown": "Desconhecido", +"label.untitled": "Sem título", +"label.update": "Atualizar", +"label.url": "URL", +"label.urls": "URLs", +"label.user": "Usuário", +"label.username": "Nome de usuário", +"label.users": "Usuários", +"label.utm": "UTM", +"label.utm-description": "Rastreie suas campanhas por meio de parâmetros UTM.", +"label.value": "Valor", +"label.view": "Visualizar", +"label.view-details": "Ver detalhes", +"label.view-only": "Somente visualização", +"label.views": "Visualizações", +"label.views-per-visit": "Visualizações por visita", +"label.visitors": "Visitantes", +"label.visits": "Visitas", +"label.website": "Site", +"label.website-id": "ID do site", +"label.websites": "Sites", +"label.window": "Janela", +"label.yesterday": "Ontem", +"message.action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.", +"message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento", +"message.confirm-delete": "Deseja realmente remover {target}?", +"message.confirm-leave": "Você tem certeza que deseja sair de {target}?", +"message.confirm-remove": "Tem certeza que deseja remover {target}?", +"message.confirm-reset": "Tem certeza que deseja redefinir as estatísticas de {target}?", +"message.delete-team-warning": "Excluir um time também excluirá todos os sites do time.", +"message.delete-website-warning": "Todos os dados associados também serão excluídos.", +"message.error": "Ocorreu um erro.", +"message.event-log": "{event} em {url}", +"message.go-to-settings": "Ir para as configurações", +"message.incorrect-username-password": "Nome de usuário e/ou senha incorretos.", +"message.invalid-domain": "Domínio inválido", +"message.min-password-length": "Quantidade mínima de {n} caracteres", +"message.new-version-available": "Uma nova versão do Umami {version} está disponível!", +"message.no-data-available": "Sem dados disponíveis.", +"message.no-event-data": "Nenhum dado de evento disponível.", +"message.no-match-password": "As senhas não coincidem", +"message.no-results-found": "Nenhum resultado foi encontrado.", +"message.no-team-websites": "Este time não possui nenhum site.", +"message.no-teams": "Você não criou nenhum time.", +"message.no-users": "Não há usuários.", +"message.no-websites-configured": "Nenhum site foi configurado ainda.", +"message.page-not-found": "Página não encontrada.", +"message.reset-website": "Para redefinir este site, digite {confirmation} na caixa abaixo para confirmar.", +"message.reset-website-warning": "Todas as estatísticas deste site serão removidas, mas seu código de rastreamento permanecerá intacto.", +"message.saved": "Salvo com sucesso.", +"message.share-url": "Este é o link público de compartilhamento para {target}.", +"message.team-already-member": "Você já é um membro do time.", +"message.team-not-found": "Time não encontrado.", +"message.team-websites-info": "Os sites podem ser visualizados por qualquer membro da equipe.", +"message.tracking-code": "Código de rastreamento", +"message.transfer-team-website-to-user": "Transferir este site para a sua conta?", +"message.transfer-user-website-to-team": "Selecione o time para o qual deseja transferir este site.", +"message.transfer-website": "Transferir a propriedade do site para a sua conta ou para outro time.", +"message.triggered-event": "Evento disparado", +"message.user-deleted": "Usuário removido.", +"message.viewed-page": "Página visualizada", +"message.visitor-log": "Visitante de {country} usando {browser} no {device} {os}", +"message.visitors-dropped-off": "Visitantes que abandonaram" } From cfe791ec8c0dfec5c5b5d425bd16b10e40e58338 Mon Sep 17 00:00:00 2001 From: Eddu Date: Thu, 9 May 2024 20:16:15 -0300 Subject: [PATCH 013/121] =?UTF-8?q?pt-BR=20todas=20as=20apari=C3=A7=C3=B5e?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lang/pt-BR.json | 311 ++++++++++++++++++++++---------------------- 1 file changed, 156 insertions(+), 155 deletions(-) diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index 7fcfa087..8e3c9bfd 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -1,6 +1,6 @@ { "label.access-code": "Código de acesso", - "label.actions": "Ações", + "label.actions": "Ações do usuário", "label.activity-log": "Registro de atividades", "label.add": "Adicionar", "label.add-description": "Adicionar descrição", @@ -10,8 +10,8 @@ "label.admin": "Administrador", "label.after": "Depois", "label.all": "Todos", - "label.all-time": "Todo o período", - "label.analytics": "Análise de dados", + "label.all-time": "Todos os períodos", + "label.analytics": "Análise", "label.average": "Média", "label.average-visit-time": "Tempo médio de visita", "label.back": "Voltar", @@ -26,221 +26,222 @@ "label.city": "Cidade", "label.clear-all": "Limpar tudo", "label.confirm": "Confirmar", - "label.confirm-password": "Confirmar nova senha", + "label.confirm-password": "Confirmar senha", "label.contains": "Contém", "label.continue": "Continuar", "label.countries": "Países", "label.country": "País", "label.create": "Criar", "label.create-report": "Criar relatório", - "label.create-team": "Criar time", + "label.create-team": "Criar equipe", "label.create-user": "Criar usuário", - "label.created": "Criado(a)", - "label.created-by": "Criado(a) por", + "label.created": "Criado", + "label.created-by": "Criado por", "label.current-password": "Senha atual", - "label.custom-range": "Intervalo personalizado", - "label.dashboard": "Painel de controle", + "label.custom-range": "Período personalizado", + "label.dashboard": "Painel", "label.data": "Dados", "label.date": "Data", - "label.date-range": "Intervalo de datas", + "label.date-range": "Período", "label.day": "Dia", - "label.default-date-range": "Intervalo de datas padrão", + "label.default-date-range": "Período padrão", "label.delete": "Excluir", "label.delete-report": "Excluir relatório", - "label.delete-team": "Excluir time", + "label.delete-team": "Excluir equipe", "label.delete-user": "Excluir usuário", "label.delete-website": "Excluir site", "label.description": "Descrição", - "label.desktop": "Computador", + "label.desktop": "Desktop", "label.details": "Detalhes", "label.device": "Dispositivo", "label.devices": "Dispositivos", - "label.dismiss": "Dispensar", + "label.dismiss": "Fechar", "label.does-not-contain": "Não contém", "label.domain": "Domínio", "label.dropoff": "Abandono", "label.edit": "Editar", "label.edit-dashboard": "Editar painel", "label.edit-member": "Editar membro", - "label.enable-share-url": "Habilitar link de compartilhamento", + "label.enable-share-url": "Ativar link para compartilhar", "label.event": "Evento", - "label.event-data": "Dados de evento", - "label.events": "Eventos", - "label.false": "Falso", + "label.event-data": "Dados do evento", + "label.events": "Tipos de eventos", + "label.false": "Não", "label.field": "Campo", "label.fields": "Campos", "label.filter": "Filtro", - "label.filter-combined": "Filtro combinado", - "label.filter-raw": "Filtro de dados brutos", + "label.filter-combined": "Combinado", + "label.filter-raw": "Bruto", "label.filters": "Filtros", "label.funnel": "Funil", - "label.funnel-description": "Entenda a conversão e taxa de abandono dos usuários.", + "label.funnel-description": "Entenda a taxa de conversão e abandono dos seus usuários.", "label.greater-than": "Maior que", "label.greater-than-equals": "Maior ou igual a", - "label.insights": "Informações", - "label.insights-description": "Explore seus dados em mais profundidade usando segmentos e filtros.", - "label.is": "É", - "label.is-not": "Não é", - "label.is-not-set": "Não está definido", - "label.is-set": "Está definido", - "label.join": "Entrar", - "label.join-team": "Entrar no time", - "label.language": "Idioma", - "label.languages": "Idiomas", - "label.laptop": "Notebook", - "label.last-days": "Últimos {x} dias", - "label.last-hours": "Últimas {x} horas", - "label.last-months": "Últimos {x} meses", - "label.leave": "Sair", - "label.leave-team": "Sair do time", - "label.less-than": "Menor que", - "label.less-than-equals": "Menor ou igual a", - "label.login": "Entrar", - "label.logout": "Sair", - "label.manage": "Gerenciar", - "label.max": "Máximo", - "label.member": "Membro", - "label.members": "Membros", - "label.min": "Mínimo", - "label.mobile": "Celular", - "label.more": "Mais", - "label.my-account": "Minha conta", - "label.my-websites": "Meus sites", - "label.name": "Nome", - "label.new-password": "Nova senha", - "label.none": "Nenhum", - "label.number-of-records": "{x} {x, plural, one {registro} other {registros}}", - "label.ok": "OK", - "label.os": "Sistema Operacional", - "label.overview": "Visão geral", - "label.owner": "Proprietário", - "label.page-of": "Página {current} de {total}", - "label.page-views": "Visualizações de página", - "label.pageTitle": "Título da página", - "label.pages": "Páginas", - "label.password": "Senha", - "label.powered-by": "Desenvolvido por {name}", - "label.profile": "Perfil", - "label.queries": "Buscas", - "label.query": "Busca", - "label.query-parameters": "Parâmetros da busca", - "label.realtime": "Tempo real", - "label.referrer": "Referência", - "label.referrers": "Referências", - "label.refresh": "Atualizar", - "label.regenerate": "Gerar novamente", - "label.region": "Região", - "label.regions": "Regiões", - "label.remove": "Remover", - "label.remove-member": "Remover membro", - "label.reports": "Relatórios", - "label.required": "Obrigatório", - "label.reset": "Redefinir", - "label.reset-website": "Redefinir estatísticas", - "label.retention": "Retenção", - "label.retention-description": "Analise a retenção de usuários do seu site acompanhando a frequência com que eles retornam.", - "label.role": "Função", - "label.run-query": "Executar busca", - "label.save": "Salvar", - "label.screens": "Telas", - "label.search": "Pesquisar", - "label.select": "Selecionar", - "label.select-date": "Selecionar data", - "label.select-role": "Selecionar função", - "label.select-website": "Selecionar site", - "label.sessions": "Sessões", - "label.settings": "Configurações", - "label.share-url": "Link de compartilhamento", - "label.single-day": "Dia específico", - "label.steps": "Etapas", - "label.sum": "Soma", - "label.tablet": "Tablet", - "label.team": "Time", - "label.team-id": "ID do Time", -"label.team-member": "Membro do time", -"label.team-name": "Nome do time", -"label.team-owner": "Proprietário do time", -"label.team-view-only": "Visualização apenas de time", -"label.team-websites": "Sites do time", -"label.teams": "Times", + "label.insights": "Insights", + "label.insights-description": "Explore seus dados em mais detalhes usando filtros", + "label.insights-description": "Explore seus dados em mais detalhes usando filtros e segmentação por períodos.", +"label.is": "É igual a", +"label.is-not": "Não é igual a", +"label.is-not-set": "Não definido", +"label.is-set": "Definido", +"label.join": "Participar", +"label.join-team": "Participar da equipe", +"label.language": "Idioma", +"label.languages": "Idiomas", +"label.laptop": "Notebook", +"label.last-days": "Últimos {x} dias", +"label.last-hours": "Últimas {x} horas", +"label.last-months": "Últimos {x} meses", +"label.leave": "Sair", +"label.leave-team": "Sair da equipe", +"label.less-than": "Menor que", +"label.less-than-equals": "Menor ou igual a", +"label.login": "Entrar", +"label.logout": "Sair", +"label.manage": "Gerenciar", +"label.max": "Máximo", +"label.member": "Membro", +"label.members": "Membros", +"label.min": "Mínimo", +"label.mobile": "Celular", +"label.more": "Mais", +"label.my-account": "Minha conta", +"label.my-websites": "Meus sites", +"label.name": "Nome", +"label.new-password": "Nova senha", +"label.none": "Nenhum", +"label.number-of-records": "{x} {x, plural, one {registro} other {registros}}", +"label.ok": "OK", +"label.os": "Sistema operacional", +"label.overview": "Visão geral", +"label.owner": "Proprietário", +"label.page-of": "Página {current} de {total}", +"label.page-views": "Visualizações de página", +"label.pageTitle": "Título", +"label.pages": "Páginas", +"label.password": "Senha", +"label.powered-by": "Desenvolvido por {name}", +"label.profile": "Perfil", +"label.queries": "Consultas", +"label.query": "Consulta", +"label.query-parameters": "Parâmetros da consulta", +"label.realtime": "Tempo real", +"label.referrer": "Referência", +"label.referrers": "Referências", +"label.refresh": "Atualizar", +"label.regenerate": "Gerar novamente", +"label.region": "Estado", +"label.regions": "Estados", +"label.remove": "Remover", +"label.remove-member": "Remover membro", +"label.reports": "Relatórios", +"label.required": "Obrigatório", +"label.reset": "Redefinir", +"label.reset-website": "Redefinir dados", +"label.retention": "Retenção", +"label.retention-description": "Avalie a fidelidade dos seus usuários medindo a frequência com que eles retornam.", +"label.role": "Função", +"label.run-query": "Executar consulta", +"label.save": "Salvar", +"label.screens": "Tamanhos de tela", +"label.search": "Pesquisar", +"label.select": "Selecionar", +"label.select-date": "Selecionar data", +"label.select-role": "Selecionar função", +"label.select-website": "Selecionar site", +"label.sessions": "Sessões", +"label.settings": "Configurações", +"label.share-url": "Link para compartilhar", +"label.single-day": "Apenas um dia", +"label.steps": "Etapas", +"label.sum": "Soma", +"label.tablet": "Tablet", +"label.team": "Equipe", +"label.team-id": "ID da equipe", +"label.team-member": "Membro da equipe", +"label.team-name": "Nome da equipe", +"label.team-owner": "Proprietário da equipe", +"label.team-view-only": "Apenas visualização da equipe", +"label.team-websites": "Sites da equipe", +"label.teams": "Equipes", "label.theme": "Tema", -"label.this-month": "Este mês", -"label.this-week": "Esta semana", +"label.this-month": "Este mês", +"label.this-week": "Esta semana", "label.this-year": "Este ano", "label.timezone": "Fuso horário", "label.title": "Título", -"label.today": "Hoje", -"label.toggle-charts": "Mostrar/Esconder gráficos", +"label.today": "Hoje", +"label.toggle-charts": "Alternar gráficos", "label.total": "Total", -"label.total-records": "Total de registros", +"label.total-records": "Total de registros", "label.tracking-code": "Código de rastreamento", "label.transfer": "Transferir", "label.transfer-website": "Transferir site", -"label.true": "Verdadeiro", -"label.type": "Tipo", -"label.unique": "Único", +"label.true": "Sim", +"label.type": "Tipo", +"label.unique": "Únicos", "label.unique-visitors": "Visitantes únicos", "label.unknown": "Desconhecido", "label.untitled": "Sem título", -"label.update": "Atualizar", -"label.url": "URL", +"label.update": "Atualizar", +"label.url": "URL", "label.urls": "URLs", "label.user": "Usuário", -"label.username": "Nome de usuário", +"label.username": "Nome de usuário", "label.users": "Usuários", "label.utm": "UTM", -"label.utm-description": "Rastreie suas campanhas por meio de parâmetros UTM.", -"label.value": "Valor", +"label.utm-description": "Acompanhe suas campanhas de publicidade através de parâmetros UTM.", +"label.value": "Valor", "label.view": "Visualizar", -"label.view-details": "Ver detalhes", +"label.view-details": "Ver mais", "label.view-only": "Somente visualização", "label.views": "Visualizações", -"label.views-per-visit": "Visualizações por visita", -"label.visitors": "Visitantes", +"label.views-per-visit": "Visualizações por visita", +"label.visitors": "Visitantes", "label.visits": "Visitas", "label.website": "Site", -"label.website-id": "ID do site", +"label.website-id": "ID do site", "label.websites": "Sites", "label.window": "Janela", -"label.yesterday": "Ontem", -"message.action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.", -"message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento", -"message.confirm-delete": "Deseja realmente remover {target}?", -"message.confirm-leave": "Você tem certeza que deseja sair de {target}?", -"message.confirm-remove": "Tem certeza que deseja remover {target}?", -"message.confirm-reset": "Tem certeza que deseja redefinir as estatísticas de {target}?", -"message.delete-team-warning": "Excluir um time também excluirá todos os sites do time.", -"message.delete-website-warning": "Todos os dados associados também serão excluídos.", +"label.yesterday": "Ontem", +"message.action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.", +"message.active-users": " Atualmente {x} usuários ativos", +"message.confirm-delete": "Tem certeza de que deseja excluir {target}?", +"message.confirm-leave": "Tem certeza de que deseja sair de {target}?", +"message.confirm-remove": "Tem certeza que deseja remover {target}?", +"message.confirm-reset": "Tem certeza que deseja redefinir os dados de {target}?", +"message.delete-team-warning": "Excluir a equipe também excluirá todos os sites da equipe.", +"message.delete-website-warning": "Todos os dados relacionados serão excluídos.", "message.error": "Ocorreu um erro.", "message.event-log": "{event} em {url}", "message.go-to-settings": "Ir para as configurações", -"message.incorrect-username-password": "Nome de usuário e/ou senha incorretos.", +"message.incorrect-username-password": "Nome de usuário ou senha incorretos.", "message.invalid-domain": "Domínio inválido", -"message.min-password-length": "Quantidade mínima de {n} caracteres", -"message.new-version-available": "Uma nova versão do Umami {version} está disponível!", -"message.no-data-available": "Sem dados disponíveis.", -"message.no-event-data": "Nenhum dado de evento disponível.", -"message.no-match-password": "As senhas não coincidem", -"message.no-results-found": "Nenhum resultado foi encontrado.", -"message.no-team-websites": "Este time não possui nenhum site.", -"message.no-teams": "Você não criou nenhum time.", +"message.min-password-length": "A senha deve ter no mínimo {n} caracteres", +"message.new-version-available": "Uma nova versão {version} do Umami está disponível!", +"message.no-data-available": "Não há dados disponíveis.", +"message.no-event-data": "Não há eventos disponíveis.", +"message.no-match-password": "As senhas não coincidem.", +"message.no-results-found": "Nenhum resultado encontrado.", +"message.no-team-websites": "Esta equipe não possui sites.", +"message.no-teams": "Você ainda não criou nenhuma equipe.", "message.no-users": "Não há usuários.", -"message.no-websites-configured": "Nenhum site foi configurado ainda.", +"message.no-websites-configured": "Você ainda não configurou nenhum site.", "message.page-not-found": "Página não encontrada.", -"message.reset-website": "Para redefinir este site, digite {confirmation} na caixa abaixo para confirmar.", -"message.reset-website-warning": "Todas as estatísticas deste site serão removidas, mas seu código de rastreamento permanecerá intacto.", +"message.reset-website": "Se você tiver certeza de que deseja redefinir este site, digite {confirmation} na caixa de entrada abaixo para confirmar.", +"message.reset-website-warning": "Todos os dados estatísticos deste site serão excluídos, mas seu código de rastreamento permanecerá o mesmo.", "message.saved": "Salvo com sucesso.", -"message.share-url": "Este é o link público de compartilhamento para {target}.", -"message.team-already-member": "Você já é um membro do time.", -"message.team-not-found": "Time não encontrado.", -"message.team-websites-info": "Os sites podem ser visualizados por qualquer membro da equipe.", +"message.share-url": "Este é o link para compartilhar {target}.", +"message.team-already-member": "Você já é membro desta equipe.", +"message.team-not-found": "Equipe não encontrada.", +"message.team-websites-info": "Qualquer membro da equipe pode visualizar os sites.", "message.tracking-code": "Código de rastreamento", -"message.transfer-team-website-to-user": "Transferir este site para a sua conta?", -"message.transfer-user-website-to-team": "Selecione o time para o qual deseja transferir este site.", -"message.transfer-website": "Transferir a propriedade do site para a sua conta ou para outro time.", +"message.transfer-team-website-to-user": "Transferir este site para sua conta?", +"message.transfer-user-website-to-team": "Selecione para qual equipe deseja transferir este site.", +"message.transfer-website": "Transfira a propriedade do site para sua conta ou para outra equipe.", "message.triggered-event": "Evento disparado", -"message.user-deleted": "Usuário removido.", +"message.user-deleted": "Usuário excluído.", "message.viewed-page": "Página visualizada", -"message.visitor-log": "Visitante de {country} usando {browser} no {device} {os}", -"message.visitors-dropped-off": "Visitantes que abandonaram" +"message.visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os}.", +"message.visitors-dropped-off": "Visitantes abandonados" } From fed261023c31e2626316e7a4d8757c60f7492107 Mon Sep 17 00:00:00 2001 From: Eddu Date: Thu, 9 May 2024 20:25:42 -0300 Subject: [PATCH 014/121] pt-br release --- src/lang/pt-BR.json | 333 ++++++++++++++++++++++---------------------- 1 file changed, 166 insertions(+), 167 deletions(-) diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index 8e3c9bfd..5c0425ea 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -78,170 +78,169 @@ "label.greater-than": "Maior que", "label.greater-than-equals": "Maior ou igual a", "label.insights": "Insights", - "label.insights-description": "Explore seus dados em mais detalhes usando filtros", - "label.insights-description": "Explore seus dados em mais detalhes usando filtros e segmentação por períodos.", -"label.is": "É igual a", -"label.is-not": "Não é igual a", -"label.is-not-set": "Não definido", -"label.is-set": "Definido", -"label.join": "Participar", -"label.join-team": "Participar da equipe", -"label.language": "Idioma", -"label.languages": "Idiomas", -"label.laptop": "Notebook", -"label.last-days": "Últimos {x} dias", -"label.last-hours": "Últimas {x} horas", -"label.last-months": "Últimos {x} meses", -"label.leave": "Sair", -"label.leave-team": "Sair da equipe", -"label.less-than": "Menor que", -"label.less-than-equals": "Menor ou igual a", -"label.login": "Entrar", -"label.logout": "Sair", -"label.manage": "Gerenciar", -"label.max": "Máximo", -"label.member": "Membro", -"label.members": "Membros", -"label.min": "Mínimo", -"label.mobile": "Celular", -"label.more": "Mais", -"label.my-account": "Minha conta", -"label.my-websites": "Meus sites", -"label.name": "Nome", -"label.new-password": "Nova senha", -"label.none": "Nenhum", -"label.number-of-records": "{x} {x, plural, one {registro} other {registros}}", -"label.ok": "OK", -"label.os": "Sistema operacional", -"label.overview": "Visão geral", -"label.owner": "Proprietário", -"label.page-of": "Página {current} de {total}", -"label.page-views": "Visualizações de página", -"label.pageTitle": "Título", -"label.pages": "Páginas", -"label.password": "Senha", -"label.powered-by": "Desenvolvido por {name}", -"label.profile": "Perfil", -"label.queries": "Consultas", -"label.query": "Consulta", -"label.query-parameters": "Parâmetros da consulta", -"label.realtime": "Tempo real", -"label.referrer": "Referência", -"label.referrers": "Referências", -"label.refresh": "Atualizar", -"label.regenerate": "Gerar novamente", -"label.region": "Estado", -"label.regions": "Estados", -"label.remove": "Remover", -"label.remove-member": "Remover membro", -"label.reports": "Relatórios", -"label.required": "Obrigatório", -"label.reset": "Redefinir", -"label.reset-website": "Redefinir dados", -"label.retention": "Retenção", -"label.retention-description": "Avalie a fidelidade dos seus usuários medindo a frequência com que eles retornam.", -"label.role": "Função", -"label.run-query": "Executar consulta", -"label.save": "Salvar", -"label.screens": "Tamanhos de tela", -"label.search": "Pesquisar", -"label.select": "Selecionar", -"label.select-date": "Selecionar data", -"label.select-role": "Selecionar função", -"label.select-website": "Selecionar site", -"label.sessions": "Sessões", -"label.settings": "Configurações", -"label.share-url": "Link para compartilhar", -"label.single-day": "Apenas um dia", -"label.steps": "Etapas", -"label.sum": "Soma", -"label.tablet": "Tablet", -"label.team": "Equipe", -"label.team-id": "ID da equipe", -"label.team-member": "Membro da equipe", -"label.team-name": "Nome da equipe", -"label.team-owner": "Proprietário da equipe", -"label.team-view-only": "Apenas visualização da equipe", -"label.team-websites": "Sites da equipe", -"label.teams": "Equipes", -"label.theme": "Tema", -"label.this-month": "Este mês", -"label.this-week": "Esta semana", -"label.this-year": "Este ano", -"label.timezone": "Fuso horário", -"label.title": "Título", -"label.today": "Hoje", -"label.toggle-charts": "Alternar gráficos", -"label.total": "Total", -"label.total-records": "Total de registros", -"label.tracking-code": "Código de rastreamento", -"label.transfer": "Transferir", -"label.transfer-website": "Transferir site", -"label.true": "Sim", -"label.type": "Tipo", -"label.unique": "Únicos", -"label.unique-visitors": "Visitantes únicos", -"label.unknown": "Desconhecido", -"label.untitled": "Sem título", -"label.update": "Atualizar", -"label.url": "URL", -"label.urls": "URLs", -"label.user": "Usuário", -"label.username": "Nome de usuário", -"label.users": "Usuários", -"label.utm": "UTM", -"label.utm-description": "Acompanhe suas campanhas de publicidade através de parâmetros UTM.", -"label.value": "Valor", -"label.view": "Visualizar", -"label.view-details": "Ver mais", -"label.view-only": "Somente visualização", -"label.views": "Visualizações", -"label.views-per-visit": "Visualizações por visita", -"label.visitors": "Visitantes", -"label.visits": "Visitas", -"label.website": "Site", -"label.website-id": "ID do site", -"label.websites": "Sites", -"label.window": "Janela", -"label.yesterday": "Ontem", -"message.action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.", -"message.active-users": " Atualmente {x} usuários ativos", -"message.confirm-delete": "Tem certeza de que deseja excluir {target}?", -"message.confirm-leave": "Tem certeza de que deseja sair de {target}?", -"message.confirm-remove": "Tem certeza que deseja remover {target}?", -"message.confirm-reset": "Tem certeza que deseja redefinir os dados de {target}?", -"message.delete-team-warning": "Excluir a equipe também excluirá todos os sites da equipe.", -"message.delete-website-warning": "Todos os dados relacionados serão excluídos.", -"message.error": "Ocorreu um erro.", -"message.event-log": "{event} em {url}", -"message.go-to-settings": "Ir para as configurações", -"message.incorrect-username-password": "Nome de usuário ou senha incorretos.", -"message.invalid-domain": "Domínio inválido", -"message.min-password-length": "A senha deve ter no mínimo {n} caracteres", -"message.new-version-available": "Uma nova versão {version} do Umami está disponível!", -"message.no-data-available": "Não há dados disponíveis.", -"message.no-event-data": "Não há eventos disponíveis.", -"message.no-match-password": "As senhas não coincidem.", -"message.no-results-found": "Nenhum resultado encontrado.", -"message.no-team-websites": "Esta equipe não possui sites.", -"message.no-teams": "Você ainda não criou nenhuma equipe.", -"message.no-users": "Não há usuários.", -"message.no-websites-configured": "Você ainda não configurou nenhum site.", -"message.page-not-found": "Página não encontrada.", -"message.reset-website": "Se você tiver certeza de que deseja redefinir este site, digite {confirmation} na caixa de entrada abaixo para confirmar.", -"message.reset-website-warning": "Todos os dados estatísticos deste site serão excluídos, mas seu código de rastreamento permanecerá o mesmo.", -"message.saved": "Salvo com sucesso.", -"message.share-url": "Este é o link para compartilhar {target}.", -"message.team-already-member": "Você já é membro desta equipe.", -"message.team-not-found": "Equipe não encontrada.", -"message.team-websites-info": "Qualquer membro da equipe pode visualizar os sites.", -"message.tracking-code": "Código de rastreamento", -"message.transfer-team-website-to-user": "Transferir este site para sua conta?", -"message.transfer-user-website-to-team": "Selecione para qual equipe deseja transferir este site.", -"message.transfer-website": "Transfira a propriedade do site para sua conta ou para outra equipe.", -"message.triggered-event": "Evento disparado", -"message.user-deleted": "Usuário excluído.", -"message.viewed-page": "Página visualizada", -"message.visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os}.", -"message.visitors-dropped-off": "Visitantes abandonados" -} + "label.insights-description": "Explore seus dados em mais detalhes usando filtros", + "label.is": "É igual a", + "label.is-not": "Não é igual a", + "label.is-not-set": "Não definido", + "label.is-set": "Definido", + "label.join": "Participar", + "label.join-team": "Participar da equipe", + "label.language": "Idioma", + "label.languages": "Idiomas", + "label.laptop": "Notebook", + "label.last-days": "Últimos {x} dias", + "label.last-hours": "Últimas {x} horas", + "label.last-months": "Últimos {x} meses", + "label.leave": "Sair", + "label.leave-team": "Sair da equipe", + "label.less-than": "Menor que", + "label.less-than-equals": "Menor ou igual a", + "label.login": "Entrar", + "label.logout": "Sair", + "label.manage": "Gerenciar", + "label.max": "Máximo", + "label.member": "Membro", + "label.members": "Membros", + "label.min": "Mínimo", + "label.mobile": "Celular", + "label.more": "Mais", + "label.my-account": "Minha conta", + "label.my-websites": "Meus sites", + "label.name": "Nome", + "label.new-password": "Nova senha", + "label.none": "Nenhum", + "label.number-of-records": "{x} {x, plural, one {registro} other {registros}}", + "label.ok": "OK", + "label.os": "Sistema operacional", + "label.overview": "Visão geral", + "label.owner": "Proprietário", + "label.page-of": "Página {current} de {total}", + "label.page-views": "Visualizações de página", + "label.pageTitle": "Título", + "label.pages": "Páginas", + "label.password": "Senha", + "label.powered-by": "Desenvolvido por {name}", + "label.profile": "Perfil", + "label.queries": "Consultas", + "label.query": "Consulta", + "label.query-parameters": "Parâmetros da consulta", + "label.realtime": "Tempo real", + "label.referrer": "Referência", + "label.referrers": "Referências", + "label.refresh": "Atualizar", + "label.regenerate": "Gerar novamente", + "label.region": "Estado", + "label.regions": "Estados", + "label.remove": "Remover", + "label.remove-member": "Remover membro", + "label.reports": "Relatórios", + "label.required": "Obrigatório", + "label.reset": "Redefinir", + "label.reset-website": "Redefinir dados", + "label.retention": "Retenção", + "label.retention-description": "Avalie a fidelidade dos seus usuários medindo a frequência com que eles retornam.", + "label.role": "Função", + "label.run-query": "Executar consulta", + "label.save": "Salvar", + "label.screens": "Tamanhos de tela", + "label.search": "Pesquisar", + "label.select": "Selecionar", + "label.select-date": "Selecionar data", + "label.select-role": "Selecionar função", + "label.select-website": "Selecionar site", + "label.sessions": "Sessões", + "label.settings": "Configurações", + "label.share-url": "Link para compartilhar", + "label.single-day": "Apenas um dia", + "label.steps": "Etapas", + "label.sum": "Soma", + "label.tablet": "Tablet", + "label.team": "Equipe", + "label.team-id": "ID da equipe", + "label.team-member": "Membro da equipe", + "label.team-name": "Nome da equipe", + "label.team-owner": "Proprietário da equipe", + "label.team-view-only": "Apenas visualização da equipe", + "label.team-websites": "Sites da equipe", + "label.teams": "Equipes", + "label.theme": "Tema", + "label.this-month": "Este mês", + "label.this-week": "Esta semana", + "label.this-year": "Este ano", + "label.timezone": "Fuso horário", + "label.title": "Título", + "label.today": "Hoje", + "label.toggle-charts": "Alternar gráficos", + "label.total": "Total", + "label.total-records": "Total de registros", + "label.tracking-code": "Código de rastreamento", + "label.transfer": "Transferir", + "label.transfer-website": "Transferir site", + "label.true": "Sim", + "label.type": "Tipo", + "label.unique": "Únicos", + "label.unique-visitors": "Visitantes únicos", + "label.unknown": "Desconhecido", + "label.untitled": "Sem título", + "label.update": "Atualizar", + "label.url": "URL", + "label.urls": "URLs", + "label.user": "Usuário", + "label.username": "Nome de usuário", + "label.users": "Usuários", + "label.utm": "UTM", + "label.utm-description": "Acompanhe suas campanhas de publicidade através de parâmetros UTM.", + "label.value": "Valor", + "label.view": "Visualizar", + "label.view-details": "Ver mais", + "label.view-only": "Somente visualização", + "label.views": "Visualizações", + "label.views-per-visit": "Visualizações por visita", + "label.visitors": "Visitantes", + "label.visits": "Visitas", + "label.website": "Site", + "label.website-id": "ID do site", + "label.websites": "Sites", + "label.window": "Janela", + "label.yesterday": "Ontem", + "message.action-confirmation": "Digite {confirmation} na caixa abaixo para confirmar.", + "message.active-users": " Atualmente {x} usuários ativos", + "message.confirm-delete": "Tem certeza de que deseja excluir {target}?", + "message.confirm-leave": "Tem certeza de que deseja sair de {target}?", + "message.confirm-remove": "Tem certeza que deseja remover {target}?", + "message.confirm-reset": "Tem certeza que deseja redefinir os dados de {target}?", + "message.delete-team-warning": "Excluir a equipe também excluirá todos os sites da equipe.", + "message.delete-website-warning": "Todos os dados relacionados serão excluídos.", + "message.error": "Ocorreu um erro.", + "message.event-log": "{event} em {url}", + "message.go-to-settings": "Ir para as configurações", + "message.incorrect-username-password": "Nome de usuário ou senha incorretos.", + "message.invalid-domain": "Domínio inválido", + "message.min-password-length": "A senha deve ter no mínimo {n} caracteres", + "message.new-version-available": "Uma nova versão {version} do Umami está disponível!", + "message.no-data-available": "Não há dados disponíveis.", + "message.no-event-data": "Não há eventos disponíveis.", + "message.no-match-password": "As senhas não coincidem.", + "message.no-results-found": "Nenhum resultado encontrado.", + "message.no-team-websites": "Esta equipe não possui sites.", + "message.no-teams": "Você ainda não criou nenhuma equipe.", + "message.no-users": "Não há usuários.", + "message.no-websites-configured": "Você ainda não configurou nenhum site.", + "message.page-not-found": "Página não encontrada.", + "message.reset-website": "Se você tiver certeza de que deseja redefinir este site, digite {confirmation} na caixa de entrada abaixo para confirmar.", + "message.reset-website-warning": "Todos os dados estatísticos deste site serão excluídos, mas seu código de rastreamento permanecerá o mesmo.", + "message.saved": "Salvo com sucesso.", + "message.share-url": "Este é o link para compartilhar {target}.", + "message.team-already-member": "Você já é membro desta equipe.", + "message.team-not-found": "Equipe não encontrada.", + "message.team-websites-info": "Qualquer membro da equipe pode visualizar os sites.", + "message.tracking-code": "Código de rastreamento", + "message.transfer-team-website-to-user": "Transferir este site para sua conta?", + "message.transfer-user-website-to-team": "Selecione para qual equipe deseja transferir este site.", + "message.transfer-website": "Transfira a propriedade do site para sua conta ou para outra equipe.", + "message.triggered-event": "Evento disparado", + "message.user-deleted": "Usuário excluído.", + "message.viewed-page": "Página visualizada", + "message.visitor-log": "Visitante de {country} usando o navegador {browser} em um {device} com sistema operacional {os}.", + "message.visitors-dropped-off": "Visitantes abandonados" + } From 92a45f9d91537205b43afa5ff92a2c290ce5ea17 Mon Sep 17 00:00:00 2001 From: Eddu Date: Thu, 9 May 2024 23:07:13 -0300 Subject: [PATCH 015/121] pt-br release --- public/intl/messages/pt-BR.json | 320 ++++++++++++++++---------------- 1 file changed, 163 insertions(+), 157 deletions(-) diff --git a/public/intl/messages/pt-BR.json b/public/intl/messages/pt-BR.json index f142817f..cde65c38 100644 --- a/public/intl/messages/pt-BR.json +++ b/public/intl/messages/pt-BR.json @@ -14,31 +14,31 @@ "label.activity-log": [ { "type": 0, - "value": "Log de atividade" + "value": "Registro de atividades" } ], "label.add": [ { "type": 0, - "value": "Add" + "value": "Adicionar" } ], "label.add-description": [ { "type": 0, - "value": "Add description" + "value": "Adicionar descrição" } ], "label.add-member": [ { "type": 0, - "value": "Add member" + "value": "Adicionar membro" } ], "label.add-step": [ { "type": 0, - "value": "Add step" + "value": "Adicionar etapa" } ], "label.add-website": [ @@ -56,7 +56,7 @@ "label.after": [ { "type": 0, - "value": "Depois" + "value": "Depois de" } ], "label.all": [ @@ -74,19 +74,19 @@ "label.analytics": [ { "type": 0, - "value": "Estatísticas" + "value": "Análises" } ], "label.average": [ { "type": 0, - "value": "Average" + "value": "Média" } ], "label.average-visit-time": [ { "type": 0, - "value": "Tempo médio da visita" + "value": "Tempo médio de visita" } ], "label.back": [ @@ -98,7 +98,7 @@ "label.before": [ { "type": 0, - "value": "Antes" + "value": "Antes de" } ], "label.bounce-rate": [ @@ -110,13 +110,13 @@ "label.breakdown": [ { "type": 0, - "value": "Breakdown" + "value": "Detalhamento" } ], "label.browser": [ { "type": 0, - "value": "Browser" + "value": "Navegador" } ], "label.browsers": [ @@ -134,7 +134,7 @@ "label.change-password": [ { "type": 0, - "value": "Alterar a senha" + "value": "Alterar senha" } ], "label.cities": [ @@ -146,7 +146,7 @@ "label.city": [ { "type": 0, - "value": "City" + "value": "Cidade" } ], "label.clear-all": [ @@ -164,13 +164,13 @@ "label.confirm-password": [ { "type": 0, - "value": "Confirme a nova senha" + "value": "Confirmar senha" } ], "label.contains": [ { "type": 0, - "value": "Contains" + "value": "Contém" } ], "label.continue": [ @@ -188,13 +188,13 @@ "label.country": [ { "type": 0, - "value": "Country" + "value": "País" } ], "label.create": [ { "type": 0, - "value": "Create" + "value": "Criar" } ], "label.create-report": [ @@ -206,7 +206,7 @@ "label.create-team": [ { "type": 0, - "value": "Criar time" + "value": "Criar equipe" } ], "label.create-user": [ @@ -224,7 +224,7 @@ "label.created-by": [ { "type": 0, - "value": "Created By" + "value": "Criado por" } ], "label.current-password": [ @@ -248,13 +248,13 @@ "label.data": [ { "type": 0, - "value": "Data" + "value": "Dados" } ], "label.date": [ { "type": 0, - "value": "Date" + "value": "Data" } ], "label.date-range": [ @@ -266,43 +266,43 @@ "label.day": [ { "type": 0, - "value": "Day" + "value": "Dia" } ], "label.default-date-range": [ { "type": 0, - "value": "Intervalo de datas predefinido" + "value": "Intervalo padrão de datas" } ], "label.delete": [ { "type": 0, - "value": "Remover" + "value": "Excluir" } ], "label.delete-report": [ { "type": 0, - "value": "Delete report" + "value": "Excluir relatório" } ], "label.delete-team": [ { "type": 0, - "value": "Remover time" + "value": "Excluir equipe" } ], "label.delete-user": [ { "type": 0, - "value": "Remover usuário" + "value": "Excluir usuário" } ], "label.delete-website": [ { "type": 0, - "value": "Remover site" + "value": "Excluir site" } ], "label.description": [ @@ -314,7 +314,7 @@ "label.desktop": [ { "type": 0, - "value": "Computador" + "value": "Desktop" } ], "label.details": [ @@ -326,7 +326,7 @@ "label.device": [ { "type": 0, - "value": "Device" + "value": "Dispositivo" } ], "label.devices": [ @@ -344,7 +344,7 @@ "label.does-not-contain": [ { "type": 0, - "value": "Does not contain" + "value": "Não contém" } ], "label.domain": [ @@ -356,7 +356,7 @@ "label.dropoff": [ { "type": 0, - "value": "Dropoff" + "value": "Queda" } ], "label.edit": [ @@ -368,19 +368,19 @@ "label.edit-dashboard": [ { "type": 0, - "value": "Editar painel" + "value": "Editar dashboard" } ], "label.edit-member": [ { "type": 0, - "value": "Edit member" + "value": "Editar membro" } ], "label.enable-share-url": [ { "type": 0, - "value": "Ativar link de compartilhamento" + "value": "Habilitar URL de compartilhamento" } ], "label.event": [ @@ -392,7 +392,7 @@ "label.event-data": [ { "type": 0, - "value": "Event data" + "value": "Dados do evento" } ], "label.events": [ @@ -404,7 +404,7 @@ "label.false": [ { "type": 0, - "value": "False" + "value": "Falso" } ], "label.field": [ @@ -422,7 +422,7 @@ "label.filter": [ { "type": 0, - "value": "Filter" + "value": "Filtro" } ], "label.filter-combined": [ @@ -434,13 +434,13 @@ "label.filter-raw": [ { "type": 0, - "value": "Dados brutos" + "value": "Bruto" } ], "label.filters": [ { "type": 0, - "value": "Filters" + "value": "Filtros" } ], "label.funnel": [ @@ -452,7 +452,7 @@ "label.funnel-description": [ { "type": 0, - "value": "Understand the conversion and drop-off rate of users." + "value": "Entenda a conversão e a taxa de abandono dos usuários." } ], "label.greater-than": [ @@ -464,7 +464,7 @@ "label.greater-than-equals": [ { "type": 0, - "value": "Maior que ou igual" + "value": "Maior que ou igual a" } ], "label.insights": [ @@ -476,43 +476,43 @@ "label.insights-description": [ { "type": 0, - "value": "Dive deeper into your data by using segments and filters." + "value": "Explore seus dados mais profundamente usando segmentos e filtros." } ], "label.is": [ { "type": 0, - "value": "Is" + "value": "É" } ], "label.is-not": [ { "type": 0, - "value": "Is not" + "value": "Não é" } ], "label.is-not-set": [ { "type": 0, - "value": "Is not set" + "value": "Não está definido" } ], "label.is-set": [ { "type": 0, - "value": "Is set" + "value": "Está definido" } ], "label.join": [ { "type": 0, - "value": "Entrar" + "value": "Participar" } ], "label.join-team": [ { "type": 0, - "value": "Entrar no time" + "value": "Entrar na equipe" } ], "label.language": [ @@ -530,7 +530,7 @@ "label.laptop": [ { "type": 0, - "value": "Notebook" + "value": "Laptop" } ], "label.last-days": [ @@ -564,7 +564,7 @@ "label.last-months": [ { "type": 0, - "value": "Last " + "value": "Últimos " }, { "type": 1, @@ -572,7 +572,7 @@ }, { "type": 0, - "value": " months" + "value": " meses" } ], "label.leave": [ @@ -584,49 +584,49 @@ "label.leave-team": [ { "type": 0, - "value": "Sair do time" + "value": "Sair da equipe" } ], "label.less-than": [ { "type": 0, - "value": "Menor que" + "value": "Menos que" } ], "label.less-than-equals": [ { "type": 0, - "value": "Menor que ou igual" + "value": "Menos que ou igual a" } ], "label.login": [ { "type": 0, - "value": "Iniciar sessão" + "value": "Login" } ], "label.logout": [ { "type": 0, - "value": "Sair" + "value": "Logout" } ], "label.manage": [ { "type": 0, - "value": "Manage" + "value": "Gerenciar" } ], "label.max": [ { "type": 0, - "value": "Max" + "value": "Máx" } ], "label.member": [ { "type": 0, - "value": "Member" + "value": "Membro" } ], "label.members": [ @@ -638,7 +638,7 @@ "label.min": [ { "type": 0, - "value": "Min" + "value": "Mín" } ], "label.mobile": [ @@ -656,13 +656,13 @@ "label.my-account": [ { "type": 0, - "value": "My account" + "value": "Minha conta" } ], "label.my-websites": [ { "type": 0, - "value": "My websites" + "value": "Meus sites" } ], "label.name": [ @@ -699,7 +699,7 @@ "value": [ { "type": 0, - "value": "record" + "value": "registro" } ] }, @@ -707,7 +707,7 @@ "value": [ { "type": 0, - "value": "records" + "value": "registro" } ] } @@ -726,13 +726,13 @@ "label.os": [ { "type": 0, - "value": "OS" + "value": "SO" } ], "label.overview": [ { "type": 0, - "value": "Overview" + "value": "Visão geral" } ], "label.owner": [ @@ -744,7 +744,7 @@ "label.page-of": [ { "type": 0, - "value": "Page " + "value": "Página " }, { "type": 1, @@ -752,7 +752,7 @@ }, { "type": 0, - "value": " of " + "value": " de " }, { "type": 1, @@ -768,7 +768,7 @@ "label.pageTitle": [ { "type": 0, - "value": "Page title" + "value": "Título da página" } ], "label.pages": [ @@ -786,7 +786,7 @@ "label.powered-by": [ { "type": 0, - "value": "Distribuído por " + "value": "Desenvolvido por " }, { "type": 1, @@ -802,19 +802,19 @@ "label.queries": [ { "type": 0, - "value": "Parâmetros" + "value": "Consultas" } ], "label.query": [ { "type": 0, - "value": "Query" + "value": "Consulta" } ], "label.query-parameters": [ { "type": 0, - "value": "Parâmetros de Consulta" + "value": "Parâmetros de consulta" } ], "label.realtime": [ @@ -826,13 +826,13 @@ "label.referrer": [ { "type": 0, - "value": "Referrer" + "value": "Referenciador" } ], "label.referrers": [ { "type": 0, - "value": "Referências" + "value": "Referenciadores" } ], "label.refresh": [ @@ -850,7 +850,7 @@ "label.region": [ { "type": 0, - "value": "Region" + "value": "Região" } ], "label.regions": [ @@ -868,13 +868,13 @@ "label.remove-member": [ { "type": 0, - "value": "Remove member" + "value": "Remover membro" } ], "label.reports": [ { "type": 0, - "value": "Reports" + "value": "Relatórios" } ], "label.required": [ @@ -892,31 +892,31 @@ "label.reset-website": [ { "type": 0, - "value": "Redefinir estatísticas" + "value": "Redefinir site" } ], "label.retention": [ { "type": 0, - "value": "Retention" + "value": "Retenção" } ], "label.retention-description": [ { "type": 0, - "value": "Measure your website stickiness by tracking how often users return." + "value": "Meça a aderência do seu website monitorando a frequência com que os usuários retornam." } ], "label.role": [ { "type": 0, - "value": "Papel" + "value": "Função" } ], "label.run-query": [ { "type": 0, - "value": "Executar query" + "value": "Executar consulta" } ], "label.save": [ @@ -934,13 +934,13 @@ "label.search": [ { "type": 0, - "value": "Search" + "value": "Buscar" } ], "label.select": [ { "type": 0, - "value": "Select" + "value": "Selecionar" } ], "label.select-date": [ @@ -952,7 +952,7 @@ "label.select-role": [ { "type": 0, - "value": "Select role" + "value": "Selecionar função" } ], "label.select-website": [ @@ -976,25 +976,25 @@ "label.share-url": [ { "type": 0, - "value": "Link de compartilhamento" + "value": "Compartilhar URL" } ], "label.single-day": [ { "type": 0, - "value": "Dia específico" + "value": "Dia único" } ], "label.steps": [ { "type": 0, - "value": "Steps" + "value": "Passos" } ], "label.sum": [ { "type": 0, - "value": "Sum" + "value": "Soma" } ], "label.tablet": [ @@ -1006,49 +1006,49 @@ "label.team": [ { "type": 0, - "value": "Time" + "value": "Equipe" } ], "label.team-id": [ { "type": 0, - "value": "ID do Time" + "value": "ID da Equipe" } ], "label.team-member": [ { "type": 0, - "value": "Membro" + "value": "Membro da equipe" } ], "label.team-name": [ { "type": 0, - "value": "Team name" + "value": "Nome da equipe" } ], "label.team-owner": [ { "type": 0, - "value": "Proprietário" + "value": "Proprietário da equipe" } ], "label.team-view-only": [ { "type": 0, - "value": "Team view only" + "value": "Equipe Somente leitura" } ], "label.team-websites": [ { "type": 0, - "value": "Team websites" + "value": "Sites daequipe" } ], "label.teams": [ { "type": 0, - "value": "Times" + "value": "Equipes" } ], "label.theme": [ @@ -1096,7 +1096,7 @@ "label.toggle-charts": [ { "type": 0, - "value": "Mostrar/Esconder gráficos" + "value": "Alternar gráficos" } ], "label.total": [ @@ -1108,7 +1108,7 @@ "label.total-records": [ { "type": 0, - "value": "Total records" + "value": "Total de registros" } ], "label.tracking-code": [ @@ -1120,19 +1120,19 @@ "label.transfer": [ { "type": 0, - "value": "Transfer" + "value": "Transferir" } ], "label.transfer-website": [ { "type": 0, - "value": "Transfer website" + "value": "Transferir site" } ], "label.true": [ { "type": 0, - "value": "True" + "value": "Verdadeiro" } ], "label.type": [ @@ -1168,7 +1168,7 @@ "label.update": [ { "type": 0, - "value": "Update" + "value": "Atualizar" } ], "label.url": [ @@ -1210,7 +1210,7 @@ "label.utm-description": [ { "type": 0, - "value": "Track your campaigns through UTM parameters." + "value": "Acompanhe suas campanhas por meio de parâmetros UTM." } ], "label.value": [ @@ -1222,7 +1222,7 @@ "label.view": [ { "type": 0, - "value": "Ver" + "value": "Visualizar" } ], "label.view-details": [ @@ -1234,7 +1234,7 @@ "label.view-only": [ { "type": 0, - "value": "Somente visualização" + "value": "Somente leitura" } ], "label.views": [ @@ -1246,7 +1246,7 @@ "label.views-per-visit": [ { "type": 0, - "value": "Views per visit" + "value": "Visualizações por visita" } ], "label.visitors": [ @@ -1258,19 +1258,19 @@ "label.visits": [ { "type": 0, - "value": "Visits" + "value": "Visitas" } ], "label.website": [ { "type": 0, - "value": "Website" + "value": "Site" } ], "label.website-id": [ { "type": 0, - "value": "ID do Site" + "value": "ID do site" } ], "label.websites": [ @@ -1294,7 +1294,7 @@ "message.action-confirmation": [ { "type": 0, - "value": "Type " + "value": "Digite " }, { "type": 1, @@ -1302,7 +1302,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " na caixa abaixo para confirmar." } ], "message.active-users": [ @@ -1346,7 +1346,7 @@ "message.confirm-delete": [ { "type": 0, - "value": "Deseja realmente remover " + "value": "Tem certeza que deseja excluir " }, { "type": 1, @@ -1360,7 +1360,7 @@ "message.confirm-leave": [ { "type": 0, - "value": "Você tem certeza que deseja sair de " + "value": "Tem certeza que deseja sair de " }, { "type": 1, @@ -1374,7 +1374,7 @@ "message.confirm-remove": [ { "type": 0, - "value": "Are you sure you want to remove " + "value": "Tem certeza que deseja remover " }, { "type": 1, @@ -1388,7 +1388,7 @@ "message.confirm-reset": [ { "type": 0, - "value": "Você tem certeza que deseja redefinir as estatísticas de " + "value": "Tem certeza que deseja redefinir " }, { "type": 1, @@ -1402,19 +1402,19 @@ "message.delete-team-warning": [ { "type": 0, - "value": "Deleting a team will also delete all team websites." + "value": "Excluir uma equipe também excluirá todos os sites da equipe." } ], "message.delete-website-warning": [ { "type": 0, - "value": "Todos os dados associados também serão eliminados." + "value": "Todos os dados do site serão excluídos." } ], "message.error": [ { "type": 0, - "value": "Ocorreu um erro." + "value": "Algo deu errado." } ], "message.event-log": [ @@ -1434,25 +1434,25 @@ "message.go-to-settings": [ { "type": 0, - "value": "Ir para as configurações" + "value": "Ir para configurações" } ], "message.incorrect-username-password": [ { "type": 0, - "value": "O nome de usuário e/ou senha está incorreto." + "value": "Nome de usuário e/ou senha incorretos." } ], "message.invalid-domain": [ { "type": 0, - "value": "Domínio inválido" + "value": "Domínio inválido. Não inclua http/https." } ], "message.min-password-length": [ { "type": 0, - "value": "Quantidade mínima de " + "value": "Tamanho mínimo de " }, { "type": 1, @@ -1480,7 +1480,7 @@ "message.no-data-available": [ { "type": 0, - "value": "Sem dados disponíveis." + "value": "Nenhum dado disponível." } ], "message.no-event-data": [ @@ -1492,43 +1492,43 @@ "message.no-match-password": [ { "type": 0, - "value": "As senhas não correspondem" + "value": "As senhas não coincidem." } ], "message.no-results-found": [ { "type": 0, - "value": "Nenhum resultado foi encontrado." + "value": "Nenhum resultado encontrado." } ], "message.no-team-websites": [ { "type": 0, - "value": "Este time não possui nenhum site." + "value": "Esta equipe não possui nenhum site." } ], "message.no-teams": [ { "type": 0, - "value": "Você não criou nenhum time." + "value": "Você não criou nenhuma equipe." } ], "message.no-users": [ { "type": 0, - "value": "Não há nenhum usuário." + "value": "Não há usuários." } ], "message.no-websites-configured": [ { "type": 0, - "value": "Nenhum site foi configurado ainda." + "value": "Você não possui nenhum site configurado." } ], "message.page-not-found": [ { "type": 0, - "value": "Página não encontrada." + "value": "Página não encontrada" } ], "message.reset-website": [ @@ -1548,39 +1548,31 @@ "message.reset-website-warning": [ { "type": 0, - "value": "Todas as estatísticas deste site serão removidas, mas seu código de rastreamento permanecerá intacto." + "value": "Todas as estatísticas deste site serão excluídas, mas suas configurações permanecerão intactas." } ], "message.saved": [ { "type": 0, - "value": "Salvo com sucesso." + "value": "Salvo." } ], "message.share-url": [ { "type": 0, - "value": "Este é o link público de compartilhamento para " - }, - { - "type": 1, - "value": "target" - }, - { - "type": 0, - "value": "." + "value": "As estatísticas do seu site estão publicamente disponíveis no seguinte URL:" } ], "message.team-already-member": [ { "type": 0, - "value": "Você já um membro do time." + "value": "Você já é um membro da equipe." } ], "message.team-not-found": [ { "type": 0, - "value": "Time não encontrado." + "value": "Equipe não encontrada." } ], "message.team-websites-info": [ @@ -1592,43 +1584,57 @@ "message.tracking-code": [ { "type": 0, - "value": "Código de rastreamento" + "value": "Para rastrear estatísticas para este site, coloque o código a seguir na seção " + }, + { + "children": [ + { + "type": 0, + "value": "..." + } + ], + "type": 8, + "value": "head" + }, + { + "type": 0, + "value": " do HTML." } ], "message.transfer-team-website-to-user": [ { "type": 0, - "value": "Transfer this website to your account?" + "value": "Transferir este website para a sua conta?" } ], "message.transfer-user-website-to-team": [ { "type": 0, - "value": "Select the team to transfer this website to." + "value": "Selecione a equipe para a qual deseja transferir este site." } ], "message.transfer-website": [ { "type": 0, - "value": "Transfer website ownership to your account or another team." + "value": "Transfira a propriedade do site para sua conta ou outra equipe." } ], "message.triggered-event": [ { "type": 0, - "value": "Triggered event" + "value": "Evento acionado" } ], "message.user-deleted": [ { "type": 0, - "value": "Usuário removido." + "value": "Usuário excluído." } ], "message.viewed-page": [ { "type": 0, - "value": "Viewed page" + "value": "Página visualizada" } ], "message.visitor-log": [ @@ -1654,7 +1660,7 @@ }, { "type": 1, - "value": "device" + "value": "os" }, { "type": 0, @@ -1662,13 +1668,13 @@ }, { "type": 1, - "value": "os" + "value": "device" } ], "message.visitors-dropped-off": [ { "type": 0, - "value": "Visitors dropped off" + "value": "Visitantes abandonaram o site" } ] } From 6060ff7be0587d5b4e573dd49bd21d4a96658841 Mon Sep 17 00:00:00 2001 From: Eddu Date: Thu, 9 May 2024 23:43:24 -0300 Subject: [PATCH 016/121] spelling corrections --- public/intl/messages/pt-BR.json | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/public/intl/messages/pt-BR.json b/public/intl/messages/pt-BR.json index cde65c38..c7cb8797 100644 --- a/public/intl/messages/pt-BR.json +++ b/public/intl/messages/pt-BR.json @@ -392,7 +392,7 @@ "label.event-data": [ { "type": 0, - "value": "Dados do evento" + "value": "Dados de eventos" } ], "label.events": [ @@ -470,13 +470,13 @@ "label.insights": [ { "type": 0, - "value": "Insights" + "value": "Compreensão" } ], "label.insights-description": [ { "type": 0, - "value": "Explore seus dados mais profundamente usando segmentos e filtros." + "value": "Explore seus dados mais profundamente usando campos e filtros." } ], "label.is": [ @@ -608,7 +608,7 @@ "label.logout": [ { "type": 0, - "value": "Logout" + "value": "Sair" } ], "label.manage": [ @@ -650,7 +650,7 @@ "label.more": [ { "type": 0, - "value": "Mais" + "value": "Ver todos" } ], "label.my-account": [ @@ -726,7 +726,7 @@ "label.os": [ { "type": 0, - "value": "SO" + "value": "Sistema operacional" } ], "label.overview": [ @@ -738,7 +738,7 @@ "label.owner": [ { "type": 0, - "value": "Proprietário" + "value": "Criado por" } ], "label.page-of": [ @@ -802,19 +802,19 @@ "label.queries": [ { "type": 0, - "value": "Consultas" + "value": "Parâmetros" } ], "label.query": [ { "type": 0, - "value": "Consulta" + "value": "Parâmetro" } ], "label.query-parameters": [ { "type": 0, - "value": "Parâmetros de consulta" + "value": "Chave-valor de parâmetro" } ], "label.realtime": [ @@ -826,13 +826,13 @@ "label.referrer": [ { "type": 0, - "value": "Referenciador" + "value": "Origem" } ], "label.referrers": [ { "type": 0, - "value": "Referenciadores" + "value": "Origens" } ], "label.refresh": [ @@ -892,7 +892,7 @@ "label.reset-website": [ { "type": 0, - "value": "Redefinir site" + "value": "Apagar dados do site" } ], "label.retention": [ @@ -916,7 +916,7 @@ "label.run-query": [ { "type": 0, - "value": "Executar consulta" + "value": "Realizar consulta" } ], "label.save": [ @@ -1030,7 +1030,7 @@ "label.team-owner": [ { "type": 0, - "value": "Proprietário da equipe" + "value": "Criador da equipe" } ], "label.team-view-only": [ @@ -1096,7 +1096,7 @@ "label.toggle-charts": [ { "type": 0, - "value": "Alternar gráficos" + "value": "Esconder gráficos" } ], "label.total": [ @@ -1560,7 +1560,7 @@ "message.share-url": [ { "type": 0, - "value": "As estatísticas do seu site estão publicamente disponíveis no seguinte URL:" + "value": "As estatísticas do seu site estão publicamente disponíveis na seguinte URL:" } ], "message.team-already-member": [ From 8b6b81cfeecab66e37bdbc25bfed4dc00481fa6e Mon Sep 17 00:00:00 2001 From: Eddu Date: Thu, 9 May 2024 23:47:25 -0300 Subject: [PATCH 017/121] small spelling corrections --- public/intl/messages/pt-BR.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/intl/messages/pt-BR.json b/public/intl/messages/pt-BR.json index c7cb8797..27a648d3 100644 --- a/public/intl/messages/pt-BR.json +++ b/public/intl/messages/pt-BR.json @@ -748,7 +748,7 @@ }, { "type": 1, - "value": "current" + "value": "átual" }, { "type": 0, @@ -1470,7 +1470,7 @@ }, { "type": 1, - "value": "version" + "value": "versão" }, { "type": 0, @@ -1644,7 +1644,7 @@ }, { "type": 1, - "value": "country" + "value": "país" }, { "type": 0, @@ -1652,7 +1652,7 @@ }, { "type": 1, - "value": "browser" + "value": "navegador" }, { "type": 0, @@ -1668,7 +1668,7 @@ }, { "type": 1, - "value": "device" + "value": "dispositivo" } ], "message.visitors-dropped-off": [ From 9f43ae67ef8fab7917847f9e4db793983798fee4 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 10 May 2024 11:15:23 -0700 Subject: [PATCH 018/121] Updated styling of goals report. --- .../[reportId]/ParameterList.module.css | 19 ++++- .../reports/[reportId]/ParameterList.tsx | 7 +- .../(main)/reports/create/ReportTemplates.tsx | 3 +- .../funnel/FunnelParameters.module.css | 4 - .../reports/funnel/FunnelParameters.tsx | 4 +- src/app/(main)/reports/goals/GoalsAddForm.tsx | 2 - .../reports/goals/GoalsChart.module.css | 78 ++++++++++--------- src/app/(main)/reports/goals/GoalsChart.tsx | 27 ++++--- .../reports/goals/GoalsParameters.module.css | 18 +---- .../(main)/reports/goals/GoalsParameters.tsx | 11 +-- src/app/(main)/reports/goals/GoalsReport.tsx | 4 +- src/assets/target.svg | 1 + 12 files changed, 93 insertions(+), 85 deletions(-) create mode 100644 src/assets/target.svg diff --git a/src/app/(main)/reports/[reportId]/ParameterList.module.css b/src/app/(main)/reports/[reportId]/ParameterList.module.css index fca087ca..75860b25 100644 --- a/src/app/(main)/reports/[reportId]/ParameterList.module.css +++ b/src/app/(main)/reports/[reportId]/ParameterList.module.css @@ -6,11 +6,24 @@ .item { display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; + gap: 12px; + width: 100%; + flex-wrap: nowrap; padding: 12px; border: 1px solid var(--base400); border-radius: var(--border-radius); box-shadow: 1px 1px 1px var(--base400); } + +.value { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap; + flex: 1; +} + +.icon, +.close { + height: 1.5rem; +} diff --git a/src/app/(main)/reports/[reportId]/ParameterList.tsx b/src/app/(main)/reports/[reportId]/ParameterList.tsx index f2ac988f..d4b6477b 100644 --- a/src/app/(main)/reports/[reportId]/ParameterList.tsx +++ b/src/app/(main)/reports/[reportId]/ParameterList.tsx @@ -24,18 +24,21 @@ export function ParameterList({ children }: ParameterListProps) { const Item = ({ children, className, + icon, onClick, onRemove, }: { children?: ReactNode; className?: string; + icon?: ReactNode; onClick?: () => void; onRemove?: () => void; }) => { return (
- {children} - + {icon && {icon}} +
{children}
+
diff --git a/src/app/(main)/reports/create/ReportTemplates.tsx b/src/app/(main)/reports/create/ReportTemplates.tsx index ac29f5c3..fdf5c5f5 100644 --- a/src/app/(main)/reports/create/ReportTemplates.tsx +++ b/src/app/(main)/reports/create/ReportTemplates.tsx @@ -5,6 +5,7 @@ import Funnel from 'assets/funnel.svg'; import Lightbulb from 'assets/lightbulb.svg'; import Magnet from 'assets/magnet.svg'; import Tag from 'assets/tag.svg'; +import Target from 'assets/target.svg'; import styles from './ReportTemplates.module.css'; import { useMessages, useTeamUrl } from 'components/hooks'; @@ -41,7 +42,7 @@ export function ReportTemplates({ showHeader = true }: { showHeader?: boolean }) title: formatMessage(labels.goals), description: formatMessage(labels.goalsDescription), url: renderTeamUrl('/reports/goals'), - icon: , + icon: , }, ]; diff --git a/src/app/(main)/reports/funnel/FunnelParameters.module.css b/src/app/(main)/reports/funnel/FunnelParameters.module.css index 219b9807..0f27d515 100644 --- a/src/app/(main)/reports/funnel/FunnelParameters.module.css +++ b/src/app/(main)/reports/funnel/FunnelParameters.module.css @@ -5,10 +5,6 @@ width: 100%; } -.type { - color: var(--base700); -} - .value { display: flex; align-self: center; diff --git a/src/app/(main)/reports/funnel/FunnelParameters.tsx b/src/app/(main)/reports/funnel/FunnelParameters.tsx index 7b1fb0c8..ef4ffbfb 100644 --- a/src/app/(main)/reports/funnel/FunnelParameters.tsx +++ b/src/app/(main)/reports/funnel/FunnelParameters.tsx @@ -93,12 +93,10 @@ export function FunnelParameters() { : } onRemove={() => handleRemoveStep(index)} >
-
- {step.type === 'url' ? : } -
{step.value}
diff --git a/src/app/(main)/reports/goals/GoalsAddForm.tsx b/src/app/(main)/reports/goals/GoalsAddForm.tsx index fdfa7aad..a8a77c58 100644 --- a/src/app/(main)/reports/goals/GoalsAddForm.tsx +++ b/src/app/(main)/reports/goals/GoalsAddForm.tsx @@ -76,11 +76,9 @@ export function GoalsAddForm({ className={styles.input} value={goal?.toString()} onChange={e => handleChange(e, setGoal)} - autoFocus={true} autoComplete="off" onKeyDown={handleKeyDown} /> - . diff --git a/src/app/(main)/reports/goals/GoalsChart.module.css b/src/app/(main)/reports/goals/GoalsChart.module.css index c9f158d2..799f5fdd 100644 --- a/src/app/(main)/reports/goals/GoalsChart.module.css +++ b/src/app/(main)/reports/goals/GoalsChart.module.css @@ -1,27 +1,15 @@ .chart { display: grid; + gap: 30px; } -.num { - display: flex; - align-items: center; - justify-content: center; - border-radius: 100%; - width: 50px; - height: 50px; - font-size: 16px; - font-weight: 700; - color: var(--base800); - background: var(--base100); - z-index: 1; +.goal { + padding-bottom: 40px; + border-bottom: 1px solid var(--base400); } -.step { - display: grid; - grid-template-columns: max-content 1fr; - column-gap: 30px; - position: relative; - padding-bottom: 60px; +.goal:last-child { + border: 0; } .card { @@ -36,28 +24,12 @@ gap: 20px; } -.bar { - display: flex; - align-items: center; - justify-content: flex-end; - background: var(--base900); - height: 30px; - border-radius: 5px; - overflow: hidden; - position: relative; -} - .label { color: var(--base600); font-weight: 700; text-transform: uppercase; } -.track { - background-color: var(--base100); - border-radius: 5px; -} - .item { font-size: 20px; color: var(--base900); @@ -73,7 +45,7 @@ text-transform: lowercase; } -.visitors { +.value { color: var(--base900); font-size: 24px; font-weight: 900; @@ -85,3 +57,39 @@ font-weight: 700; align-self: flex-end; } + +.total { + color: var(--base700); +} + +.bar { + display: flex; + align-items: center; + justify-content: flex-end; + background: var(--base900); + height: 10px; + border-radius: 5px; + overflow: hidden; + position: relative; +} + +.bar.level1 { + background: var(--red800); +} +.bar.level2 { + background: var(--orange200); +} +.bar.level3 { + background: var(--orange400); +} +.bar.level4 { + background: var(--orange600); +} +.bar.level5 { + background: var(--green600); +} + +.track { + background-color: var(--base100); + border-radius: 5px; +} diff --git a/src/app/(main)/reports/goals/GoalsChart.tsx b/src/app/(main)/reports/goals/GoalsChart.tsx index f20c4f9b..910f138c 100644 --- a/src/app/(main)/reports/goals/GoalsChart.tsx +++ b/src/app/(main)/reports/goals/GoalsChart.tsx @@ -14,9 +14,10 @@ export function GoalsChart({ className }: { className?: string; isLoading?: bool return (
{data?.map(({ type, value, goal, result }, index: number) => { + const percent = result > goal ? 100 : (result / goal) * 100; + return ( -
-
{index + 1}
+
@@ -25,20 +26,24 @@ export function GoalsChart({ className }: { className?: string; isLoading?: bool {value}
-
- {formatLongNumber(result)} - {formatMessage(labels.visitors)} -
-
- {formatLongNumber(goal)} - {formatMessage(labels.goal)} +
+ {formatLongNumber(result)} + / {formatLongNumber(goal)}
{((result / goal) * 100).toFixed(2)}%
goal ? 100 : (result / goal) * 100}%` }} + className={classNames( + classNames(styles.bar, { + [styles.level1]: percent <= 20, + [styles.level2]: percent > 20 && percent <= 40, + [styles.level3]: percent > 40 && percent <= 60, + [styles.level4]: percent > 60 && percent <= 80, + [styles.level5]: percent > 80, + }), + )} + style={{ width: `${percent}%` }} >
diff --git a/src/app/(main)/reports/goals/GoalsParameters.module.css b/src/app/(main)/reports/goals/GoalsParameters.module.css index 421433f0..fbe47b84 100644 --- a/src/app/(main)/reports/goals/GoalsParameters.module.css +++ b/src/app/(main)/reports/goals/GoalsParameters.module.css @@ -1,18 +1,7 @@ -.item { - display: flex; - align-items: center; - gap: 10px; - width: 100%; -} - -.type { - color: var(--base700); -} - .value { - display: flex; - align-self: center; - gap: 20px; + width: 100%; + margin-bottom: 8px; + font-weight: 600; } .goal { @@ -22,5 +11,4 @@ font-weight: 900; padding: 2px 8px; border-radius: 5px; - white-space: nowrap; } diff --git a/src/app/(main)/reports/goals/GoalsParameters.tsx b/src/app/(main)/reports/goals/GoalsParameters.tsx index b4743d2d..55955973 100644 --- a/src/app/(main)/reports/goals/GoalsParameters.tsx +++ b/src/app/(main)/reports/goals/GoalsParameters.tsx @@ -83,15 +83,12 @@ export function GoalsParameters() { return ( : } onRemove={() => handleRemoveGoals(index)} > -
-
- {goal.type === 'url' ? : } -
-
{goal.value}
-
{formatNumber(goal.goal)}
+
{goal.value}
+
+ {formatMessage(labels.goal)}: {formatNumber(goal.goal)}
diff --git a/src/app/(main)/reports/goals/GoalsReport.tsx b/src/app/(main)/reports/goals/GoalsReport.tsx index d6171c31..020d7d09 100644 --- a/src/app/(main)/reports/goals/GoalsReport.tsx +++ b/src/app/(main)/reports/goals/GoalsReport.tsx @@ -4,7 +4,7 @@ import Report from '../[reportId]/Report'; import ReportHeader from '../[reportId]/ReportHeader'; import ReportMenu from '../[reportId]/ReportMenu'; import ReportBody from '../[reportId]/ReportBody'; -import Goals from 'assets/funnel.svg'; +import Target from 'assets/target.svg'; import { REPORT_TYPES } from 'lib/constants'; const defaultParameters = { @@ -15,7 +15,7 @@ const defaultParameters = { export default function GoalsReport({ reportId }: { reportId?: string }) { return ( - } /> + } /> diff --git a/src/assets/target.svg b/src/assets/target.svg new file mode 100644 index 00000000..000f34c7 --- /dev/null +++ b/src/assets/target.svg @@ -0,0 +1 @@ + \ No newline at end of file From abd0913e9b66cd9f8fc9480d3d0f351950023d8d Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 10 May 2024 14:06:13 -0700 Subject: [PATCH 019/121] Updated goals chart. --- src/app/(main)/reports/goals/GoalsChart.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/app/(main)/reports/goals/GoalsChart.tsx b/src/app/(main)/reports/goals/GoalsChart.tsx index 910f138c..24760234 100644 --- a/src/app/(main)/reports/goals/GoalsChart.tsx +++ b/src/app/(main)/reports/goals/GoalsChart.tsx @@ -25,13 +25,6 @@ export function GoalsChart({ className }: { className?: string; isLoading?: bool {value}
-
-
- {formatLongNumber(result)} - / {formatLongNumber(goal)} -
-
{((result / goal) * 100).toFixed(2)}%
-
+
+
+ {formatLongNumber(result)} + / {formatLongNumber(goal)} +
+
{((result / goal) * 100).toFixed(2)}%
+
); From 0db6ecf243f96dc56b2a9f919e22ebc265b3a7a8 Mon Sep 17 00:00:00 2001 From: Brian Cao Date: Fri, 10 May 2024 23:15:56 -0700 Subject: [PATCH 020/121] fix usage get. --- src/pages/api/users/[userId]/usage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/api/users/[userId]/usage.ts b/src/pages/api/users/[userId]/usage.ts index 806b4128..66e92768 100644 --- a/src/pages/api/users/[userId]/usage.ts +++ b/src/pages/api/users/[userId]/usage.ts @@ -24,7 +24,7 @@ export interface UserUsageRequestResponse { const schema = { GET: yup.object().shape({ - id: yup.string().uuid().required(), + userId: yup.string().uuid().required(), startAt: yup.number().integer().required(), endAt: yup.number().integer().min(yup.ref('startAt')).required(), }), From ab39ae8511166c410d9aa26199ba0ba66b471363 Mon Sep 17 00:00:00 2001 From: Brian Cao Date: Fri, 10 May 2024 23:15:56 -0700 Subject: [PATCH 021/121] fix usage get. --- src/pages/api/users/[userId]/usage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/api/users/[userId]/usage.ts b/src/pages/api/users/[userId]/usage.ts index 806b4128..66e92768 100644 --- a/src/pages/api/users/[userId]/usage.ts +++ b/src/pages/api/users/[userId]/usage.ts @@ -24,7 +24,7 @@ export interface UserUsageRequestResponse { const schema = { GET: yup.object().shape({ - id: yup.string().uuid().required(), + userId: yup.string().uuid().required(), startAt: yup.number().integer().required(), endAt: yup.number().integer().min(yup.ref('startAt')).required(), }), From 30c1933718c54eccf0809598c785ab80c376da0e Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Sat, 11 May 2024 21:52:40 -0700 Subject: [PATCH 022/121] Updated handling of env vars. --- next.config.js | 14 +- src/app/(main)/layout.module.css | 12 - src/app/(main)/layout.tsx | 4 + .../websites/[websiteId]/ShareUrl.tsx | 13 +- .../websites/[websiteId]/TrackingCode.tsx | 6 +- .../websites/[websiteId]/WebsiteSettings.tsx | 6 +- src/app/login/LoginPage.tsx | 2 +- yarn.lock | 290 +++++++++++------- 8 files changed, 192 insertions(+), 155 deletions(-) diff --git a/next.config.js b/next.config.js index f8850c60..8a0c6569 100644 --- a/next.config.js +++ b/next.config.js @@ -4,17 +4,18 @@ const path = require('path'); const pkg = require('./package.json'); const basePath = process.env.BASE_PATH || ''; -const forceSSL = process.env.FORCE_SSL || ''; const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT || ''; -const defaultLocale = process.env.DEFAULT_LOCALE || ''; -const trackerScriptName = process.env.TRACKER_SCRIPT_NAME || ''; const cloudMode = process.env.CLOUD_MODE || ''; const cloudUrl = process.env.CLOUD_URL || ''; -const frameAncestors = process.env.ALLOWED_FRAME_URLS || ''; +const defaultLocale = process.env.DEFAULT_LOCALE || ''; const disableLogin = process.env.DISABLE_LOGIN || ''; const disableUI = process.env.DISABLE_UI || ''; -const hostURL = process.env.HOST_URL || ''; +const forceSSL = process.env.FORCE_SSL || ''; +const frameAncestors = process.env.ALLOWED_FRAME_URLS || ''; const privateMode = process.env.PRIVATE_MODE || ''; +const shareUrlHost = process.env.SHARE_HOST_URL || ''; +const trackerScriptHost = process.env.TRACKER_SCRIPT_HOST || ''; +const trackerScriptName = process.env.TRACKER_SCRIPT_NAME || ''; const contentSecurityPolicy = [ `default-src 'self'`, @@ -120,8 +121,9 @@ const config = { defaultLocale, disableLogin, disableUI, - hostURL, privateMode, + shareUrlHost, + trackerScriptHost, }, basePath, output: 'standalone', diff --git a/src/app/(main)/layout.module.css b/src/app/(main)/layout.module.css index 09b2eab7..58c1cacf 100644 --- a/src/app/(main)/layout.module.css +++ b/src/app/(main)/layout.module.css @@ -19,15 +19,3 @@ height: calc(100vh - 60px); overflow-y: auto; } - -.content { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - width: 100%; - max-width: 1320px; - margin: 0 auto; - padding: 0 20px; - min-height: calc(100vh - 60px); -} diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx index 0ecce22c..ba221990 100644 --- a/src/app/(main)/layout.tsx +++ b/src/app/(main)/layout.tsx @@ -5,6 +5,10 @@ import Page from 'components/layout/Page'; import styles from './layout.module.css'; export default function ({ children }) { + if (process.env.DISABLE_UI) { + return null; + } + return (
diff --git a/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx b/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx index 989f4def..ded2105d 100644 --- a/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/ShareUrl.tsx @@ -15,14 +15,7 @@ import { WebsiteContext } from 'app/(main)/websites/[websiteId]/WebsiteProvider' const generateId = () => getRandomChars(16); -export function ShareUrl({ - hostUrl, - onSave, -}: { - websiteId: string; - hostUrl?: string; - onSave?: () => void; -}) { +export function ShareUrl({ onSave }: { websiteId: string; onSave?: () => void }) { const website = useContext(WebsiteContext); const { domain, shareId } = website; const { formatMessage, labels, messages } = useMessages(); @@ -33,8 +26,8 @@ export function ShareUrl({ }); const { touch } = useModified(); - const url = `${hostUrl || process.env.hostUrl || window?.location.origin}${ - process.env.basePath + const url = `${process.env.shareUrlHost || window?.location.origin || ''}${ + process.env.basePath || '' }/share/${id}/${domain}`; const handleGenerate = () => { diff --git a/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx b/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx index 66222349..18672abf 100644 --- a/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/TrackingCode.tsx @@ -3,7 +3,7 @@ import { useMessages, useConfig } from 'components/hooks'; const SCRIPT_NAME = 'script.js'; -export function TrackingCode({ websiteId, hostUrl }: { websiteId: string; hostUrl?: string }) { +export function TrackingCode({ websiteId }: { websiteId: string }) { const { formatMessage, messages } = useMessages(); const config = useConfig(); @@ -12,8 +12,8 @@ export function TrackingCode({ websiteId, hostUrl }: { websiteId: string; hostUr const url = trackerScriptName?.startsWith('http') ? trackerScriptName - : `${hostUrl || process.env.hostUrl || window?.location.origin}${ - process.env.basePath + : `${process.env.trackerScriptHost || window?.location.origin || ''}${ + process.env.basePath || '' }/${trackerScriptName}`; const code = ``; diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx index 99f9faa1..1a92f1f1 100644 --- a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettings.tsx @@ -13,11 +13,9 @@ import WebsiteEditForm from './WebsiteEditForm'; export function WebsiteSettings({ websiteId, - hostUrl, openExternal = false, }: { websiteId: string; - hostUrl?: string; openExternal?: boolean; }) { const website = useContext(WebsiteContext); @@ -62,8 +60,8 @@ export function WebsiteSettings({ {formatMessage(labels.data)} {tab === 'details' && } - {tab === 'tracking' && } - {tab === 'share' && } + {tab === 'tracking' && } + {tab === 'share' && } {tab === 'data' && } ); diff --git a/src/app/login/LoginPage.tsx b/src/app/login/LoginPage.tsx index 28a3c024..8ea0b4e2 100644 --- a/src/app/login/LoginPage.tsx +++ b/src/app/login/LoginPage.tsx @@ -3,7 +3,7 @@ import LoginForm from './LoginForm'; import styles from './LoginPage.module.css'; export function LoginPage() { - if (process.env.loginDisabled) { + if (process.env.disableLogin) { return null; } diff --git a/yarn.lock b/yarn.lock index 5720f25d..c4efa409 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,9 +1127,9 @@ regenerator-runtime "^0.14.0" "@babel/runtime@^7.23.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" @@ -1668,17 +1668,17 @@ "@formatjs/ecma402-abstract" "1.4.0" tslib "^2.0.1" -"@formatjs/intl@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.10.1.tgz#75ae637070553bf7dfd213847ba8219f5ddae2b6" - integrity sha512-dsLG15U7xDi8yzKf4hcAWSsCaez3XrjTO2oaRHPyHtXLm1aEzYbDw6bClo/HMHu+iwS5GbDqT3DV+hYP2ylScg== +"@formatjs/intl@2.10.2": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.10.2.tgz#c074439ac2dbde4c2b3768b8108dfc3932b7fb30" + integrity sha512-raPGWr3JRv3neXV78SqPFrGC05fIbhhNzVghHNxFde27ls2KkXiMhtP7HBybjGpikVSjjhdhaZto+4p1vmm9bQ== dependencies: "@formatjs/ecma402-abstract" "1.18.2" "@formatjs/fast-memoize" "2.2.0" "@formatjs/icu-messageformat-parser" "2.7.6" "@formatjs/intl-displaynames" "6.6.6" "@formatjs/intl-listformat" "7.5.5" - intl-messageformat "10.5.11" + intl-messageformat "10.5.12" tslib "^2.4.0" "@formatjs/ts-transformer@3.9.4": @@ -2002,19 +2002,19 @@ integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== "@netlify/plugin-nextjs@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.1.0.tgz#12fc0f7815b62cf091ea6bc98bc9f43ab103411d" - integrity sha512-nurSK6pMi36fVbuwLEiPIzMC/N2Dn/tHqA+seoStwHvGewsrXAphrjJ+8wq7eSCe+BEHCtGlwC1mNOeuqVkfbg== + version "5.2.2" + resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.2.2.tgz#3c283d335001f9e0fbcb4db75557e5fe1660db72" + integrity sha512-jV/P7o8+v1XaEGb7wvFfkF1fSLggAxjg7WYoBPkD3R93bsI6xmCDKBcUJ/6g7lqECRXt4dGKApSFtGk/pUmAHw== "@next/env@14.1.4": version "14.1.4" resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== -"@next/eslint-plugin-next@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" - integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== +"@next/eslint-plugin-next@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz#287ad8620e7061ba01e8d3313d464db6d217b6df" + integrity sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw== dependencies: glob "10.3.10" @@ -2273,9 +2273,9 @@ picomatch "^2.3.1" "@rushstack/eslint-patch@^1.3.3": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" - integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== + version "1.10.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" + integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -2424,17 +2424,17 @@ dependencies: tslib "^2.4.0" -"@tanstack/query-core@5.29.0": - version "5.29.0" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.29.0.tgz#d0b3d12c07d5a47f42ab0c1ed4f317106f3d4b20" - integrity sha512-WgPTRs58hm9CMzEr5jpISe8HXa3qKQ8CxewdYZeVnA54JrPY9B1CZiwsCoLpLkf0dGRZq+LcX5OiJb0bEsOFww== +"@tanstack/query-core@5.35.5": + version "5.35.5" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.35.5.tgz#7b4100dc9cc7fee314b8a1bcbf502a236d43ffe3" + integrity sha512-OMWvlEqG01RfGj+XZb/piDzPp0eZkkHWSDHt2LvE/fd1zWburP/xwm0ghk6Iv8cuPlP+ACFkZviKXK0OVt6lhg== "@tanstack/react-query@^5.28.6": - version "5.29.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.29.0.tgz#42b3a2de4ed1d63666f0af04392a34b5e70d49c0" - integrity sha512-yxlhHB73jaBla6h5B6zPaGmQjokkzAhMHN4veotkPNiQ3Ac/mCxgABRZPsJJrgCTvhpcncBZcDBFxaR2B37vug== + version "5.35.5" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.35.5.tgz#d41a087d58f42418824fa04aaca00ba93c99075c" + integrity sha512-sppX7L+PVn5GBV3In6zzj0zcKfnZRKhXbX1MfIfKo1OjIq2GMaopvAFOP0x1bRYTUk2ikrdYcQYOozX7PWkb8A== dependencies: - "@tanstack/query-core" "5.29.0" + "@tanstack/query-core" "5.35.5" "@trysound/sax@0.2.0": version "0.2.0" @@ -2647,9 +2647,9 @@ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*", "@types/node@^20.9.0": - version "20.12.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.6.tgz#72d068870518d7da1d97b49db401e2d6a1805294" - integrity sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ== + version "20.12.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" + integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== dependencies: undici-types "~5.26.4" @@ -2674,9 +2674,9 @@ integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/react-dom@^18.2.17": - version "18.2.24" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" - integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg== + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" @@ -2698,9 +2698,9 @@ "@types/react" "*" "@types/react@*", "@types/react@16 || 17 || 18", "@types/react@^18.2.41": - version "18.2.75" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.75.tgz#45d18f384939306d35312def1bf532eb38a68562" - integrity sha512-+DNnF7yc5y0bHkBTiLKqXFe+L4B3nvOphiMY3tuA5X10esmjqk7smyBZzbGTy2vsiy/Bnzj8yFIBL8xhRacoOg== + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.1.tgz#fed43985caa834a2084d002e4771e15dfcbdbe8e" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -2773,7 +2773,18 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^6.7.3": +"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== + dependencies: + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^6.7.3": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== @@ -2800,6 +2811,14 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" +"@typescript-eslint/scope-manager@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== + dependencies: + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + "@typescript-eslint/type-utils@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" @@ -2820,6 +2839,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -2847,6 +2871,20 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== + dependencies: + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/utils@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" @@ -2890,6 +2928,14 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== + dependencies: + "@typescript-eslint/types" "7.2.0" + eslint-visitor-keys "^3.4.1" + "@umami/prisma-client@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@umami/prisma-client/-/prisma-client-0.14.0.tgz#8489f23e7d766fdecb94790246b0b77b9d65223b" @@ -4215,9 +4261,9 @@ cypress@*: yauzl "^2.10.0" cypress@^13.6.6: - version "13.7.2" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.2.tgz#61e841382abb20e0a9a063086ee0d850af3ef6bc" - integrity sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw== + version "13.9.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.9.0.tgz#b529cfa8f8c39ba163ed0501a25bb5b09c143652" + integrity sha512-atNjmYfHsvTuCaxTxLZr9xGoHz53LLui3266WWxXJHY7+N6OdwJdg/feEa3T+buez9dmUXHT1izCOklqG82uCQ== dependencies: "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" @@ -4400,9 +4446,9 @@ dateformat@^5.0.3: integrity sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA== dayjs@^1.10.4: - version "1.11.10" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + version "1.11.11" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" + integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== debounce@^1.2.1: version "1.2.1" @@ -4465,7 +4511,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4679,9 +4725,9 @@ end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + version "5.16.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" + integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4711,7 +4757,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -4776,13 +4822,13 @@ es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.3" es-errors "^1.3.0" es-set-tostringtag "^2.0.3" function-bind "^1.1.2" @@ -4881,13 +4927,13 @@ escape-string-regexp@^4.0.0: integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-next@^14.0.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" - integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== + version "14.2.3" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f" + integrity sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg== dependencies: - "@next/eslint-plugin-next" "14.1.4" + "@next/eslint-plugin-next" "14.2.3" "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0" eslint-import-resolver-node "^0.3.6" eslint-import-resolver-typescript "^3.5.2" eslint-plugin-import "^2.28.1" @@ -4943,9 +4989,9 @@ eslint-plugin-css-modules@^2.12.0: lodash "^4.17.2" eslint-plugin-cypress@^2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz#336afa7e8e27451afaf65aa359c9509e0a4f3a7b" - integrity sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w== + version "2.15.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.2.tgz#f22e12fad4c434edad7b298ef92bac8fa087ffa0" + integrity sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ== dependencies: globals "^13.20.0" @@ -5014,9 +5060,9 @@ eslint-plugin-promise@^6.1.1: integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2: version "7.34.1" @@ -5595,9 +5641,9 @@ get-symbol-description@^1.0.2: get-intrinsic "^1.2.4" get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + version "4.7.5" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== dependencies: resolve-pkg-maps "^1.0.0" @@ -5699,11 +5745,12 @@ globals@^13.19.0, globals@^13.20.0: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@10.0.1: version "10.0.1" @@ -6015,10 +6062,10 @@ intl-messageformat-parser@^5.3.7: dependencies: "@formatjs/intl-numberformat" "^5.5.2" -intl-messageformat@10.5.11: - version "10.5.11" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.11.tgz#95d6a3b0b303f924d5d8c3f8d3ad057d1dc73c64" - integrity sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg== +intl-messageformat@10.5.12: + version "10.5.12" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.12.tgz#a0c1a20da896b7a1f4ba1b59c8ba5d9943c29c3f" + integrity sha512-izl0uxhy/melhw8gP2r8pGiVieviZmM4v5Oqx3c1/R7g9cwER2smmGfSjcIsp8Y3Q53bfciL/gkxacJRx/dUvg== dependencies: "@formatjs/ecma402-abstract" "1.18.2" "@formatjs/fast-memoize" "2.2.0" @@ -6026,9 +6073,9 @@ intl-messageformat@10.5.11: tslib "^2.4.0" ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== is-array-buffer@^3.0.4: version "3.0.4" @@ -6320,9 +6367,9 @@ isarray@^2.0.5: integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isbot@^5.1.1: - version "5.1.4" - resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.4.tgz#3123c0fbf98ae867dc74ab95e47a809c13621a82" - integrity sha512-KuqD/TAG/qtgCDnO8Ab1v5rGRK3jl9hb+2KfJt+roIPE7R4Hiq99VinR0qrLGFptdUNIkClYjuXEpVTGkD9V/A== + version "5.1.6" + resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.6.tgz#579a48515e92a3e064da63a41709815d8e641a30" + integrity sha512-Phksj1A0dBP/M/5xeOx0zWemKlZRQvrbNzI19/HWso0uodiOcR8YYCXN60IdzwbKsGj5LnxPkMy6FuBtgckMNw== isexe@^2.0.0: version "2.0.0" @@ -7237,9 +7284,9 @@ lower-case@^2.0.2: tslib "^2.0.3" lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^5.1.1: version "5.1.1" @@ -7304,12 +7351,12 @@ mathml-tag-names@^2.1.3: integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== maxmind@^4.3.6: - version "4.3.18" - resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.18.tgz#ad83f38d718ca5395c5d722933a109b7cb009226" - integrity sha512-5b9utU7ZxcGYTBaO7hCF0FXyfw3IpankLn+FnLW4RZS1zi97RBeSdfXJFJlk5UxNsMiFZlsdMT3lzvD+bD8MLQ== + version "4.3.19" + resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.19.tgz#da97391185b41373961685419f0f12dfd7b97ff9" + integrity sha512-Bu/VEN7ZWAOCjifdZaXJQuN6/yO7+OK35pnJsqmz8sOndK3KQFvJoY+6HX09/MmLLqtCfa+sMK0iaQOaTejGNA== dependencies: mmdb-lib "2.1.0" - tiny-lru "11.2.5" + tiny-lru "11.2.6" md5@^2.3.0: version "2.3.0" @@ -7480,9 +7527,9 @@ minipass@^5.0.0: integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + version "7.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" + integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== minizlib@^2.1.1: version "2.1.2" @@ -7916,9 +7963,9 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.10.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.0.tgz#332d64e9726bf667fb348e5a1c71005c09ad741a" + integrity sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -8737,12 +8784,12 @@ react-beautiful-dnd@^13.1.0: use-memo-one "^1.1.1" react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-error-boundary@^4.0.4: version "4.0.13" @@ -8757,19 +8804,19 @@ react-hook-form@^7.34.2: integrity sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg== react-intl@^6.5.5: - version "6.6.5" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.6.5.tgz#3dee5c4a9f866aebc8384a540a6d132a3fc694eb" - integrity sha512-OErDPbGqus0QKVj77MGCC9Plbnys3CDQrq6Lw41c60pmeTdn41AhoS1SIzXG6SUlyF7qNN2AVqfrrIvHUgSyLQ== + version "6.6.6" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.6.6.tgz#67979f790263c5ebd95b6ea581110eea3e7b550f" + integrity sha512-dKXQNUrhZTlCp8uelYW8PHiM4saNKyLmHCfsJYWK0N/kZ/Ien35wjPHB8x9yQcTJbeN/hBOmb4x16iKUrdL9MA== dependencies: "@formatjs/ecma402-abstract" "1.18.2" "@formatjs/icu-messageformat-parser" "2.7.6" - "@formatjs/intl" "2.10.1" + "@formatjs/intl" "2.10.2" "@formatjs/intl-displaynames" "6.6.6" "@formatjs/intl-listformat" "7.5.5" "@types/hoist-non-react-statics" "^3.3.1" "@types/react" "16 || 17 || 18" hoist-non-react-statics "^3.3.2" - intl-messageformat "10.5.11" + intl-messageformat "10.5.12" tslib "^2.4.0" react-is@^16.13.1, react-is@^16.7.0: @@ -8825,9 +8872,9 @@ react-window@^1.8.6: memoize-one ">=3.1.1 <6" react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -9243,10 +9290,10 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -9279,13 +9326,18 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.4, semver@^7.3.7: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" +semver@^7.5.3, semver@^7.5.4: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -9914,10 +9966,10 @@ tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== -tiny-lru@11.2.5: - version "11.2.5" - resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-11.2.5.tgz#b138b99022aa26c567fa51a8dbf9e3e2959b2b30" - integrity sha512-JpqM0K33lG6iQGKiigcwuURAKZlq6rHXfrgeL4/I8/REoyJTGU+tEMszvT/oTRVHG2OiylhGDjqPp1jWMlr3bw== +tiny-lru@11.2.6: + version "11.2.6" + resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-11.2.6.tgz#86a4fd0ad615eac1639adf92010e8b944e209fdb" + integrity sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA== tmp@~0.2.1: version "0.2.3" @@ -9954,9 +10006,9 @@ toposort@^2.0.2: integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== tough-cookie@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -10149,9 +10201,9 @@ typescript@^4.0, typescript@^4.5: integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^5.4.3: - version "5.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" - integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== unbox-primitive@^1.0.2: version "1.0.2" From b911fecd8b73162bae1699ba0cb0064f0cbf7c54 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Sat, 11 May 2024 22:03:41 -0700 Subject: [PATCH 023/121] Updated packages. --- package.json | 8 +- yarn.lock | 216 ++++++++++++++++++++++++++------------------------- 2 files changed, 115 insertions(+), 109 deletions(-) diff --git a/package.json b/package.json index 3d5b74ae..be5bb5ac 100644 --- a/package.json +++ b/package.json @@ -64,9 +64,9 @@ ".next/cache" ], "dependencies": { - "@clickhouse/client": "^0.2.2", + "@clickhouse/client": "^1.0.1", "@fontsource/inter": "^4.5.15", - "@prisma/client": "5.12.1", + "@prisma/client": "5.13.0", "@prisma/extension-read-replicas": "^0.3.0", "@react-spring/web": "^9.7.3", "@tanstack/react-query": "^5.28.6", @@ -98,11 +98,11 @@ "maxmind": "^4.3.6", "md5": "^2.3.0", "moment-timezone": "^0.5.35", - "next": "14.1.4", + "next": "14.2.3", "next-basics": "^0.39.0", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", - "prisma": "5.12.1", + "prisma": "5.13.0", "react": "^18.2.0", "react-basics": "^0.123.0", "react-beautiful-dnd": "^13.1.0", diff --git a/yarn.lock b/yarn.lock index c4efa409..80b8e454 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1206,17 +1206,17 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@clickhouse/client-common@0.2.10": - version "0.2.10" - resolved "https://registry.yarnpkg.com/@clickhouse/client-common/-/client-common-0.2.10.tgz#62f454d2cc2ee27a325034a2cca47c6f5c90d22e" - integrity sha512-BvTY0IXS96y9RUeNCpKL4HUzHmY80L0lDcGN0lmUD6zjOqYMn78+xyHYJ/AIAX7JQsc+/KwFt2soZutQTKxoGQ== +"@clickhouse/client-common@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@clickhouse/client-common/-/client-common-1.0.1.tgz#c7dde5eafaad8189649373ecc23354c7a32847b3" + integrity sha512-3L6e0foP6VOktScoi6XWMjJyOpKCWgLUYgPVxP2c7gm6Kotq+iRmmmXtXTSg7B7uozcLZycTtPfIw2d80SYsYw== -"@clickhouse/client@^0.2.2": - version "0.2.10" - resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-0.2.10.tgz#519561f3a4fff837bb606c52abfe74e5e7e9abb3" - integrity sha512-ZwBgzjEAFN/ogS0ym5KHVbR7Hx/oYCX01qGp2baEyfN2HM73kf/7Vp3GvMHWRy+zUXISONEtFv7UTViOXnmFrg== +"@clickhouse/client@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-1.0.1.tgz#364db28d9ef9beaf19104f962c2b06090cb10468" + integrity sha512-fluUNnE2R7COJ6rn6DorYfi4D+AQn3t2qeBtEq37bQV3pD4EbKrBfKAwJ13e1lmMWdQ2B9bJUTMqGsRIDdWhJw== dependencies: - "@clickhouse/client-common" "0.2.10" + "@clickhouse/client-common" "1.0.1" "@colors/colors@1.5.0": version "1.5.0" @@ -2006,10 +2006,10 @@ resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.2.2.tgz#3c283d335001f9e0fbcb4db75557e5fe1660db72" integrity sha512-jV/P7o8+v1XaEGb7wvFfkF1fSLggAxjg7WYoBPkD3R93bsI6xmCDKBcUJ/6g7lqECRXt4dGKApSFtGk/pUmAHw== -"@next/env@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" - integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== "@next/eslint-plugin-next@14.2.3": version "14.2.3" @@ -2018,50 +2018,50 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" - integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== -"@next/swc-darwin-x64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" - integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== +"@next/swc-darwin-x64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" + integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== -"@next/swc-linux-arm64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" - integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== +"@next/swc-linux-arm64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" + integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== -"@next/swc-linux-arm64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" - integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== +"@next/swc-linux-arm64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" + integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== -"@next/swc-linux-x64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" - integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== +"@next/swc-linux-x64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" + integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== -"@next/swc-linux-x64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" - integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== +"@next/swc-linux-x64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" + integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== -"@next/swc-win32-arm64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" - integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== +"@next/swc-win32-arm64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" + integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== -"@next/swc-win32-ia32-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" - integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== +"@next/swc-win32-ia32-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" + integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== -"@next/swc-win32-x64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" - integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== +"@next/swc-win32-x64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2089,51 +2089,51 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@prisma/client@5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.12.1.tgz#c26a674fea76754b3a9e8b90a11e617f90212f76" - integrity sha512-6/JnizEdlSBxDIdiLbrBdMW5NqDxOmhXAJaNXiPpgzAPr/nLZResT6MMpbOHLo5yAbQ1Vv5UU8PTPRzb0WIxdA== +"@prisma/client@5.13.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.13.0.tgz#b9f1d0983d714e982675201d8222a9ecb4bdad4a" + integrity sha512-uYdfpPncbZ/syJyiYBwGZS8Gt1PTNoErNYMuqHDa2r30rNSFtgTA/LXsSk55R7pdRTMi5pHkeP9B14K6nHmwkg== -"@prisma/debug@5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.12.1.tgz#007c8ad2e466d565bcd0671b8846c27f8700c722" - integrity sha512-kd/wNsR0klrv79o1ITsbWxYyh4QWuBidvxsXSParPsYSu0ircUmNk3q4ojsgNc3/81b0ozg76iastOG43tbf8A== +"@prisma/debug@5.13.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.13.0.tgz#d88b0f6fafa0c216e20e284ed9fc30f1cbe45786" + integrity sha512-699iqlEvzyCj9ETrXhs8o8wQc/eVW+FigSsHpiskSFydhjVuwTJEfj/nIYqTaWFYuxiWQRfm3r01meuW97SZaQ== -"@prisma/engines-version@5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab": - version "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab.tgz#c78d099a3fe86d446db7442e64e56987e39e7f32" - integrity sha512-6yvO8s80Tym61aB4QNtYZfWVmE3pwqe807jEtzm8C5VDe7nw8O1FGX3TXUaXmWV0fQTIAfRbeL2Gwrndabp/0g== +"@prisma/engines-version@5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b": + version "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b.tgz#a72a4fb83ba1fd01ad45f795aa55168f60d34723" + integrity sha512-AyUuhahTINGn8auyqYdmxsN+qn0mw3eg+uhkp8zwknXYIqoT3bChG4RqNY/nfDkPvzWAPBa9mrDyBeOnWSgO6A== -"@prisma/engines@5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.12.1.tgz#a50649427d627a9af962a188a84c65d61c6e2b3f" - integrity sha512-HQDdglLw2bZR/TXD2Y+YfDMvi5Q8H+acbswqOsWyq9pPjBLYJ6gzM+ptlTU/AV6tl0XSZLU1/7F4qaWa8bqpJA== +"@prisma/engines@5.13.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.13.0.tgz#8994ebf7b4e35aee7746a8465ec22738379bcab6" + integrity sha512-hIFLm4H1boj6CBZx55P4xKby9jgDTeDG0Jj3iXtwaaHmlD5JmiDkZhh8+DYWkTGchu+rRF36AVROLnk0oaqhHw== dependencies: - "@prisma/debug" "5.12.1" - "@prisma/engines-version" "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab" - "@prisma/fetch-engine" "5.12.1" - "@prisma/get-platform" "5.12.1" + "@prisma/debug" "5.13.0" + "@prisma/engines-version" "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b" + "@prisma/fetch-engine" "5.13.0" + "@prisma/get-platform" "5.13.0" "@prisma/extension-read-replicas@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@prisma/extension-read-replicas/-/extension-read-replicas-0.3.0.tgz#2842a7c928f957c1dd58a6256104797596d43426" integrity sha512-F9+rSmYday6GT2qjhJtkZcBOpLO5LtpvFcMGqrBDHf+78LEdSuxfFjOxYlNuqk4B+th62yxpbhfpmB9/Mca14Q== -"@prisma/fetch-engine@5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.12.1.tgz#c38e9fa17fdc535b4c83cbb7645569ad0a511fa9" - integrity sha512-qSs3KcX1HKcea1A+hlJVK/ljj0PNIUHDxAayGMvgJBqmaN32P9tCidlKz1EGv6WoRFICYnk3Dd/YFLBwnFIozA== +"@prisma/fetch-engine@5.13.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.13.0.tgz#9b6945c7b38bb59e840f8905b20ea7a3d059ca55" + integrity sha512-Yh4W+t6YKyqgcSEB3odBXt7QyVSm0OQlBSldQF2SNXtmOgMX8D7PF/fvH6E6qBCpjB/yeJLy/FfwfFijoHI6sA== dependencies: - "@prisma/debug" "5.12.1" - "@prisma/engines-version" "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab" - "@prisma/get-platform" "5.12.1" + "@prisma/debug" "5.13.0" + "@prisma/engines-version" "5.13.0-23.b9a39a7ee606c28e3455d0fd60e78c3ba82b1a2b" + "@prisma/get-platform" "5.13.0" -"@prisma/get-platform@5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.12.1.tgz#33f427f6d744dee62a9e06858889691d78b50804" - integrity sha512-pgIR+pSvhYHiUcqXVEZS31NrFOTENC9yFUdEAcx7cdQBoZPmHVjtjN4Ss6NzVDMYPrKJJ51U14EhEoeuBlMioQ== +"@prisma/get-platform@5.13.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.13.0.tgz#99ef909a52b9d79b64d72d2d3d8210c4892b6572" + integrity sha512-B/WrQwYTzwr7qCLifQzYOmQhZcFmIFhR81xC45gweInSUn2hTEbfKUPd2keAog+y5WI5xLAFNJ3wkXplvSVkSw== dependencies: - "@prisma/debug" "5.12.1" + "@prisma/debug" "5.13.0" "@react-spring/animated@~9.7.3": version "9.7.3" @@ -2417,11 +2417,17 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: + "@swc/counter" "^0.1.3" tslib "^2.4.0" "@tanstack/query-core@5.35.5": @@ -7595,28 +7601,28 @@ next-basics@^0.39.0: jsonwebtoken "^9.0.0" pure-rand "^6.0.2" -next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" - integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== +next@14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: - "@next/env" "14.1.4" - "@swc/helpers" "0.5.2" + "@next/env" "14.2.3" + "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.1.4" - "@next/swc-darwin-x64" "14.1.4" - "@next/swc-linux-arm64-gnu" "14.1.4" - "@next/swc-linux-arm64-musl" "14.1.4" - "@next/swc-linux-x64-gnu" "14.1.4" - "@next/swc-linux-x64-musl" "14.1.4" - "@next/swc-win32-arm64-msvc" "14.1.4" - "@next/swc-win32-ia32-msvc" "14.1.4" - "@next/swc-win32-x64-msvc" "14.1.4" + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" nice-try@^1.0.4: version "1.0.5" @@ -8653,12 +8659,12 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" -prisma@5.12.1: - version "5.12.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.12.1.tgz#db4596253bb066afc9f08744642f200a398d8d51" - integrity sha512-SkMnb6wyIxTv9ACqiHBI2u9gD6y98qXRoCoLEnZsF6yee5Qg828G+ARrESN+lQHdw4maSZFFSBPPDpvSiVTo0Q== +prisma@5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.13.0.tgz#1f06e20ccfb6038ad68869e6eacd3b346f9d0851" + integrity sha512-kGtcJaElNRAdAGsCNykFSZ7dBKpL14Cbs+VaQ8cECxQlRPDjBlMHNFYeYt0SKovAVy2Y65JXQwB3A5+zIQwnTg== dependencies: - "@prisma/engines" "5.12.1" + "@prisma/engines" "5.13.0" process@^0.11.10: version "0.11.10" From 98a0a83ccf928d31ce9c49303a91177e93861b4f Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Sun, 12 May 2024 23:15:49 -0700 Subject: [PATCH 024/121] Updated handling of env vars. --- next.config.js | 26 +++++++++---------- src/app/(main)/App.tsx | 2 +- src/app/(main)/console/TestConsole.tsx | 2 +- .../realtime/RealtimeCountries.tsx | 2 +- src/components/hooks/useCountryNames.ts | 2 +- src/components/hooks/useLanguageNames.ts | 2 +- src/components/hooks/useLocale.ts | 4 ++- src/components/metrics/BrowsersTable.tsx | 2 +- src/components/metrics/CitiesTable.tsx | 2 +- src/components/metrics/CountriesTable.tsx | 2 +- src/components/metrics/DevicesTable.tsx | 4 ++- src/components/metrics/RegionsTable.tsx | 2 +- src/components/metrics/WorldMap.tsx | 2 +- 13 files changed, 29 insertions(+), 25 deletions(-) diff --git a/next.config.js b/next.config.js index 8a0c6569..92b66943 100644 --- a/next.config.js +++ b/next.config.js @@ -3,19 +3,19 @@ require('dotenv').config(); const path = require('path'); const pkg = require('./package.json'); -const basePath = process.env.BASE_PATH || ''; -const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT || ''; -const cloudMode = process.env.CLOUD_MODE || ''; -const cloudUrl = process.env.CLOUD_URL || ''; -const defaultLocale = process.env.DEFAULT_LOCALE || ''; -const disableLogin = process.env.DISABLE_LOGIN || ''; -const disableUI = process.env.DISABLE_UI || ''; -const forceSSL = process.env.FORCE_SSL || ''; -const frameAncestors = process.env.ALLOWED_FRAME_URLS || ''; -const privateMode = process.env.PRIVATE_MODE || ''; -const shareUrlHost = process.env.SHARE_HOST_URL || ''; -const trackerScriptHost = process.env.TRACKER_SCRIPT_HOST || ''; -const trackerScriptName = process.env.TRACKER_SCRIPT_NAME || ''; +const basePath = process.env.BASE_PATH; +const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT; +const cloudMode = process.env.CLOUD_MODE; +const cloudUrl = process.env.CLOUD_URL; +const defaultLocale = process.env.DEFAULT_LOCALE; +const disableLogin = process.env.DISABLE_LOGIN; +const disableUI = process.env.DISABLE_UI; +const forceSSL = process.env.FORCE_SSL; +const frameAncestors = process.env.ALLOWED_FRAME_URLS; +const privateMode = process.env.PRIVATE_MODE; +const shareUrlHost = process.env.SHARE_URL_HOST; +const trackerScriptHost = process.env.TRACKER_SCRIPT_HOST; +const trackerScriptName = process.env.TRACKER_SCRIPT_NAME; const contentSecurityPolicy = [ `default-src 'self'`, diff --git a/src/app/(main)/App.tsx b/src/app/(main)/App.tsx index 406c2f16..efb38043 100644 --- a/src/app/(main)/App.tsx +++ b/src/app/(main)/App.tsx @@ -27,7 +27,7 @@ export function App({ children }) { {children} {process.env.NODE_ENV === 'production' && !pathname.includes('/share/') && ( -