mirror of
https://github.com/umami-software/umami.git
synced 2026-02-13 09:05:36 +01:00
Added search to languages and timezone.
This commit is contained in:
parent
c24fe079f1
commit
1e0c177fe6
7 changed files with 36 additions and 10 deletions
|
|
@ -0,0 +1,4 @@
|
||||||
|
div.menu {
|
||||||
|
max-height: 300px;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
@ -1,17 +1,27 @@
|
||||||
|
import { useState } from 'react';
|
||||||
import { Button, Dropdown, Item, Flexbox } from 'react-basics';
|
import { Button, Dropdown, Item, Flexbox } from 'react-basics';
|
||||||
import useLocale from 'components/hooks/useLocale';
|
import useLocale from 'components/hooks/useLocale';
|
||||||
import { DEFAULT_LOCALE } from 'lib/constants';
|
import { DEFAULT_LOCALE } from 'lib/constants';
|
||||||
import { languages } from 'lib/lang';
|
import { languages } from 'lib/lang';
|
||||||
import useMessages from 'components/hooks/useMessages';
|
import useMessages from 'components/hooks/useMessages';
|
||||||
|
import styles from './LanguageSetting.module.css';
|
||||||
|
|
||||||
export function LanguageSetting() {
|
export function LanguageSetting() {
|
||||||
|
const [search, setSearch] = useState('');
|
||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
const { locale, saveLocale } = useLocale();
|
const { locale, saveLocale } = useLocale();
|
||||||
const options = Object.keys(languages);
|
const options = search
|
||||||
|
? Object.keys(languages).filter(n => {
|
||||||
|
return (
|
||||||
|
n.toLowerCase().includes(search.toLowerCase()) ||
|
||||||
|
languages[n].label.toLowerCase().includes(search.toLowerCase())
|
||||||
|
);
|
||||||
|
})
|
||||||
|
: Object.keys(languages);
|
||||||
|
|
||||||
const handleReset = () => saveLocale(DEFAULT_LOCALE);
|
const handleReset = () => saveLocale(DEFAULT_LOCALE);
|
||||||
|
|
||||||
const renderValue = value => languages[value].label;
|
const renderValue = (value: string | number) => languages[value].label;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flexbox gap={10}>
|
<Flexbox gap={10}>
|
||||||
|
|
@ -20,7 +30,9 @@ export function LanguageSetting() {
|
||||||
value={locale}
|
value={locale}
|
||||||
renderValue={renderValue}
|
renderValue={renderValue}
|
||||||
onSelect={saveLocale}
|
onSelect={saveLocale}
|
||||||
menuProps={{ style: { height: 300, width: 300 } }}
|
allowSearch={true}
|
||||||
|
onSearch={setSearch}
|
||||||
|
menuProps={{ className: styles.menu }}
|
||||||
>
|
>
|
||||||
{item => <Item key={item}>{languages[item].label}</Item>}
|
{item => <Item key={item}>{languages[item].label}</Item>}
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
div.menu {
|
||||||
|
max-height: 300px;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
@ -1,13 +1,18 @@
|
||||||
|
import { useState } from 'react';
|
||||||
import { Dropdown, Item, Button, Flexbox } from 'react-basics';
|
import { Dropdown, Item, Button, Flexbox } from 'react-basics';
|
||||||
import { listTimeZones } from 'timezone-support';
|
import { listTimeZones } from 'timezone-support';
|
||||||
import useTimezone from 'components/hooks/useTimezone';
|
import useTimezone from 'components/hooks/useTimezone';
|
||||||
import useMessages from 'components/hooks/useMessages';
|
import useMessages from 'components/hooks/useMessages';
|
||||||
import { getTimezone } from 'lib/date';
|
import { getTimezone } from 'lib/date';
|
||||||
|
import styles from './TimezoneSetting.module.css';
|
||||||
|
|
||||||
export function TimezoneSetting() {
|
export function TimezoneSetting() {
|
||||||
|
const [search, setSearch] = useState('');
|
||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
const [timezone, saveTimezone] = useTimezone();
|
const [timezone, saveTimezone] = useTimezone();
|
||||||
const options = listTimeZones();
|
const options = search
|
||||||
|
? listTimeZones().filter(n => n.toLowerCase().includes(search.toLowerCase()))
|
||||||
|
: listTimeZones();
|
||||||
|
|
||||||
const handleReset = () => saveTimezone(getTimezone());
|
const handleReset = () => saveTimezone(getTimezone());
|
||||||
|
|
||||||
|
|
@ -17,8 +22,9 @@ export function TimezoneSetting() {
|
||||||
items={options}
|
items={options}
|
||||||
value={timezone}
|
value={timezone}
|
||||||
onSelect={saveTimezone}
|
onSelect={saveTimezone}
|
||||||
style={{ flex: 1 }}
|
menuProps={{ className: styles.menu }}
|
||||||
menuProps={{ style: { height: 300 } }}
|
allowSearch={true}
|
||||||
|
onSearch={setSearch}
|
||||||
>
|
>
|
||||||
{item => <Item key={item}>{item}</Item>}
|
{item => <Item key={item}>{item}</Item>}
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ async function parseFilters(websiteId: string, filters: QueryFilters = {}, optio
|
||||||
params: {
|
params: {
|
||||||
...normalizeFilters(filters),
|
...normalizeFilters(filters),
|
||||||
websiteId,
|
websiteId,
|
||||||
startDate: maxDate(filters.startDate, new Date(website.resetAt)),
|
startDate: maxDate(filters.startDate, new Date(website?.resetAt)),
|
||||||
websiteDomain: website.domain,
|
websiteDomain: website.domain,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ async function parseFilters(
|
||||||
params: {
|
params: {
|
||||||
...normalizeFilters(filters),
|
...normalizeFilters(filters),
|
||||||
websiteId,
|
websiteId,
|
||||||
startDate: maxDate(filters.startDate, website.resetAt),
|
startDate: maxDate(filters.startDate, website?.resetAt),
|
||||||
websiteDomain: website.domain,
|
websiteDomain: website.domain,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -252,7 +252,7 @@ export async function createWebsite(
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateWebsite(
|
export async function updateWebsite(
|
||||||
websiteId,
|
websiteId: string,
|
||||||
data: Prisma.WebsiteUpdateInput | Prisma.WebsiteUncheckedUpdateInput,
|
data: Prisma.WebsiteUpdateInput | Prisma.WebsiteUncheckedUpdateInput,
|
||||||
): Promise<Website> {
|
): Promise<Website> {
|
||||||
return prisma.client.website.update({
|
return prisma.client.website.update({
|
||||||
|
|
@ -264,7 +264,7 @@ export async function updateWebsite(
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function resetWebsite(
|
export async function resetWebsite(
|
||||||
websiteId,
|
websiteId: string,
|
||||||
): Promise<[Prisma.BatchPayload, Prisma.BatchPayload, Website]> {
|
): Promise<[Prisma.BatchPayload, Prisma.BatchPayload, Website]> {
|
||||||
const { client, transaction } = prisma;
|
const { client, transaction } = prisma;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue