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',
destination: '/settings/preferences',
permanent: true,
permanent: false,
},
{
source: '/teams/:id',
destination: '/teams/:id/websites',
permanent: true,
permanent: false,
},
{
source: '/teams/:id/settings',
destination: '/teams/:id/settings/preferences',
permanent: true,
permanent: false,
},
{
source: '/admin',
destination: '/admin/users',
permanent: true,
permanent: false,
},
];

View file

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

View file

@ -25,7 +25,7 @@ export function WebsiteMenu({ websiteId }: { websiteId: string }) {
if (id === 'compare') {
router.push(updateParams({ compare: 'prev' }));
} 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 = () => {
touch('websites');
onSave?.();
router.push(renderUrl(`/settings/websites`));
router.push(renderUrl(`/websites`));
};
const handleReset = async () => {

View file

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

View file

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

View file

@ -24,7 +24,7 @@ export function SettingsButton() {
const handleAction = (id: Key) => {
if (id === 'settings') {
if (cloudMode) {
window.location.href = `${cloudUrl}/dashboard`;
window.location.href = `${cloudUrl}/settings`;
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]/TeamMemberEditForm';
export * from '@/app/(main)/teams/[teamId]/TeamMemberRemoveButton';

View file

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