@@ -51,11 +61,12 @@ export default function AccountSettings() {
},
{
key: 'is_admin',
- label:
,
+ label:
,
className: 'col-6 col-md-4',
render: Checkmark,
},
{
+ key: 'actions',
className: classNames(styles.buttons, 'col-12 col-md-4 pt-2 pt-md-0'),
render: Buttons,
},
diff --git a/lang/de-DE.json b/lang/de-DE.json
index e0186442..cf801de0 100644
--- a/lang/de-DE.json
+++ b/lang/de-DE.json
@@ -38,6 +38,9 @@
"button.view-details": {
"defaultMessage": "Details anzeigen"
},
+ "button.websites": {
+ "defaultMessage": "Webseiten"
+ },
"footer.powered-by": {
"defaultMessage": "Powered by"
},
diff --git a/lang/en.json b/lang/en.json
index bcc7bcb4..8c4f31cb 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -38,6 +38,9 @@
"button.view-details": {
"defaultMessage": "View details"
},
+ "button.websites": {
+ "defaultMessage": "Websites"
+ },
"footer.powered-by": {
"defaultMessage": "Powered by"
},
@@ -128,6 +131,9 @@
"message.no-data-available": {
"defaultMessage": "No data available."
},
+ "message.page-not-found": {
+ "defaultMessage": "Page not found"
+ },
"message.save-success": {
"defaultMessage": "Saved successfully."
},
diff --git a/lang/nl-NL.json b/lang/nl-NL.json
index 8353e938..9f7e1914 100644
--- a/lang/nl-NL.json
+++ b/lang/nl-NL.json
@@ -38,6 +38,9 @@
"button.view-details": {
"defaultMessage": "Meer details"
},
+ "button.websites": {
+ "defaultMessage": "Websites"
+ },
"footer.powered-by": {
"defaultMessage": "mogelijk gemaakt door"
},
diff --git a/lang/ru-RU.json b/lang/ru-RU.json
index 6b5cb77a..6d59098f 100644
--- a/lang/ru-RU.json
+++ b/lang/ru-RU.json
@@ -38,6 +38,9 @@
"button.view-details": {
"defaultMessage": "Посмотреть детали"
},
+ "button.websites": {
+ "defaultMessage": "Сайты"
+ },
"footer.powered-by": {
"defaultMessage": "на движке"
},
diff --git a/lang/tr-TR.json b/lang/tr-TR.json
index cdeed558..25e39cf7 100644
--- a/lang/tr-TR.json
+++ b/lang/tr-TR.json
@@ -38,6 +38,9 @@
"button.view-details": {
"defaultMessage": "Detayı incele"
},
+ "button.websites": {
+ "defaultMessage": "Web siteleri"
+ },
"footer.powered-by": {
"defaultMessage": "Sağlayıcı:"
},
diff --git a/lang/zh-CN.json b/lang/zh-CN.json
index 7bea19ca..275df77c 100644
--- a/lang/zh-CN.json
+++ b/lang/zh-CN.json
@@ -38,6 +38,9 @@
"button.view-details": {
"defaultMessage": "查看更多"
},
+ "button.websites": {
+ "defaultMessage": "网站"
+ },
"footer.powered-by": {
"defaultMessage": "运行"
},
diff --git a/package.json b/package.json
index eb83f1c2..4565859e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "0.28.0",
+ "version": "0.29.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao
",
"license": "MIT",
diff --git a/pages/404.js b/pages/404.js
index 9cc200b5..4c85b10a 100644
--- a/pages/404.js
+++ b/pages/404.js
@@ -1,11 +1,14 @@
import React from 'react';
import Layout from 'components/layout/Layout';
+import { FormattedMessage } from 'react-intl';
export default function Custom404() {
return (
-
oops! page not found
+
+
+
);
diff --git a/pages/account.js b/pages/account.js
deleted file mode 100644
index a7ed6862..00000000
--- a/pages/account.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-import Layout from 'components/layout/Layout';
-import AccountSettings from 'components/settings/AccountSettings';
-import useRequireLogin from 'hooks/useRequireLogin';
-
-export default function AccountPage() {
- const { loading } = useRequireLogin();
-
- if (loading) {
- return null;
- }
-
- return (
-
-
-
- );
-}
diff --git a/pages/api/account.js b/pages/api/account/index.js
similarity index 100%
rename from pages/api/account.js
rename to pages/api/account/index.js
diff --git a/pages/api/website/[id]/index.js b/pages/api/website/[id].js
similarity index 100%
rename from pages/api/website/[id]/index.js
rename to pages/api/website/[id].js
diff --git a/pages/api/website.js b/pages/api/website/index.js
similarity index 100%
rename from pages/api/website.js
rename to pages/api/website/index.js
diff --git a/pages/api/websites.js b/pages/api/websites.js
index af83c13e..b4633950 100644
--- a/pages/api/websites.js
+++ b/pages/api/websites.js
@@ -1,14 +1,19 @@
import { getUserWebsites } from 'lib/queries';
import { useAuth } from 'lib/middleware';
-import { ok, methodNotAllowed } from 'lib/response';
+import { ok, methodNotAllowed, unauthorized } from 'lib/response';
export default async (req, res) => {
await useAuth(req, res);
- const { user_id } = req.auth;
+ const { user_id, is_admin } = req.auth;
+ const { userId } = req.query;
if (req.method === 'GET') {
- const websites = await getUserWebsites(user_id);
+ if (userId && !is_admin) {
+ return unauthorized(res);
+ }
+
+ const websites = await getUserWebsites(+userId || user_id);
return ok(res, websites);
}
diff --git a/pages/dashboard.js b/pages/dashboard/[[...id]].js
similarity index 67%
rename from pages/dashboard.js
rename to pages/dashboard/[[...id]].js
index aeb9d772..90f08492 100644
--- a/pages/dashboard.js
+++ b/pages/dashboard/[[...id]].js
@@ -1,10 +1,14 @@
import React from 'react';
+import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
import WebsiteList from 'components/WebsiteList';
import useRequireLogin from 'hooks/useRequireLogin';
export default function DashboardPage() {
const { loading } = useRequireLogin();
+ const router = useRouter();
+ const { id } = router.query;
+ const userId = id?.[0];
if (loading) {
return null;
@@ -12,7 +16,7 @@ export default function DashboardPage() {
return (
-
+
);
}