From f80ef5b54ce797e368ac79ef074cdebe286e6ce1 Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Thu, 17 Jun 2021 14:42:42 +0200 Subject: [PATCH] Work on settings page --- ui/src/Pages/LoginPage/LoginPage.tsx | 8 +- ui/src/Pages/SettingsPage/PeriodicScanner.tsx | 150 ++++++++---------- .../SettingsPage/ScannerConcurrentWorkers.tsx | 19 +-- ui/src/Pages/SettingsPage/ScannerSection.tsx | 6 +- ui/src/Pages/SettingsPage/SettingsPage.tsx | 49 +++--- ui/src/Pages/SettingsPage/UserPreferences.tsx | 50 ++++-- ui/src/components/sidebar/Sharing.tsx | 3 +- ui/src/primitives/form/Dropdown.tsx | 11 +- ui/src/primitives/form/Input.tsx | 48 ++++-- 9 files changed, 179 insertions(+), 165 deletions(-) diff --git a/ui/src/Pages/LoginPage/LoginPage.tsx b/ui/src/Pages/LoginPage/LoginPage.tsx index 0cf4e39c..7f4a9b46 100644 --- a/ui/src/Pages/LoginPage/LoginPage.tsx +++ b/ui/src/Pages/LoginPage/LoginPage.tsx @@ -78,7 +78,9 @@ const LoginForm = () => { // loading={loading || (data && data.authorizeUser.success)} > { } /> { }, }) - const [ - setScanIntervalMutation, - { loading: scanIntervalMutationLoading }, - ] = useMutation< - changeScanIntervalMutation, - changeScanIntervalMutationVariables - >(SCAN_INTERVAL_MUTATION) + const [setScanIntervalMutation, { loading: scanIntervalMutationLoading }] = + useMutation< + changeScanIntervalMutation, + changeScanIntervalMutationVariables + >(SCAN_INTERVAL_MUTATION) const onScanIntervalCheckboxChange = (checked: boolean) => { setEnablePeriodicScanner(checked) @@ -154,108 +155,83 @@ const PeriodicScanner = () => { } } - type scanIntervalUnitType = { - key: TimeUnit - text: string - value: TimeUnit - } - - const scanIntervalUnits: scanIntervalUnitType[] = [ + const scanIntervalUnits: DropdownItem[] = [ { - key: TimeUnit.Second, - text: t('settings.periodic_scanner.interval_unit.seconds', 'Seconds'), + label: t('settings.periodic_scanner.interval_unit.seconds', 'Seconds'), value: TimeUnit.Second, }, { - key: TimeUnit.Minute, - text: t('settings.periodic_scanner.interval_unit.minutes', 'Minutes'), + label: t('settings.periodic_scanner.interval_unit.minutes', 'Minutes'), value: TimeUnit.Minute, }, { - key: TimeUnit.Hour, - text: t('settings.periodic_scanner.interval_unit.hour', 'Hour'), + label: t('settings.periodic_scanner.interval_unit.hour', 'Hour'), value: TimeUnit.Hour, }, { - key: TimeUnit.Day, - text: t('settings.periodic_scanner.interval_unit.days', 'Days'), + label: t('settings.periodic_scanner.interval_unit.days', 'Days'), value: TimeUnit.Day, }, { - key: TimeUnit.Month, - text: t('settings.periodic_scanner.interval_unit.months', 'Months'), + label: t('settings.periodic_scanner.interval_unit.months', 'Months'), value: TimeUnit.Month, }, ] return ( <> -

{t('settings.periodic_scanner.title', 'Periodic scanner')}

+

+ {t('settings.periodic_scanner.title', 'Periodic scanner')} +

-
- - onScanIntervalCheckboxChange(checked || false) - } - /> -
+ + onScanIntervalCheckboxChange(event.target.checked || false) + } + /> - {enablePeriodicScanner && ( - <> - - { - const newScanInterval: TimeValue = { - ...scanInterval, - unit: value as TimeUnit, - } - - setScanInterval(newScanInterval) - onScanIntervalUpdate(newScanInterval) - }} - value={scanInterval.unit} - options={scanIntervalUnits} - /> - } - onBlur={() => onScanIntervalUpdate(scanInterval)} - onKeyDown={({ key }: KeyboardEvent) => - key == 'Enter' && onScanIntervalUpdate(scanInterval) - } - loading={scanIntervalQuery.loading} - labelPosition="right" - style={{ maxWidth: 300 }} +
+ +
+ { - setScanInterval(x => ({ - ...x, - value: parseInt(value), - })) + disabled={!enablePeriodicScanner} + /> + { + const newScanInterval: TimeValue = { + ...scanInterval, + unit: value as TimeUnit, + } + + setScanInterval(newScanInterval) + onScanIntervalUpdate(newScanInterval) }} /> - - )} +
+
{ } return ( -
+
- { - setWorkerAmount(parseInt(value)) + onChange={event => { + setWorkerAmount(parseInt(event.target.value)) }} onBlur={() => updateWorkerAmount(workerAmount)} - onKeyDown={({ key }: KeyboardEvent) => - key == 'Enter' && updateWorkerAmount(workerAmount) + onKeyDown={event => + event.key == 'Enter' && updateWorkerAmount(workerAmount) } /> - + /> */}
) } diff --git a/ui/src/Pages/SettingsPage/ScannerSection.tsx b/ui/src/Pages/SettingsPage/ScannerSection.tsx index 77070c76..7c643e27 100644 --- a/ui/src/Pages/SettingsPage/ScannerSection.tsx +++ b/ui/src/Pages/SettingsPage/ScannerSection.tsx @@ -1,11 +1,11 @@ import React from 'react' import { useMutation, gql } from '@apollo/client' -import { Button, Icon } from 'semantic-ui-react' import PeriodicScanner from './PeriodicScanner' import ScannerConcurrentWorkers from './ScannerConcurrentWorkers' import { SectionTitle, InputLabelDescription } from './SettingsPage' import { useTranslation } from 'react-i18next' import { scanAllMutation } from './__generated__/scanAllMutation' +import { Button } from '../../primitives/form/Input' const SCAN_MUTATION = gql` mutation scanAllMutation { @@ -32,14 +32,12 @@ const ScannerSection = () => { )} diff --git a/ui/src/Pages/SettingsPage/SettingsPage.tsx b/ui/src/Pages/SettingsPage/SettingsPage.tsx index e48cd99b..5d2a7078 100644 --- a/ui/src/Pages/SettingsPage/SettingsPage.tsx +++ b/ui/src/Pages/SettingsPage/SettingsPage.tsx @@ -1,32 +1,39 @@ import React from 'react' import { useTranslation } from 'react-i18next' -import { Button } from 'semantic-ui-react' import styled from 'styled-components' import { useIsAdmin } from '../../components/routes/AuthorizedRoute' - import Layout from '../../components/layout/Layout' - import ScannerSection from './ScannerSection' import UserPreferences from './UserPreferences' import UsersTable from './Users/UsersTable' import VersionInfo from './VersionInfo' +import classNames from 'classnames' -export const SectionTitle = styled.h2<{ nospace?: boolean }>` - margin-top: ${({ nospace }) => (nospace ? '0' : '1.4em')} !important; - padding-bottom: 0.3em; - border-bottom: 1px solid #ddd; -` +type SectionTitleProps = { + children: string + nospace?: boolean +} -export const InputLabelTitle = styled.p` - font-size: 1.1em; - font-weight: 600; - margin: 1em 0 0 !important; -` +export const SectionTitle = ({ children, nospace }: SectionTitleProps) => { + return ( +

+ {children} +

+ ) +} -export const InputLabelDescription = styled.p` - font-size: 0.9em; - margin: 0 0 0.5em !important; -` +export const InputLabelTitle = styled.h3.attrs({ + className: 'font-semibold', +})`` + +export const InputLabelDescription = styled.p.attrs({ + className: 'text-sm mb-2', +})`` const SettingsPage = () => { const { t } = useTranslation() @@ -41,14 +48,6 @@ const SettingsPage = () => { )} - ) diff --git a/ui/src/Pages/SettingsPage/UserPreferences.tsx b/ui/src/Pages/SettingsPage/UserPreferences.tsx index e573fb80..1e672320 100644 --- a/ui/src/Pages/SettingsPage/UserPreferences.tsx +++ b/ui/src/Pages/SettingsPage/UserPreferences.tsx @@ -2,9 +2,10 @@ import { useMutation, useQuery } from '@apollo/client' import gql from 'graphql-tag' import React, { useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { Dropdown } from 'semantic-ui-react' import styled from 'styled-components' import { LanguageTranslation } from '../../../__generated__/globalTypes' +import Dropdown from '../../primitives/form/Dropdown' +import { Button } from '../../primitives/form/Input' import { InputLabelDescription, InputLabelTitle, @@ -17,14 +18,14 @@ import { import { myUserPreferences } from './__generated__/myUserPreferences' const languagePreferences = [ - { key: 1, text: 'English', flag: 'uk', value: LanguageTranslation.English }, - { key: 2, text: 'Français', flag: 'fr', value: LanguageTranslation.French }, - { key: 3, text: 'Svenska', flag: 'se', value: LanguageTranslation.Swedish }, - { key: 4, text: 'Dansk', flag: 'dk', value: LanguageTranslation.Danish }, - { key: 5, text: 'Español', flag: 'es', value: LanguageTranslation.Spanish }, - { key: 6, text: 'polski', flag: 'pl', value: LanguageTranslation.Polish }, - { key: 7, text: 'Italiano', flag: 'it', value: LanguageTranslation.Italian }, - { key: 8, text: 'Deutsch', flag: 'de', value: LanguageTranslation.German }, + { key: 1, label: 'English', flag: 'uk', value: LanguageTranslation.English }, + { key: 2, label: 'Français', flag: 'fr', value: LanguageTranslation.French }, + { key: 3, label: 'Svenska', flag: 'se', value: LanguageTranslation.Swedish }, + { key: 4, label: 'Dansk', flag: 'dk', value: LanguageTranslation.Danish }, + { key: 5, label: 'Español', flag: 'es', value: LanguageTranslation.Spanish }, + { key: 6, label: 'polski', flag: 'pl', value: LanguageTranslation.Polish }, + { key: 7, label: 'Italiano', flag: 'it', value: LanguageTranslation.Italian }, + { key: 8, label: 'Deutsch', flag: 'de', value: LanguageTranslation.German }, ] const CHANGE_USER_PREFERENCES = gql` @@ -45,6 +46,21 @@ const MY_USER_PREFERENCES = gql` } ` +const LogoutButton = () => { + const { t } = useTranslation() + + return ( + + ) +} + const UserPreferencesWrapper = styled.div` margin-bottom: 24px; ` @@ -60,7 +76,7 @@ const UserPreferences = () => { >(CHANGE_USER_PREFERENCES) const sortedLanguagePrefs = useMemo( - () => languagePreferences.sort((a, b) => a.text.localeCompare(b.text)), + () => languagePreferences.sort((a, b) => a.label.localeCompare(b.label)), [] ) @@ -73,6 +89,7 @@ const UserPreferences = () => { {t('settings.user_preferences.title', 'User preferences')} +