Compare commits

...

7 commits

Author SHA1 Message Date
Mike Cao
1c7f9da320 Updated redirect config.
Some checks are pending
Node.js CI / build (postgresql, 18.18) (push) Waiting to run
2025-09-17 22:41:54 -07:00
Mike Cao
a84b890b23 Merge remote-tracking branch 'origin/dev' into dev 2025-09-17 22:04:24 -07:00
Mike Cao
0ae5c28da7 Export preference components. Updates for cloud. 2025-09-17 22:03:58 -07:00
Mike Cao
23838c57fb Merge branch 'dev' of https://github.com/umami-software/umami into dev 2025-09-17 08:38:19 -07:00
Mike Cao
3acb34d599 Merge branch 'master' into dev 2025-09-16 22:45:10 -07:00
Mike Cao
39c99997ce
Merge pull request #3608 from fauzora/fix/tracker-configuration
Some checks are pending
Node.js CI / build (mysql, 18.18) (push) Waiting to run
Node.js CI / build (postgresql, 18.18) (push) Waiting to run
fix(hash): improve URL normalization and handling in tracking functions
2025-09-16 22:44:51 -07:00
Chairil Fauzi Firmansyah
c5298d5d45 fix(hash): improve URL normalization and handling in tracking functions 2025-09-04 18:00:28 +07:00
9 changed files with 34 additions and 20 deletions

View file

@ -117,22 +117,22 @@ const redirects = [
{ {
source: '/settings', source: '/settings',
destination: '/settings/preferences', destination: '/settings/preferences',
permanent: true, permanent: false,
}, },
{ {
source: '/teams/:id', source: '/teams/:id',
destination: '/teams/:id/websites', destination: '/teams/:id/websites',
permanent: true, permanent: false,
}, },
{ {
source: '/teams/:id/settings', source: '/teams/:id/settings',
destination: '/teams/:id/settings/preferences', destination: '/teams/:id/settings/preferences',
permanent: true, permanent: false,
}, },
{ {
source: '/admin', source: '/admin',
destination: '/admin/users', destination: '/admin/users',
permanent: true, permanent: false,
}, },
]; ];

View file

@ -1,6 +1,6 @@
{ {
"name": "@umami/components", "name": "@umami/components",
"version": "0.123.0", "version": "0.125.0",
"description": "Umami React components.", "description": "Umami React components.",
"author": "Mike Cao <mike@mikecao.com>", "author": "Mike Cao <mike@mikecao.com>",
"license": "MIT", "license": "MIT",

View file

@ -25,7 +25,7 @@ export function WebsiteMenu({ websiteId }: { websiteId: string }) {
if (id === 'compare') { if (id === 'compare') {
router.push(updateParams({ compare: 'prev' })); router.push(updateParams({ compare: 'prev' }));
} else if (id === 'edit') { } else if (id === 'edit') {
router.push(renderUrl(`/settings/websites/${websiteId}`)); router.push(renderUrl(`/websites/${websiteId}`));
} }
}; };

View file

@ -39,7 +39,7 @@ export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?:
const handleSave = () => { const handleSave = () => {
touch('websites'); touch('websites');
onSave?.(); onSave?.();
router.push(renderUrl(`/settings/websites`)); router.push(renderUrl(`/websites`));
}; };
const handleReset = async () => { const handleReset = async () => {

View file

@ -2,12 +2,12 @@ import { Row, Column, Text } from '@umami/react-zen';
export function ActionForm({ label, description, children }) { export function ActionForm({ label, description, children }) {
return ( return (
<Row padding="6" border borderRadius="3" justifyContent="space-between" shadow="2"> <Row alignItems="center" justifyContent="space-between" gap>
<Column gap> <Column gap="2">
<Text weight="bold">{label}</Text> <Text weight="bold">{label}</Text>
<Text>{description}</Text> <Text color="muted">{description}</Text>
</Column> </Column>
<Row gap="3" alignItems="center"> <Row alignItems="center" gap>
{children} {children}
</Row> </Row>
</Row> </Row>

View file

@ -8,7 +8,7 @@ export function useUserTeamsQuery(userId: string) {
return useQuery({ return useQuery({
queryKey: ['teams', { userId, modified }], queryKey: ['teams', { userId, modified }],
queryFn: () => { queryFn: () => {
return get(`/users/${userId}/teams`, { userId }); return get(`/users/${userId}/teams`);
}, },
enabled: !!userId, enabled: !!userId,
}); });

View file

@ -24,7 +24,7 @@ export function SettingsButton() {
const handleAction = (id: Key) => { const handleAction = (id: Key) => {
if (id === 'settings') { if (id === 'settings') {
if (cloudMode) { if (cloudMode) {
window.location.href = `${cloudUrl}/dashboard`; window.location.href = `${cloudUrl}/settings`;
return; return;
} }
} }

View file

@ -1,3 +1,8 @@
export * from '@/app/(main)/settings/preferences/LanguageSetting';
export * from '@/app/(main)/settings/preferences/PreferenceSettings';
export * from '@/app/(main)/settings/preferences/PreferencesPage';
export * from '@/app/(main)/settings/preferences/ThemeSetting';
export * from '@/app/(main)/teams/[teamId]/TeamMemberEditButton'; export * from '@/app/(main)/teams/[teamId]/TeamMemberEditButton';
export * from '@/app/(main)/teams/[teamId]/TeamMemberEditForm'; export * from '@/app/(main)/teams/[teamId]/TeamMemberEditForm';
export * from '@/app/(main)/teams/[teamId]/TeamMemberRemoveButton'; export * from '@/app/(main)/teams/[teamId]/TeamMemberRemoveButton';

View file

@ -38,6 +38,18 @@
/* Helper functions */ /* Helper functions */
const normalize = raw => {
if (!raw) return raw;
try {
const u = new URL(raw, location.href);
if (excludeSearch) u.search = '';
if (excludeHash) u.hash = '';
return u.toString();
} catch (e) {
return raw;
}
};
const getPayload = () => ({ const getPayload = () => ({
website, website,
screen, screen,
@ -61,11 +73,7 @@
if (!url) return; if (!url) return;
currentRef = currentUrl; currentRef = currentUrl;
currentUrl = new URL(url, location.href); currentUrl = normalize(new URL(url, location.href).toString());
if (excludeSearch) currentUrl.search = '';
if (excludeHash) currentUrl.hash = '';
currentUrl = currentUrl.toString();
if (currentUrl !== currentRef) { if (currentUrl !== currentRef) {
setTimeout(track, delayDuration); setTimeout(track, delayDuration);
@ -211,8 +219,9 @@
}; };
} }
let currentUrl = href; let currentUrl = normalize(href);
let currentRef = referrer.startsWith(origin) ? '' : referrer; let currentRef = normalize(referrer.startsWith(origin) ? '' : referrer);
let initialized = false; let initialized = false;
let disabled = false; let disabled = false;
let cache; let cache;