mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-20 14:39:06 +00:00
refactor: migrate logs (#673)
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
@use "../../../theme/v2Styles" as *;
|
||||||
|
@use "../../../theme/mixins" as *;
|
||||||
|
|
||||||
|
.link {
|
||||||
|
@include action-link;
|
||||||
|
font-size: $inner-section-text-size;
|
||||||
|
}
|
||||||
|
|
||||||
|
.linkIcon {
|
||||||
|
margin-left: $element-inner-spacing;
|
||||||
|
display: inline-block;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { MouseEvent, ReactNode } from 'react';
|
||||||
|
import { IoArrowUp } from '@react-icons/all-files/io5/IoArrowUp';
|
||||||
|
|
||||||
|
import { openLink } from '../../utils/linkUtils';
|
||||||
|
|
||||||
|
import style from './AppLink.module.scss';
|
||||||
|
|
||||||
|
interface AppLinkProps {
|
||||||
|
href: string;
|
||||||
|
children: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function AppLink(props: AppLinkProps) {
|
||||||
|
const { href, children } = props;
|
||||||
|
|
||||||
|
const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {
|
||||||
|
event.preventDefault();
|
||||||
|
openLink(href);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<a href='#!' target='_blank' rel='noreferrer' className={style.link} onClick={handleClick}>
|
||||||
|
{children} <IoArrowUp className={style.linkIcon} />
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@ interface ExternalLinkProps {
|
|||||||
inline?: boolean;
|
inline?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ModalLink(props: ExternalLinkProps) {
|
export default function ExternalLink(props: ExternalLinkProps) {
|
||||||
const { href, inline, children } = props;
|
const { href, inline, children } = props;
|
||||||
const classes = cx([style.link, inline ? style.inline : null]);
|
const classes = cx([style.link, inline ? style.inline : null]);
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ $button-size: 48px;
|
|||||||
@include action-link;
|
@include action-link;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $menu-hover-bg;
|
background-color: $menu-hover-bg;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ type EditorSettings = {
|
|||||||
showQuickEntry: boolean;
|
showQuickEntry: boolean;
|
||||||
startTimeIsLastEnd: boolean;
|
startTimeIsLastEnd: boolean;
|
||||||
defaultPublic: boolean;
|
defaultPublic: boolean;
|
||||||
showNif: boolean;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type EditorSettingsStore = {
|
type EditorSettingsStore = {
|
||||||
@@ -15,14 +14,12 @@ type EditorSettingsStore = {
|
|||||||
setShowQuickEntry: (showQuickEntry: boolean) => void;
|
setShowQuickEntry: (showQuickEntry: boolean) => void;
|
||||||
setStartTimeIsLastEnd: (startTimeIsLastEnd: boolean) => void;
|
setStartTimeIsLastEnd: (startTimeIsLastEnd: boolean) => void;
|
||||||
setDefaultPublic: (defaultPublic: boolean) => void;
|
setDefaultPublic: (defaultPublic: boolean) => void;
|
||||||
setShowNif: (showNif: boolean) => void;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EditorSettingsKeys {
|
enum EditorSettingsKeys {
|
||||||
ShowQuickEntry = 'ontime-show-quick-entry',
|
ShowQuickEntry = 'ontime-show-quick-entry',
|
||||||
StartTimeIsLastEnd = 'ontime-start-is-last-end',
|
StartTimeIsLastEnd = 'ontime-start-is-last-end',
|
||||||
DefaultPublic = 'ontime-default-public',
|
DefaultPublic = 'ontime-default-public',
|
||||||
ShowNif = 'ontime-show-nif',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useEditorSettings = create<EditorSettingsStore>((set) => ({
|
export const useEditorSettings = create<EditorSettingsStore>((set) => ({
|
||||||
@@ -30,7 +27,6 @@ export const useEditorSettings = create<EditorSettingsStore>((set) => ({
|
|||||||
showQuickEntry: booleanFromLocalStorage(EditorSettingsKeys.ShowQuickEntry, false),
|
showQuickEntry: booleanFromLocalStorage(EditorSettingsKeys.ShowQuickEntry, false),
|
||||||
startTimeIsLastEnd: booleanFromLocalStorage(EditorSettingsKeys.ShowQuickEntry, true),
|
startTimeIsLastEnd: booleanFromLocalStorage(EditorSettingsKeys.ShowQuickEntry, true),
|
||||||
defaultPublic: booleanFromLocalStorage(EditorSettingsKeys.ShowQuickEntry, true),
|
defaultPublic: booleanFromLocalStorage(EditorSettingsKeys.ShowQuickEntry, true),
|
||||||
showNif: booleanFromLocalStorage(EditorSettingsKeys.ShowNif, true),
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setLocalEventSettings: (value) =>
|
setLocalEventSettings: (value) =>
|
||||||
@@ -58,10 +54,4 @@ export const useEditorSettings = create<EditorSettingsStore>((set) => ({
|
|||||||
localStorage.setItem(EditorSettingsKeys.DefaultPublic, String(defaultPublic));
|
localStorage.setItem(EditorSettingsKeys.DefaultPublic, String(defaultPublic));
|
||||||
return { eventSettings: { ...state.eventSettings, defaultPublic } };
|
return { eventSettings: { ...state.eventSettings, defaultPublic } };
|
||||||
}),
|
}),
|
||||||
|
|
||||||
setShowNif: (showNif) =>
|
|
||||||
set((state) => {
|
|
||||||
localStorage.setItem(EditorSettingsKeys.ShowNif, String(showNif));
|
|
||||||
return { eventSettings: { ...state.eventSettings, showNif } };
|
|
||||||
}),
|
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { ErrorBoundary } from '@sentry/react';
|
|||||||
import { useKeyDown } from '../../common/hooks/useKeyDown';
|
import { useKeyDown } from '../../common/hooks/useKeyDown';
|
||||||
|
|
||||||
import AboutPanel from './panel/about-panel/AboutPanel';
|
import AboutPanel from './panel/about-panel/AboutPanel';
|
||||||
|
import LogPanel from './panel/log-panel/LogPanel';
|
||||||
import ProjectPanel from './panel/project-panel/ProjectPanel';
|
import ProjectPanel from './panel/project-panel/ProjectPanel';
|
||||||
import PanelContent from './panel-content/PanelContent';
|
import PanelContent from './panel-content/PanelContent';
|
||||||
import PanelList from './panel-list/PanelList';
|
import PanelList from './panel-list/PanelList';
|
||||||
@@ -26,6 +27,7 @@ export default function AppSettings() {
|
|||||||
<PanelContent onClose={closeSettings}>
|
<PanelContent onClose={closeSettings}>
|
||||||
{selectedPanel === 'project' && <ProjectPanel />}
|
{selectedPanel === 'project' && <ProjectPanel />}
|
||||||
{selectedPanel === 'about' && <AboutPanel />}
|
{selectedPanel === 'about' && <AboutPanel />}
|
||||||
|
{selectedPanel === 'log' && <LogPanel />}
|
||||||
</PanelContent>
|
</PanelContent>
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+9
-10
@@ -1,20 +1,19 @@
|
|||||||
@use '../../theme/v2Styles' as *;
|
@use '../../../../theme/ontimeColours' as *;
|
||||||
@use '../../theme/mixins' as *;
|
@use '../../../../theme/v2Styles' as *;
|
||||||
|
|
||||||
$info-gray: $secondary-text-gray;
|
$info-gray: $secondary-text-gray;
|
||||||
$info-hover: $section-white;
|
$info-hover: $section-white;
|
||||||
|
|
||||||
.log {
|
.log {
|
||||||
flex: 1;
|
font-size: $inner-section-text-size;
|
||||||
height: 100%;
|
overflow-y: auto;
|
||||||
overflow-y: scroll;
|
|
||||||
font-size: 0.8em;
|
|
||||||
user-select: text;
|
user-select: text;
|
||||||
|
min-height: 10vh;
|
||||||
|
max-height: 40vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logEntry {
|
.logEntry {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-bottom: 2px;
|
|
||||||
|
|
||||||
&.INFO {
|
&.INFO {
|
||||||
color: $info-gray;
|
color: $info-gray;
|
||||||
@@ -33,7 +32,7 @@ $info-hover: $section-white;
|
|||||||
}
|
}
|
||||||
|
|
||||||
.time {
|
.time {
|
||||||
width: 4.5em
|
width: 4.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.origin {
|
.origin {
|
||||||
@@ -48,7 +47,7 @@ $info-hover: $section-white;
|
|||||||
.buttonBar {
|
.buttonBar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 8px;
|
gap: 0.5rem;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
margin-bottom: 8px;
|
padding-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
+10
-10
@@ -2,11 +2,11 @@ import { useCallback, useState } from 'react';
|
|||||||
import { Button } from '@chakra-ui/react';
|
import { Button } from '@chakra-ui/react';
|
||||||
import { LogOrigin } from 'ontime-types';
|
import { LogOrigin } from 'ontime-types';
|
||||||
|
|
||||||
import { clearLogs, useLogData } from '../../common/stores/logger';
|
import { clearLogs, useLogData } from '../../../../common/stores/logger';
|
||||||
|
|
||||||
import style from './InfoLogger.module.scss';
|
import style from './Log.module.scss';
|
||||||
|
|
||||||
export default function InfoLogger() {
|
export default function Log() {
|
||||||
const { logs: logData } = useLogData();
|
const { logs: logData } = useLogData();
|
||||||
|
|
||||||
const [showClient, setShowClient] = useState(true);
|
const [showClient, setShowClient] = useState(true);
|
||||||
@@ -52,7 +52,7 @@ export default function InfoLogger() {
|
|||||||
<div className={style.buttonBar}>
|
<div className={style.buttonBar}>
|
||||||
<Button
|
<Button
|
||||||
variant={showUser ? 'ontime-filled' : 'ontime-subtle'}
|
variant={showUser ? 'ontime-filled' : 'ontime-subtle'}
|
||||||
size='xs'
|
size='sm'
|
||||||
onClick={() => setShowUser((s) => !s)}
|
onClick={() => setShowUser((s) => !s)}
|
||||||
onAuxClick={() => disableOthers(LogOrigin.User)}
|
onAuxClick={() => disableOthers(LogOrigin.User)}
|
||||||
onContextMenu={(e) => e.preventDefault()}
|
onContextMenu={(e) => e.preventDefault()}
|
||||||
@@ -61,7 +61,7 @@ export default function InfoLogger() {
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant={showClient ? 'ontime-filled' : 'ontime-subtle'}
|
variant={showClient ? 'ontime-filled' : 'ontime-subtle'}
|
||||||
size='xs'
|
size='sm'
|
||||||
onClick={() => setShowClient((s) => !s)}
|
onClick={() => setShowClient((s) => !s)}
|
||||||
onAuxClick={() => disableOthers(LogOrigin.Client)}
|
onAuxClick={() => disableOthers(LogOrigin.Client)}
|
||||||
onContextMenu={(e) => e.preventDefault()}
|
onContextMenu={(e) => e.preventDefault()}
|
||||||
@@ -70,7 +70,7 @@ export default function InfoLogger() {
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant={showServer ? 'ontime-filled' : 'ontime-subtle'}
|
variant={showServer ? 'ontime-filled' : 'ontime-subtle'}
|
||||||
size='xs'
|
size='sm'
|
||||||
onClick={() => setShowServer((s) => !s)}
|
onClick={() => setShowServer((s) => !s)}
|
||||||
onAuxClick={() => disableOthers(LogOrigin.Server)}
|
onAuxClick={() => disableOthers(LogOrigin.Server)}
|
||||||
onContextMenu={(e) => e.preventDefault()}
|
onContextMenu={(e) => e.preventDefault()}
|
||||||
@@ -79,7 +79,7 @@ export default function InfoLogger() {
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant={showPlayback ? 'ontime-filled' : 'ontime-subtle'}
|
variant={showPlayback ? 'ontime-filled' : 'ontime-subtle'}
|
||||||
size='xs'
|
size='sm'
|
||||||
onClick={() => setShowPlayback((s) => !s)}
|
onClick={() => setShowPlayback((s) => !s)}
|
||||||
onAuxClick={() => disableOthers(LogOrigin.Playback)}
|
onAuxClick={() => disableOthers(LogOrigin.Playback)}
|
||||||
onContextMenu={(e) => e.preventDefault()}
|
onContextMenu={(e) => e.preventDefault()}
|
||||||
@@ -88,7 +88,7 @@ export default function InfoLogger() {
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant={showRx ? 'ontime-filled' : 'ontime-subtle'}
|
variant={showRx ? 'ontime-filled' : 'ontime-subtle'}
|
||||||
size='xs'
|
size='sm'
|
||||||
onClick={() => setShowRx((s) => !s)}
|
onClick={() => setShowRx((s) => !s)}
|
||||||
onAuxClick={() => disableOthers(LogOrigin.Rx)}
|
onAuxClick={() => disableOthers(LogOrigin.Rx)}
|
||||||
onContextMenu={(e) => e.preventDefault()}
|
onContextMenu={(e) => e.preventDefault()}
|
||||||
@@ -97,14 +97,14 @@ export default function InfoLogger() {
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant={showTx ? 'ontime-filled' : 'ontime-subtle'}
|
variant={showTx ? 'ontime-filled' : 'ontime-subtle'}
|
||||||
size='xs'
|
size='sm'
|
||||||
onClick={() => setShowTx((s) => !s)}
|
onClick={() => setShowTx((s) => !s)}
|
||||||
onAuxClick={() => disableOthers(LogOrigin.Tx)}
|
onAuxClick={() => disableOthers(LogOrigin.Tx)}
|
||||||
onContextMenu={(e) => e.preventDefault()}
|
onContextMenu={(e) => e.preventDefault()}
|
||||||
>
|
>
|
||||||
{LogOrigin.Tx}
|
{LogOrigin.Tx}
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant='ontime-outlined' size='xs' onClick={clearLogs}>
|
<Button variant='ontime-outlined' size='sm' onClick={clearLogs}>
|
||||||
Clear
|
Clear
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import * as Panel from '../PanelUtils';
|
||||||
|
|
||||||
|
import Log from './Log';
|
||||||
|
import InfoNif from './NetworkInterfaces';
|
||||||
|
|
||||||
|
export default function LogPanel() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Panel.Header>Application log</Panel.Header>
|
||||||
|
<Panel.Section>
|
||||||
|
<Panel.SubHeader>Available networks</Panel.SubHeader>
|
||||||
|
<Panel.Card>
|
||||||
|
<Panel.Paragraph>Ontime is streaming on the following network interfaces</Panel.Paragraph>
|
||||||
|
<InfoNif />
|
||||||
|
</Panel.Card>
|
||||||
|
</Panel.Section>
|
||||||
|
|
||||||
|
<Panel.Section>
|
||||||
|
<Panel.SubHeader>Network log</Panel.SubHeader>
|
||||||
|
<Panel.Card>
|
||||||
|
<Log />
|
||||||
|
</Panel.Card>
|
||||||
|
</Panel.Section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
@use '../../../../theme/v2Styles' as *;
|
||||||
|
|
||||||
|
.interfaces {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: $section-spacing;
|
||||||
|
row-gap: $element-inner-spacing;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { serverPort } from '../../../../common/api/apiConstants';
|
||||||
|
import AppLink from '../../../../common/components/app-link/AppLink';
|
||||||
|
import useInfo from '../../../../common/hooks-query/useInfo';
|
||||||
|
|
||||||
|
import style from './NetworkInterfaces.module.scss';
|
||||||
|
|
||||||
|
export default function InfoNif() {
|
||||||
|
const { data } = useInfo();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={style.interfaces}>
|
||||||
|
{data?.networkInterfaces?.map((nif) => (
|
||||||
|
<AppLink key={nif.address} href={`http://${nif.address}:${serverPort}`}>
|
||||||
|
{`${nif.name} - ${nif.address}`}
|
||||||
|
</AppLink>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -43,23 +43,3 @@
|
|||||||
margin-left: $element-inner-spacing;
|
margin-left: $element-inner-spacing;
|
||||||
font-size: $text-body-size;
|
font-size: $text-body-size;
|
||||||
}
|
}
|
||||||
|
|
||||||
.interfaceList {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: $section-spacing;
|
|
||||||
row-gap: $element-inner-spacing;
|
|
||||||
|
|
||||||
.interface {
|
|
||||||
@include action-link;
|
|
||||||
font-size: $inner-section-text-size;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.linkIcon {
|
|
||||||
margin-left: $element-inner-spacing;
|
|
||||||
display: inline-block;
|
|
||||||
transform: rotate(45deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
import { useInfoPanel } from '../../common/hooks/useSocket';
|
import { useInfoPanel } from '../../common/hooks/useSocket';
|
||||||
import { useEditorSettings } from '../../common/stores/editorSettings';
|
|
||||||
|
|
||||||
import CollapsableInfo from './CollapsableInfo';
|
import CollapsableInfo from './CollapsableInfo';
|
||||||
import InfoLogger from './InfoLogger';
|
|
||||||
import InfoNif from './InfoNif';
|
|
||||||
import InfoTitles from './InfoTitles';
|
import InfoTitles from './InfoTitles';
|
||||||
|
|
||||||
export default function Info() {
|
export default function Info() {
|
||||||
const data = useInfoPanel();
|
const data = useInfoPanel();
|
||||||
const showNif = useEditorSettings((state) => state.eventSettings.showNif);
|
|
||||||
|
|
||||||
const titlesNow = {
|
const titlesNow = {
|
||||||
title: data.eventNow?.title || '',
|
title: data.eventNow?.title || '',
|
||||||
@@ -26,20 +22,12 @@ export default function Info() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{showNif && (
|
|
||||||
<CollapsableInfo title='Network Info'>
|
|
||||||
<InfoNif />
|
|
||||||
</CollapsableInfo>
|
|
||||||
)}
|
|
||||||
<CollapsableInfo title='Playing Now'>
|
<CollapsableInfo title='Playing Now'>
|
||||||
<InfoTitles data={titlesNow} />
|
<InfoTitles data={titlesNow} />
|
||||||
</CollapsableInfo>
|
</CollapsableInfo>
|
||||||
<CollapsableInfo title='Playing Next'>
|
<CollapsableInfo title='Playing Next'>
|
||||||
<InfoTitles data={titlesNext} />
|
<InfoTitles data={titlesNext} />
|
||||||
</CollapsableInfo>
|
</CollapsableInfo>
|
||||||
<CollapsableInfo title='Log'>
|
|
||||||
<InfoLogger />
|
|
||||||
</CollapsableInfo>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
import { IoArrowUp } from '@react-icons/all-files/io5/IoArrowUp';
|
|
||||||
|
|
||||||
import { serverPort } from '../../common/api/apiConstants';
|
|
||||||
import useInfo from '../../common/hooks-query/useInfo';
|
|
||||||
import { openLink } from '../../common/utils/linkUtils';
|
|
||||||
|
|
||||||
import style from './Info.module.scss';
|
|
||||||
|
|
||||||
export default function InfoNif() {
|
|
||||||
const { data } = useInfo();
|
|
||||||
|
|
||||||
const handleClick = (address: string) => {
|
|
||||||
const baseURL = `http://__IP__:${serverPort}`;
|
|
||||||
openLink(baseURL.replace('__IP__', address));
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className={style.interfaceList}>
|
|
||||||
{data?.networkInterfaces?.map((nif) => (
|
|
||||||
<span key={nif.address} onClick={() => handleClick(nif.address)} className={style.interface}>
|
|
||||||
{`${nif.name} - ${nif.address}`}
|
|
||||||
<IoArrowUp className={style.linkIcon} />
|
|
||||||
</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,6 @@ export default function EditorSettings() {
|
|||||||
const setShowQuickEntry = useEditorSettings((state) => state.setShowQuickEntry);
|
const setShowQuickEntry = useEditorSettings((state) => state.setShowQuickEntry);
|
||||||
const setStartTimeIsLastEnd = useEditorSettings((state) => state.setStartTimeIsLastEnd);
|
const setStartTimeIsLastEnd = useEditorSettings((state) => state.setStartTimeIsLastEnd);
|
||||||
const setDefaultPublic = useEditorSettings((state) => state.setDefaultPublic);
|
const setDefaultPublic = useEditorSettings((state) => state.setDefaultPublic);
|
||||||
const setShowNif = useEditorSettings((state) => state.setShowNif);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={style.sectionContainer}>
|
<div className={style.sectionContainer}>
|
||||||
@@ -40,18 +39,6 @@ export default function EditorSettings() {
|
|||||||
onChange={(event) => setDefaultPublic(event.target.checked)}
|
onChange={(event) => setDefaultPublic(event.target.checked)}
|
||||||
/>
|
/>
|
||||||
</ModalSplitInput>
|
</ModalSplitInput>
|
||||||
<span className={style.title}>Info settings</span>
|
|
||||||
<ModalSplitInput
|
|
||||||
field=''
|
|
||||||
title='Show network'
|
|
||||||
description='Whether to available show network interfaces in the panel'
|
|
||||||
>
|
|
||||||
<Switch
|
|
||||||
variant='ontime-on-light'
|
|
||||||
defaultChecked={eventSettings.showQuickEntry}
|
|
||||||
onChange={(event) => setShowNif(event.target.checked)}
|
|
||||||
/>
|
|
||||||
</ModalSplitInput>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition-property: color;
|
transition-property: color;
|
||||||
transition-duration: $transition-time-action;
|
transition-duration: $transition-time-action;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $ontime-color;
|
color: $ontime-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user