mirror of
https://github.com/kremalicious/umami.git
synced 2024-06-26 03:06:24 +02:00
Added router navigation for settings and details.
This commit is contained in:
parent
30bca80dac
commit
53c23a280b
|
@ -1,5 +1,6 @@
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
import { useRouter } from 'next/router';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import WebsiteChart from 'components/metrics/WebsiteChart';
|
import WebsiteChart from 'components/metrics/WebsiteChart';
|
||||||
import WorldMap from 'components/common/WorldMap';
|
import WorldMap from 'components/common/WorldMap';
|
||||||
|
@ -19,12 +20,28 @@ import EventsChart from './metrics/EventsChart';
|
||||||
import useFetch from 'hooks/useFetch';
|
import useFetch from 'hooks/useFetch';
|
||||||
import Loading from 'components/common/Loading';
|
import Loading from 'components/common/Loading';
|
||||||
|
|
||||||
|
const views = {
|
||||||
|
url: PagesTable,
|
||||||
|
referrer: ReferrersTable,
|
||||||
|
browser: BrowsersTable,
|
||||||
|
os: OSTable,
|
||||||
|
device: DevicesTable,
|
||||||
|
country: CountriesTable,
|
||||||
|
event: EventsTable,
|
||||||
|
};
|
||||||
|
|
||||||
export default function WebsiteDetails({ websiteId }) {
|
export default function WebsiteDetails({ websiteId }) {
|
||||||
|
const router = useRouter();
|
||||||
const { data } = useFetch(`/api/website/${websiteId}`);
|
const { data } = useFetch(`/api/website/${websiteId}`);
|
||||||
const [chartLoaded, setChartLoaded] = useState(false);
|
const [chartLoaded, setChartLoaded] = useState(false);
|
||||||
const [countryData, setCountryData] = useState();
|
const [countryData, setCountryData] = useState();
|
||||||
const [eventsData, setEventsData] = useState();
|
const [eventsData, setEventsData] = useState();
|
||||||
const [expand, setExpand] = useState();
|
const {
|
||||||
|
query: { id, view },
|
||||||
|
} = router;
|
||||||
|
const path = `/website/${id.join('/')}`;
|
||||||
|
|
||||||
|
console.log({ router });
|
||||||
|
|
||||||
const BackButton = () => (
|
const BackButton = () => (
|
||||||
<Button
|
<Button
|
||||||
|
@ -32,7 +49,7 @@ export default function WebsiteDetails({ websiteId }) {
|
||||||
className={styles.backButton}
|
className={styles.backButton}
|
||||||
icon={<Arrow />}
|
icon={<Arrow />}
|
||||||
size="xsmall"
|
size="xsmall"
|
||||||
onClick={() => setExpand(null)}
|
onClick={() => router.push(path)}
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<FormattedMessage id="button.back" defaultMessage="Back" />
|
<FormattedMessage id="button.back" defaultMessage="Back" />
|
||||||
|
@ -46,38 +63,31 @@ export default function WebsiteDetails({ websiteId }) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.pages" defaultMessage="Pages" />,
|
label: <FormattedMessage id="metrics.pages" defaultMessage="Pages" />,
|
||||||
value: 'url',
|
value: `${path}?view=url`,
|
||||||
component: PagesTable,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.referrers" defaultMessage="Referrers" />,
|
label: <FormattedMessage id="metrics.referrers" defaultMessage="Referrers" />,
|
||||||
value: 'referrer',
|
value: `${path}?view=referrer`,
|
||||||
component: ReferrersTable,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.browsers" defaultMessage="Browsers" />,
|
label: <FormattedMessage id="metrics.browsers" defaultMessage="Browsers" />,
|
||||||
value: 'browser',
|
value: `${path}?view=browser`,
|
||||||
component: BrowsersTable,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.operating-systems" defaultMessage="Operating system" />,
|
label: <FormattedMessage id="metrics.operating-systems" defaultMessage="Operating system" />,
|
||||||
value: 'os',
|
value: `${path}?view=os`,
|
||||||
component: OSTable,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.devices" defaultMessage="Devices" />,
|
label: <FormattedMessage id="metrics.devices" defaultMessage="Devices" />,
|
||||||
value: 'device',
|
value: `${path}?view=device`,
|
||||||
component: DevicesTable,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.countries" defaultMessage="Countries" />,
|
label: <FormattedMessage id="metrics.countries" defaultMessage="Countries" />,
|
||||||
value: 'country',
|
value: `${path}?view=country`,
|
||||||
component: CountriesTable,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: <FormattedMessage id="metrics.events" defaultMessage="Events" />,
|
label: <FormattedMessage id="metrics.events" defaultMessage="Events" />,
|
||||||
value: 'event',
|
value: `${path}?view=event`,
|
||||||
component: EventsTable,
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -88,11 +98,7 @@ export default function WebsiteDetails({ websiteId }) {
|
||||||
onExpand: handleExpand,
|
onExpand: handleExpand,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DetailsComponent = expand?.component;
|
const DetailsComponent = views[view];
|
||||||
|
|
||||||
function getSelectedMenuOption(value) {
|
|
||||||
return menuOptions.find(e => e.value === value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleDataLoad() {
|
function handleDataLoad() {
|
||||||
if (!chartLoaded) {
|
if (!chartLoaded) {
|
||||||
|
@ -101,11 +107,7 @@ export default function WebsiteDetails({ websiteId }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleExpand(value) {
|
function handleExpand(value) {
|
||||||
setExpand(getSelectedMenuOption(value));
|
router.push(`${path}?view=${value}`);
|
||||||
}
|
|
||||||
|
|
||||||
function handleMenuSelect(value) {
|
|
||||||
setExpand(getSelectedMenuOption(value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
|
@ -126,7 +128,7 @@ export default function WebsiteDetails({ websiteId }) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{!chartLoaded && <Loading />}
|
{!chartLoaded && <Loading />}
|
||||||
{chartLoaded && !expand && (
|
{chartLoaded && !view && (
|
||||||
<>
|
<>
|
||||||
<div className={classNames(styles.row, 'row')}>
|
<div className={classNames(styles.row, 'row')}>
|
||||||
<div className="col-md-12 col-lg-6">
|
<div className="col-md-12 col-lg-6">
|
||||||
|
@ -167,15 +169,8 @@ export default function WebsiteDetails({ websiteId }) {
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{expand && (
|
{view && (
|
||||||
<MenuLayout
|
<MenuLayout className={styles.view} menuClassName={styles.menu} menu={menuOptions}>
|
||||||
className={styles.expand}
|
|
||||||
menuClassName={styles.menu}
|
|
||||||
optionClassName={styles.option}
|
|
||||||
menu={menuOptions}
|
|
||||||
selectedOption={expand.value}
|
|
||||||
onMenuSelect={handleMenuSelect}
|
|
||||||
>
|
|
||||||
<DetailsComponent {...tableProps} limit={false} />
|
<DetailsComponent {...tableProps} limit={false} />
|
||||||
</MenuLayout>
|
</MenuLayout>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.expand {
|
.view {
|
||||||
border-top: 1px solid var(--gray300);
|
border-top: 1px solid var(--gray300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,10 +10,6 @@
|
||||||
font-size: var(--font-size-small);
|
font-size: var(--font-size-small);
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu .option {
|
|
||||||
font-size: var(--font-size-small);
|
|
||||||
}
|
|
||||||
|
|
||||||
.backButton {
|
.backButton {
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
|
|
32
components/common/NavMenu.js
Normal file
32
components/common/NavMenu.js
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { useRouter } from 'next/router';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import styles from './NavMenu.module.css';
|
||||||
|
|
||||||
|
export default function NavMenu({ options = [], className, onSelect = () => {} }) {
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={classNames(styles.menu, className)}>
|
||||||
|
{options
|
||||||
|
.filter(({ hidden }) => !hidden)
|
||||||
|
.map(option => {
|
||||||
|
const { label, value, className: customClassName, render } = option;
|
||||||
|
|
||||||
|
return render ? (
|
||||||
|
render(option)
|
||||||
|
) : (
|
||||||
|
<div
|
||||||
|
key={value}
|
||||||
|
className={classNames(styles.option, customClassName, {
|
||||||
|
[styles.selected]: router.asPath === value,
|
||||||
|
})}
|
||||||
|
onClick={e => onSelect(value, e)}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
20
components/common/NavMenu.module.css
Normal file
20
components/common/NavMenu.module.css
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
.menu {
|
||||||
|
border: 1px solid var(--gray500);
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.option {
|
||||||
|
padding: 8px 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.option:hover {
|
||||||
|
background: var(--gray75);
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ export default function UserButton() {
|
||||||
value: 'username',
|
value: 'username',
|
||||||
className: styles.username,
|
className: styles.username,
|
||||||
},
|
},
|
||||||
|
{ label: <FormattedMessage id="label.profile" defaultMessage="Profile" />, value: 'profile' },
|
||||||
{ label: <FormattedMessage id="label.logout" defaultMessage="Logout" />, value: 'logout' },
|
{ label: <FormattedMessage id="label.logout" defaultMessage="Logout" />, value: 'logout' },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -35,6 +36,8 @@ export default function UserButton() {
|
||||||
|
|
||||||
if (value === 'logout') {
|
if (value === 'logout') {
|
||||||
router.push('/logout');
|
router.push('/logout');
|
||||||
|
} else if (value === 'profile') {
|
||||||
|
router.push('/settings/profile');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,29 +1,37 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { useRouter } from 'next/router';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import Menu from 'components/common/Menu';
|
import NavMenu from 'components/common/NavMenu';
|
||||||
import styles from './MenuLayout.module.css';
|
import styles from './MenuLayout.module.css';
|
||||||
|
|
||||||
export default function MenuLayout({
|
export default function MenuLayout({
|
||||||
menu,
|
menu,
|
||||||
selectedOption,
|
selectedOption,
|
||||||
onMenuSelect,
|
|
||||||
className,
|
className,
|
||||||
menuClassName,
|
menuClassName,
|
||||||
contentClassName,
|
contentClassName,
|
||||||
optionClassName,
|
|
||||||
children,
|
children,
|
||||||
|
replace = false,
|
||||||
}) {
|
}) {
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
function handleSelect(url) {
|
||||||
|
if (replace) {
|
||||||
|
router.replace(url);
|
||||||
|
} else {
|
||||||
|
router.push(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames(styles.container, className, 'row')}>
|
<div className={classNames(styles.container, className, 'row')}>
|
||||||
<Menu
|
<NavMenu
|
||||||
options={menu}
|
options={menu}
|
||||||
selectedOption={selectedOption}
|
selectedOption={selectedOption}
|
||||||
className={classNames(styles.menu, menuClassName, 'col-12 col-lg-3')}
|
className={classNames(styles.menu, menuClassName, 'col-12 col-lg-2')}
|
||||||
selectedClassName={styles.selected}
|
onSelect={handleSelect}
|
||||||
optionClassName={classNames(styles.option, optionClassName)}
|
|
||||||
onSelect={onMenuSelect}
|
|
||||||
/>
|
/>
|
||||||
<div className={classNames(styles.content, contentClassName, 'col-12 col-lg-9')}>
|
<div className={classNames(styles.content, contentClassName, 'col-12 col-lg-10')}>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -10,25 +10,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.container .content {
|
.container .content {
|
||||||
|
flex: 1;
|
||||||
position: relative;
|
position: relative;
|
||||||
border-left: 1px solid var(--gray300);
|
border-left: 1px solid var(--gray300);
|
||||||
padding-left: 30px;
|
padding-left: 30px;
|
||||||
}
|
margin-left: 30px;
|
||||||
|
|
||||||
.option {
|
|
||||||
font-size: var(--font-size-normal);
|
|
||||||
padding: 8px 16px;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-right: 30px;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.option:hover {
|
|
||||||
background: var(--gray75);
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected {
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 992px) {
|
@media only screen and (max-width: 992px) {
|
||||||
|
@ -40,5 +26,6 @@
|
||||||
border-top: 1px solid var(--gray300);
|
border-top: 1px solid var(--gray300);
|
||||||
border-left: 0;
|
border-left: 0;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
|
import { useRouter } from 'next/router';
|
||||||
import Page from 'components/layout/Page';
|
import Page from 'components/layout/Page';
|
||||||
import MenuLayout from 'components/layout/MenuLayout';
|
import MenuLayout from 'components/layout/MenuLayout';
|
||||||
import WebsiteSettings from './WebsiteSettings';
|
import WebsiteSettings from './WebsiteSettings';
|
||||||
|
@ -7,13 +8,15 @@ import ProfileSettings from './ProfileSettings';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
const WEBSITES = 1;
|
const WEBSITES = '/settings';
|
||||||
const ACCOUNTS = 2;
|
const ACCOUNTS = '/settings/accounts';
|
||||||
const PROFILE = 3;
|
const PROFILE = '/settings/profile';
|
||||||
|
|
||||||
export default function Settings() {
|
export default function Settings() {
|
||||||
const user = useSelector(state => state.user);
|
const user = useSelector(state => state.user);
|
||||||
const [option, setOption] = useState(WEBSITES);
|
const [option, setOption] = useState(WEBSITES);
|
||||||
|
const router = useRouter();
|
||||||
|
const { pathname } = router;
|
||||||
|
|
||||||
const menuOptions = [
|
const menuOptions = [
|
||||||
{
|
{
|
||||||
|
@ -25,15 +28,18 @@ export default function Settings() {
|
||||||
value: ACCOUNTS,
|
value: ACCOUNTS,
|
||||||
hidden: !user.is_admin,
|
hidden: !user.is_admin,
|
||||||
},
|
},
|
||||||
{ label: <FormattedMessage id="settings.profile" defaultMessage="Profile" />, value: PROFILE },
|
{
|
||||||
|
label: <FormattedMessage id="settings.profile" defaultMessage="Profile" />,
|
||||||
|
value: PROFILE,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Page>
|
<Page>
|
||||||
<MenuLayout menu={menuOptions} selectedOption={option} onMenuSelect={setOption}>
|
<MenuLayout menu={menuOptions} selectedOption={option} onMenuSelect={setOption}>
|
||||||
{option === WEBSITES && <WebsiteSettings />}
|
{pathname === WEBSITES && <WebsiteSettings />}
|
||||||
{option === ACCOUNTS && <AccountSettings />}
|
{pathname === ACCOUNTS && <AccountSettings />}
|
||||||
{option === PROFILE && <ProfileSettings />}
|
{pathname === PROFILE && <ProfileSettings />}
|
||||||
</MenuLayout>
|
</MenuLayout>
|
||||||
</Page>
|
</Page>
|
||||||
);
|
);
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Abbrechen",
|
"button.cancel": "Abbrechen",
|
||||||
"button.change-password": "Passwort ändern",
|
"button.change-password": "Passwort ändern",
|
||||||
"button.copy-to-clipboard": "In die Zwischenablage kopieren",
|
"button.copy-to-clipboard": "In die Zwischenablage kopieren",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Löschen",
|
"button.delete": "Löschen",
|
||||||
"button.edit": "Bearbeiten",
|
"button.edit": "Bearbeiten",
|
||||||
"button.login": "Anmelden",
|
"button.login": "Anmelden",
|
||||||
"button.more": "Mehr",
|
"button.more": "Mehr",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Speichern",
|
"button.save": "Speichern",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Details anzeigen",
|
"button.view-details": "Details anzeigen",
|
||||||
"button.websites": "Webseiten",
|
"button.websites": "Webseiten",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Neues Passwort",
|
"label.new-password": "Neues Passwort",
|
||||||
"label.password": "Passwort",
|
"label.password": "Passwort",
|
||||||
"label.passwords-dont-match": "Passwörter stimmen nicht überein",
|
"label.passwords-dont-match": "Passwörter stimmen nicht überein",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Erforderlich",
|
"label.required": "Erforderlich",
|
||||||
"label.this-month": "Diesen Monat",
|
"label.this-month": "Diesen Monat",
|
||||||
"label.this-week": "Diese Woche",
|
"label.this-week": "Diese Woche",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Cancel",
|
"button.cancel": "Cancel",
|
||||||
"button.change-password": "Change password",
|
"button.change-password": "Change password",
|
||||||
"button.copy-to-clipboard": "Copy to clipboard",
|
"button.copy-to-clipboard": "Copy to clipboard",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Delete",
|
"button.delete": "Delete",
|
||||||
"button.edit": "Edit",
|
"button.edit": "Edit",
|
||||||
"button.login": "Login",
|
"button.login": "Login",
|
||||||
"button.more": "More",
|
"button.more": "More",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Save",
|
"button.save": "Save",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "View details",
|
"button.view-details": "View details",
|
||||||
"button.websites": "Websites",
|
"button.websites": "Websites",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "New password",
|
"label.new-password": "New password",
|
||||||
"label.password": "Password",
|
"label.password": "Password",
|
||||||
"label.passwords-dont-match": "Passwords don't match",
|
"label.passwords-dont-match": "Passwords don't match",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Required",
|
"label.required": "Required",
|
||||||
"label.this-month": "This month",
|
"label.this-month": "This month",
|
||||||
"label.this-week": "This week",
|
"label.this-week": "This week",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Cancelar",
|
"button.cancel": "Cancelar",
|
||||||
"button.change-password": "Cambiar contraseña",
|
"button.change-password": "Cambiar contraseña",
|
||||||
"button.copy-to-clipboard": "Copiar al portapapeles",
|
"button.copy-to-clipboard": "Copiar al portapapeles",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Eliminar",
|
"button.delete": "Eliminar",
|
||||||
"button.edit": "Editar",
|
"button.edit": "Editar",
|
||||||
"button.login": "Iniciar sesión",
|
"button.login": "Iniciar sesión",
|
||||||
"button.more": "Más",
|
"button.more": "Más",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Guardar",
|
"button.save": "Guardar",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Ver detalles",
|
"button.view-details": "Ver detalles",
|
||||||
"button.websites": "Sitios",
|
"button.websites": "Sitios",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Nueva contraseña",
|
"label.new-password": "Nueva contraseña",
|
||||||
"label.password": "Contraseña",
|
"label.password": "Contraseña",
|
||||||
"label.passwords-dont-match": "Las contraseñas no coinciden",
|
"label.passwords-dont-match": "Las contraseñas no coinciden",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Requerido",
|
"label.required": "Requerido",
|
||||||
"label.this-month": "Este mes",
|
"label.this-month": "Este mes",
|
||||||
"label.this-week": "Esta semana",
|
"label.this-week": "Esta semana",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Annuler",
|
"button.cancel": "Annuler",
|
||||||
"button.change-password": "Changer de mot de passse",
|
"button.change-password": "Changer de mot de passse",
|
||||||
"button.copy-to-clipboard": "Copier dans le presse papier",
|
"button.copy-to-clipboard": "Copier dans le presse papier",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Supprimer",
|
"button.delete": "Supprimer",
|
||||||
"button.edit": "Modifier",
|
"button.edit": "Modifier",
|
||||||
"button.login": "Connexion",
|
"button.login": "Connexion",
|
||||||
"button.more": "Plus",
|
"button.more": "Plus",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Sauvegarder",
|
"button.save": "Sauvegarder",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Voir les details",
|
"button.view-details": "Voir les details",
|
||||||
"button.websites": "Sites",
|
"button.websites": "Sites",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Nouveau mot de passe",
|
"label.new-password": "Nouveau mot de passe",
|
||||||
"label.password": "Mot de passe",
|
"label.password": "Mot de passe",
|
||||||
"label.passwords-dont-match": "Les mots de passe ne correspondent pas",
|
"label.passwords-dont-match": "Les mots de passe ne correspondent pas",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Requis",
|
"label.required": "Requis",
|
||||||
"label.this-month": "Ce mois ci",
|
"label.this-month": "Ce mois ci",
|
||||||
"label.this-week": "Cette semaine",
|
"label.this-week": "Cette semaine",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "キャンセル",
|
"button.cancel": "キャンセル",
|
||||||
"button.change-password": "パスワード変更",
|
"button.change-password": "パスワード変更",
|
||||||
"button.copy-to-clipboard": "クリップボードにコピー",
|
"button.copy-to-clipboard": "クリップボードにコピー",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "削除",
|
"button.delete": "削除",
|
||||||
"button.edit": "編集",
|
"button.edit": "編集",
|
||||||
"button.login": "ログイン",
|
"button.login": "ログイン",
|
||||||
"button.more": "さらに表示",
|
"button.more": "さらに表示",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "保存",
|
"button.save": "保存",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "詳細表示",
|
"button.view-details": "詳細表示",
|
||||||
"button.websites": "Webサイト",
|
"button.websites": "Webサイト",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "新しいパスワード",
|
"label.new-password": "新しいパスワード",
|
||||||
"label.password": "パスワード",
|
"label.password": "パスワード",
|
||||||
"label.passwords-dont-match": "パスワードが一致しません",
|
"label.passwords-dont-match": "パスワードが一致しません",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "必須",
|
"label.required": "必須",
|
||||||
"label.this-month": "今月",
|
"label.this-month": "今月",
|
||||||
"label.this-week": "今週",
|
"label.this-week": "今週",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Цуцлах",
|
"button.cancel": "Цуцлах",
|
||||||
"button.change-password": "Нууц үг солих",
|
"button.change-password": "Нууц үг солих",
|
||||||
"button.copy-to-clipboard": "Хуулах",
|
"button.copy-to-clipboard": "Хуулах",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Устгах",
|
"button.delete": "Устгах",
|
||||||
"button.edit": "Засах",
|
"button.edit": "Засах",
|
||||||
"button.login": "Нэвтрэх",
|
"button.login": "Нэвтрэх",
|
||||||
"button.more": "Цааш",
|
"button.more": "Цааш",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Хадгалах",
|
"button.save": "Хадгалах",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Дэлгэрүүлж харах",
|
"button.view-details": "Дэлгэрүүлж харах",
|
||||||
"button.websites": "Вебүүд",
|
"button.websites": "Вебүүд",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Шинэ нууц үг",
|
"label.new-password": "Шинэ нууц үг",
|
||||||
"label.password": "Нууц үг",
|
"label.password": "Нууц үг",
|
||||||
"label.passwords-dont-match": "Нууц үг тохирохгүй байна",
|
"label.passwords-dont-match": "Нууц үг тохирохгүй байна",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Шаардлагатай",
|
"label.required": "Шаардлагатай",
|
||||||
"label.this-month": "Энэ сар",
|
"label.this-month": "Энэ сар",
|
||||||
"label.this-week": "Энэ долоо хоног",
|
"label.this-week": "Энэ долоо хоног",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Annuleren",
|
"button.cancel": "Annuleren",
|
||||||
"button.change-password": "Wachtwoord wijzigen",
|
"button.change-password": "Wachtwoord wijzigen",
|
||||||
"button.copy-to-clipboard": "Kopiëer naar klembord",
|
"button.copy-to-clipboard": "Kopiëer naar klembord",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Verwijderen",
|
"button.delete": "Verwijderen",
|
||||||
"button.edit": "Bewerken",
|
"button.edit": "Bewerken",
|
||||||
"button.login": "Inloggen",
|
"button.login": "Inloggen",
|
||||||
"button.more": "Toon meer",
|
"button.more": "Toon meer",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Opslaan",
|
"button.save": "Opslaan",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Meer details",
|
"button.view-details": "Meer details",
|
||||||
"button.websites": "Websites",
|
"button.websites": "Websites",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Nieuw wachtwoord",
|
"label.new-password": "Nieuw wachtwoord",
|
||||||
"label.password": "Wachtwoord",
|
"label.password": "Wachtwoord",
|
||||||
"label.passwords-dont-match": "Wachtwoorden komen niet overeen",
|
"label.passwords-dont-match": "Wachtwoorden komen niet overeen",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Verplicht",
|
"label.required": "Verplicht",
|
||||||
"label.this-month": "Deze maand",
|
"label.this-month": "Deze maand",
|
||||||
"label.this-week": "Deze week",
|
"label.this-week": "Deze week",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "Отменить",
|
"button.cancel": "Отменить",
|
||||||
"button.change-password": "Изменить пароль",
|
"button.change-password": "Изменить пароль",
|
||||||
"button.copy-to-clipboard": "Скопировать в буфер обмена",
|
"button.copy-to-clipboard": "Скопировать в буфер обмена",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Удалить",
|
"button.delete": "Удалить",
|
||||||
"button.edit": "Редактировать",
|
"button.edit": "Редактировать",
|
||||||
"button.login": "Войти",
|
"button.login": "Войти",
|
||||||
"button.more": "Больше",
|
"button.more": "Больше",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Сохранить",
|
"button.save": "Сохранить",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Посмотреть детали",
|
"button.view-details": "Посмотреть детали",
|
||||||
"button.websites": "Сайты",
|
"button.websites": "Сайты",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Новый пароль",
|
"label.new-password": "Новый пароль",
|
||||||
"label.password": "Пароль",
|
"label.password": "Пароль",
|
||||||
"label.passwords-dont-match": "Пароли не совпадают",
|
"label.passwords-dont-match": "Пароли не совпадают",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Обязательное",
|
"label.required": "Обязательное",
|
||||||
"label.this-month": "Этот месяц",
|
"label.this-month": "Этот месяц",
|
||||||
"label.this-week": "Эта неделя",
|
"label.this-week": "Эта неделя",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "İptal",
|
"button.cancel": "İptal",
|
||||||
"button.change-password": "Şifre değiştir",
|
"button.change-password": "Şifre değiştir",
|
||||||
"button.copy-to-clipboard": "Panoya kopyala",
|
"button.copy-to-clipboard": "Panoya kopyala",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "Sil",
|
"button.delete": "Sil",
|
||||||
"button.edit": "Düzenle",
|
"button.edit": "Düzenle",
|
||||||
"button.login": "Giriş Yap",
|
"button.login": "Giriş Yap",
|
||||||
"button.more": "Detaylı göster",
|
"button.more": "Detaylı göster",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "Kaydet",
|
"button.save": "Kaydet",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "Detayı incele",
|
"button.view-details": "Detayı incele",
|
||||||
"button.websites": "Web siteleri",
|
"button.websites": "Web siteleri",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "Yeni parola",
|
"label.new-password": "Yeni parola",
|
||||||
"label.password": "Parola",
|
"label.password": "Parola",
|
||||||
"label.passwords-dont-match": "Parolalar uyuşmuyor",
|
"label.passwords-dont-match": "Parolalar uyuşmuyor",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "Zorunlu alan",
|
"label.required": "Zorunlu alan",
|
||||||
"label.this-month": "Bu ay",
|
"label.this-month": "Bu ay",
|
||||||
"label.this-week": "Bu hafta",
|
"label.this-week": "Bu hafta",
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
"button.cancel": "取消",
|
"button.cancel": "取消",
|
||||||
"button.change-password": "更新密码",
|
"button.change-password": "更新密码",
|
||||||
"button.copy-to-clipboard": "复制",
|
"button.copy-to-clipboard": "复制",
|
||||||
|
"button.date-range": "Date range",
|
||||||
"button.delete": "删除",
|
"button.delete": "删除",
|
||||||
"button.edit": "编辑",
|
"button.edit": "编辑",
|
||||||
"button.login": "登录",
|
"button.login": "登录",
|
||||||
"button.more": "更多",
|
"button.more": "更多",
|
||||||
"button.refresh": "Refresh",
|
"button.refresh": "Refresh",
|
||||||
"button.save": "保存",
|
"button.save": "保存",
|
||||||
|
"button.single-day": "Single day",
|
||||||
"button.view-details": "查看更多",
|
"button.view-details": "查看更多",
|
||||||
"button.websites": "网站",
|
"button.websites": "网站",
|
||||||
"device.desktop": "Desktop",
|
"device.desktop": "Desktop",
|
||||||
|
@ -37,6 +39,7 @@
|
||||||
"label.new-password": "新密码",
|
"label.new-password": "新密码",
|
||||||
"label.password": "密码",
|
"label.password": "密码",
|
||||||
"label.passwords-dont-match": "密码不一致",
|
"label.passwords-dont-match": "密码不一致",
|
||||||
|
"label.profile": "Profile",
|
||||||
"label.required": "必填",
|
"label.required": "必填",
|
||||||
"label.this-month": "本月",
|
"label.this-month": "本月",
|
||||||
"label.this-week": "本周",
|
"label.this-week": "本周",
|
||||||
|
|
3
pages/settings/accounts.js
Normal file
3
pages/settings/accounts.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import Index from './index';
|
||||||
|
|
||||||
|
export default Index;
|
3
pages/settings/profile.js
Normal file
3
pages/settings/profile.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import Index from './index';
|
||||||
|
|
||||||
|
export default Index;
|
Loading…
Reference in New Issue
Block a user