Add navigation hide btn and improve styling

This commit is contained in:
IRBorisov 2023-07-21 01:50:57 +03:00
parent 94961deb8a
commit 53868d48d7
10 changed files with 84 additions and 22 deletions

View File

@ -25,7 +25,7 @@ function App() {
pauseOnFocusLoss={false} pauseOnFocusLoss={false}
limit={5} limit={5}
/> />
<main className='min-h-[calc(100vh-6.8rem)] px-2 h-fit'> <main className='min-h-[calc(100vh-7.5rem)] px-2 h-fit'>
<Routes> <Routes>
<Route path='/' element={ <HomePage/>} /> <Route path='/' element={ <HomePage/>} />

View File

@ -5,10 +5,9 @@ interface SubmitButtonProps {
} }
function SubmitButton({text='ОК', disabled, loading=false}: SubmitButtonProps) { function SubmitButton({text='ОК', disabled, loading=false}: SubmitButtonProps) {
const style = 'px-4 py-2 font-bold text-white disabled:cursor-not-allowed bg-blue-500 rounded hover:bg-blue-700 dark:bg-orange-500 dark:hover:bg-orange-300 disabled:bg-gray-400'
return ( return (
<button type='submit' <button type='submit'
className={style + (loading ? ' cursor-progress': '')} className={`px-4 py-2 font-bold text-white disabled:cursor-not-allowed rounded clr-btn-primary ${loading ? ' cursor-progress': ''}`}
disabled={disabled} disabled={disabled}
> >
{text} {text}

View File

@ -3,7 +3,7 @@ import { urls } from '../utils/constants';
function Footer() { function Footer() {
return ( return (
<footer className='z-50 px-4 py-4 text-gray-600 bg-white border-t-2 border-gray-400 dark:bg-gray-700 dark:border-gray-300 dark:text-gray-300'> <footer className='z-50 px-4 pt-2 pb-4 text-gray-600 bg-white border-t-2 border-gray-400 dark:bg-gray-700 dark:border-gray-300 dark:text-gray-300'>
<div className='flex items-stretch justify-center w-full mx-auto'> <div className='flex items-stretch justify-center w-full mx-auto'>
<div className='px-4 underline'> <div className='px-4 underline'>
<Link to='manuals' tabIndex={-1}>Справка</Link> <br/> <Link to='manuals' tabIndex={-1}>Справка</Link> <br/>

View File

@ -6,22 +6,40 @@ import UserMenu from './UserMenu';
import { useAuth } from '../../context/AuthContext'; import { useAuth } from '../../context/AuthContext';
import UserTools from './UserTools'; import UserTools from './UserTools';
import Logo from './Logo'; import Logo from './Logo';
import { useState } from 'react';
function Navigation() { function Navigation() {
const {user} = useAuth(); const {user} = useAuth();
const navigate = useNavigate(); const navigate = useNavigate();
const [isActive, setActive] = useState(true);
const navigateCommon = () => navigate('/rsforms?filter=common'); const navigateCommon = () => navigate('/rsforms?filter=common');
const navigateHelp = () => navigate('/manuals'); const navigateHelp = () => navigate('/manuals');
return ( return (
<nav className='bg-white dark:bg-gray-700 border-b-2 border-gray-400 rounded dark:border-gray-300 px-4 py-2.5 sticky top-0 left-0 right-0 z-50 h-[4rem]'> <nav className='sticky top-0 left-0 right-0 z-50'>
<div className='flex items-center justify-between '> {isActive &&
<button
title='Скрыть навигацию'
className='absolute top-0 right-0 z-[60] border-b-2 border-l-2 clr-nav w-[1.2rem] h-[4rem] '
onClick={() => setActive(!isActive)}
>
<p>{'>'}</p><p>{'>'}</p>
</button>}
{!isActive &&
<button
title='Показать навигацию'
className='absolute top-0 right-0 z-[60] border-b-2 border-l-2 clr-nav w-[4rem] h-[1.6rem]'
onClick={() => setActive(!isActive)}
>
{''}
</button>}
{isActive &&
<div className='border-b-2 clr-nav pr-6 pl-2 py-2.5 h-[4rem] flex items-center justify-between '>
<div className='flex items-start justify-start '> <div className='flex items-start justify-start '>
<Logo title='КонцептПортал' /> <Logo title='КонцептПортал' />
<TopSearch placeholder='Поиск схемы...' /> <TopSearch placeholder='Поиск схемы...' />
</div> </div>
<div className='flex items-center'> <div className='flex items-center'>
{user && <UserTools/>} {user && <UserTools/>}
<div className='flex items-center pl-2'> <div className='flex items-center pl-2'>
@ -30,7 +48,7 @@ function Navigation() {
<UserMenu /> <UserMenu />
</div> </div>
</div> </div>
</div> </div>}
</nav> </nav>
); );
} }

View File

@ -23,10 +23,18 @@
@apply text-zinc-200 bg-gray-900 @apply text-zinc-200 bg-gray-900
} }
.clr-nav {
@apply border-gray-400 dark:border-gray-300 bg-white dark:bg-gray-700 rounded-none
}
.clr-hover { .clr-hover {
@apply hover:bg-gray-50 hover:text-gray-700 dark:hover:text-white dark:hover:bg-gray-500 @apply hover:bg-gray-50 hover:text-gray-700 dark:hover:text-white dark:hover:bg-gray-500
} }
.clr-btn-primary {
@apply bg-blue-400 hover:bg-blue-600 dark:bg-orange-600 dark:hover:bg-orange-400 disabled:bg-gray-400 dark:disabled:bg-gray-400
}
.text-red { .text-red {
@apply text-red-400 dark:text-red-600 @apply text-red-400 dark:text-red-600
} }

View File

@ -78,7 +78,7 @@ function ConstituentEditor() {
return ( return (
<div className='flex items-start w-full gap-2'> <div className='flex items-start w-full gap-2'>
<form onSubmit={handleSubmit} className='flex-grow min-w-[50rem] max-w-min px-4 py-2 border'> <form onSubmit={handleSubmit} className='flex-grow min-w-[50rem] max-w-min px-4 py-2 border'>
<div className='flex items-center justify-between gap-1'> <div className='flex items-start justify-between gap-1'>
<span className='mr-12'> <span className='mr-12'>
<label <label
title='Переименовать конституенту' title='Переименовать конституенту'
@ -89,6 +89,9 @@ function ConstituentEditor() {
</label> </label>
<b className='ml-2'>{alias}</b> <b className='ml-2'>{alias}</b>
</span> </span>
<div className='mt-2 h-[1rem]'>
<SubmitButton text='Сохранить изменения' disabled={!isEditable} />
</div>
<span> <span>
<label <label
title='Изменить тип конституенты' title='Изменить тип конституенты'
@ -141,9 +144,7 @@ function ConstituentEditor() {
onChange={event => setConvention(event.target.value)} onChange={event => setConvention(event.target.value)}
onFocus={() => setEditMode(EditMode.TEXT)} onFocus={() => setEditMode(EditMode.TEXT)}
/> />
<div className='flex items-center justify-between gap-1 py-2 mt-2'>
<SubmitButton text='Сохранить изменения' disabled={!isEditable} />
</div>
</form> </form>
<ConstituentsSideList expression={expression}/> <ConstituentsSideList expression={expression}/>
</div> </div>

View File

@ -76,7 +76,7 @@ function ConstituentsSideList({expression}: ConstituentsSideListProps) {
return ( return (
<div className='max-h-[80vh] overflow-y-scroll border flex-grow w-full'> <div className='max-h-[80vh] overflow-y-scroll border flex-grow w-full'>
<div className='sticky top-0 left-0 right-0 z-40 flex items-center justify-between w-full gap-1 px-2 py-1 bg-white border-b-2 border-gray-400 rounded dark:bg-gray-700 dark:border-gray-300'> <div className='sticky top-0 left-0 right-0 z-10 flex items-center justify-between w-full gap-1 px-2 py-1 bg-white border-b-2 border-gray-400 rounded dark:bg-gray-700 dark:border-gray-300'>
<div className='w-full'> <div className='w-full'>
<input type='text' <input type='text'
className='w-full px-2 outline-none dark:bg-gray-700 hover:text-clip' className='w-full px-2 outline-none dark:bg-gray-700 hover:text-clip'

View File

@ -13,7 +13,7 @@ interface ConstituentsTableProps {
} }
function ConstituentsTable({onOpenEdit}: ConstituentsTableProps) { function ConstituentsTable({onOpenEdit}: ConstituentsTableProps) {
const { schema, isEditable } = useRSForm(); const { schema, isEditable, } = useRSForm();
const [selectedRows, setSelectedRows] = useState<IConstituenta[]>([]); const [selectedRows, setSelectedRows] = useState<IConstituenta[]>([]);
const nothingSelected = useMemo(() => selectedRows.length === 0, [selectedRows]); const nothingSelected = useMemo(() => selectedRows.length === 0, [selectedRows]);
@ -25,9 +25,9 @@ function ConstituentsTable({onOpenEdit}: ConstituentsTableProps) {
const handleRowClicked = useCallback( const handleRowClicked = useCallback(
(cst: IConstituenta, event: React.MouseEvent<Element, MouseEvent>) => { (cst: IConstituenta, event: React.MouseEvent<Element, MouseEvent>) => {
if (event.ctrlKey) { if (event.ctrlKey) {
console.log('ctrl + click'); onOpenEdit(cst);
} }
}, []); }, [onOpenEdit]);
const handleDelete = useCallback(() => { const handleDelete = useCallback(() => {
toast.info('Удаление конституент'); toast.info('Удаление конституент');

View File

@ -43,6 +43,31 @@ function RSFormTabs() {
} }
}, [setActive, schema, setInit]); }, [setActive, schema, setInit]);
// const [ locationKeys, setLocationKeys ] = useState([])
// const history = useHistory()
// useEffect(() => {
// return history.listen(location => {
// if (history.action === 'PUSH') {
// setLocationKeys([ location.key ])
// }
// if (history.action === 'POP') {
// if (locationKeys[1] === location.key) {
// setLocationKeys(([ _, ...keys ]) => keys)
// // Handle forward event
// } else {
// setLocationKeys((keys) => [ location.key, ...keys ])
// // Handle back event
// }
// }
// })
// }, [ locationKeys, ])
useEffect(() => { useEffect(() => {
const url = new URL(window.location.href); const url = new URL(window.location.href);
const tabQuery = url.searchParams.get('tab'); const tabQuery = url.searchParams.get('tab');
@ -51,14 +76,25 @@ function RSFormTabs() {
useEffect(() => { useEffect(() => {
if (init) { if (init) {
let url = new URL(window.location.href); const url = new URL(window.location.href);
let currentActive = url.searchParams.get('active');
const currentTab = url.searchParams.get('tab');
const saveHistory = tabIndex === TabsList.CST_EDIT && currentActive !== String(active?.entityUID);
if (currentTab !== String(tabIndex)) {
url.searchParams.set('tab', String(tabIndex)); url.searchParams.set('tab', String(tabIndex));
}
if (active) { if (active) {
if (currentActive !== String(active.entityUID)) {
url.searchParams.set('active', String(active.entityUID)); url.searchParams.set('active', String(active.entityUID));
}
} else { } else {
url.searchParams.delete('active'); url.searchParams.delete('active');
} }
if (saveHistory) {
window.history.pushState(null, '', url.toString()); window.history.pushState(null, '', url.toString());
} else {
window.history.replaceState(null, '', url.toString());
}
} }
}, [tabIndex, active, init]); }, [tabIndex, active, init]);

View File

@ -42,9 +42,9 @@ function TablistTools() {
<Dropdown> <Dropdown>
<p>клонировать</p> <p>клонировать</p>
<p>поделиться</p> <p>поделиться</p>
<DropdownButton disabled={isEditable} onClick={handleDelete}> <DropdownButton disabled={!isEditable} onClick={handleDelete}>
<div className='inline-flex items-center gap-1 justify-normal'> <div className='inline-flex items-center gap-1 justify-normal'>
<span className={isOwned ? 'text-red' : ''}><DumpBinIcon size={4} /></span> <span className={isEditable ? 'text-red' : ''}><DumpBinIcon size={4} /></span>
<p>Удалить схему</p> <p>Удалить схему</p>
</div> </div>
</DropdownButton> </DropdownButton>