diff --git a/rsconcept/frontend/src/context/ConceptOptionsContext.tsx b/rsconcept/frontend/src/context/ConceptOptionsContext.tsx index 94697905..434c6955 100644 --- a/rsconcept/frontend/src/context/ConceptOptionsContext.tsx +++ b/rsconcept/frontend/src/context/ConceptOptionsContext.tsx @@ -34,6 +34,12 @@ interface IOptionsContext { showHelp: boolean; toggleShowHelp: () => void; + folderMode: boolean; + setFolderMode: React.Dispatch>; + + location: string; + setLocation: React.Dispatch>; + calculateHeight: (offset: string, minimum?: string) => string; } @@ -56,6 +62,9 @@ export const OptionsState = ({ children }: OptionsStateProps) => { const [showHelp, setShowHelp] = useLocalStorage(storage.optionsHelp, true); const [noNavigation, setNoNavigation] = useState(false); + const [folderMode, setFolderMode] = useLocalStorage(storage.librarySearchFolderMode, true); + const [location, setLocation] = useLocalStorage(storage.librarySearchLocation, ''); + const [colors, setColors] = useState(lightT); const [noNavigationAnimation, setNoNavigationAnimation] = useState(false); @@ -131,6 +140,10 @@ export const OptionsState = ({ children }: OptionsStateProps) => { noNavigationAnimation, noNavigation, noFooter, + folderMode, + setFolderMode, + location, + setLocation, showScroll, showHelp, toggleDarkMode: toggleDarkMode, diff --git a/rsconcept/frontend/src/pages/CreateItemPage/FormCreateItem.tsx b/rsconcept/frontend/src/pages/CreateItemPage/FormCreateItem.tsx index 3bbb3100..1fa85877 100644 --- a/rsconcept/frontend/src/pages/CreateItemPage/FormCreateItem.tsx +++ b/rsconcept/frontend/src/pages/CreateItemPage/FormCreateItem.tsx @@ -20,17 +20,18 @@ import SubmitButton from '@/components/ui/SubmitButton'; import TextArea from '@/components/ui/TextArea'; import TextInput from '@/components/ui/TextInput'; import { useAuth } from '@/context/AuthContext'; +import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { useLibrary } from '@/context/LibraryContext'; import { useConceptNavigation } from '@/context/NavigationContext'; -import useLocalStorage from '@/hooks/useLocalStorage'; import { AccessPolicy, LibraryItemType, LocationHead } from '@/models/library'; import { ILibraryCreateData } from '@/models/library'; import { combineLocation, validateLocation } from '@/models/libraryAPI'; -import { EXTEOR_TRS_FILE, storage } from '@/utils/constants'; +import { EXTEOR_TRS_FILE } from '@/utils/constants'; import { information } from '@/utils/labels'; function FormCreateItem() { const router = useConceptNavigation(); + const options = useConceptOptions(); const { user } = useAuth(); const { createItem, processingError, setProcessingError, processing, folders } = useLibrary(); @@ -46,7 +47,6 @@ function FormCreateItem() { const location = useMemo(() => combineLocation(head, body), [head, body]); const isValid = useMemo(() => validateLocation(location), [location]); - const [initLocation, setInitLocation] = useLocalStorage(storage.librarySearchLocation, ''); const [fileName, setFileName] = useState(''); const [file, setFile] = useState(); @@ -81,7 +81,7 @@ function FormCreateItem() { file: file, fileName: file?.name }; - setInitLocation(location); + options.setLocation(location); createItem(data, newItem => { toast.success(information.newLibraryItem); if (itemType == LibraryItemType.RSFORM) { @@ -108,11 +108,11 @@ function FormCreateItem() { }, []); useLayoutEffect(() => { - if (!initLocation) { + if (!options.location) { return; } - handleSelectLocation(initLocation); - }, [initLocation, handleSelectLocation]); + handleSelectLocation(options.location); + }, [options.location, handleSelectLocation]); useLayoutEffect(() => { if (itemType !== LibraryItemType.RSFORM) { diff --git a/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx b/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx index 05851dde..d1b95b3c 100644 --- a/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx +++ b/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx @@ -10,6 +10,7 @@ import MiniButton from '@/components/ui/MiniButton'; import Overlay from '@/components/ui/Overlay'; import DataLoader from '@/components/wrap/DataLoader'; import { useAuth } from '@/context/AuthContext'; +import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { useLibrary } from '@/context/LibraryContext'; import DlgChangeLocation from '@/dialogs/DlgChangeLocation'; import useLocalStorage from '@/hooks/useLocalStorage'; @@ -27,14 +28,13 @@ function LibraryPage() { const library = useLibrary(); const { user } = useAuth(); const [items, setItems] = useState([]); + const options = useConceptOptions(); const [query, setQuery] = useState(''); const [path, setPath] = useState(''); const [head, setHead] = useLocalStorage(storage.librarySearchHead, undefined); - const [folderMode, setFolderMode] = useLocalStorage(storage.librarySearchFolderMode, true); const [subfolders, setSubfolders] = useLocalStorage(storage.librarySearchSubfolders, false); - const [location, setLocation] = useLocalStorage(storage.librarySearchLocation, ''); const [isVisible, setIsVisible] = useLocalStorage(storage.librarySearchVisible, true); const [isOwned, setIsOwned] = useLocalStorage(storage.librarySearchEditor, undefined); const [isEditor, setIsEditor] = useLocalStorage(storage.librarySearchEditor, undefined); @@ -48,11 +48,11 @@ function LibraryPage() { isEditor: user ? isEditor : undefined, isOwned: user ? isOwned : undefined, isVisible: user ? isVisible : true, - folderMode: folderMode, + folderMode: options.folderMode, subfolders: subfolders, - location: location + location: options.location }), - [head, path, query, isEditor, isOwned, isVisible, user, folderMode, location, subfolders] + [head, path, query, isEditor, isOwned, isVisible, user, options.folderMode, options.location, subfolders] ); const hasCustomFilter = useMemo( @@ -74,7 +74,7 @@ function LibraryPage() { const toggleVisible = useCallback(() => setIsVisible(prev => toggleTristateFlag(prev)), [setIsVisible]); const toggleOwned = useCallback(() => setIsOwned(prev => toggleTristateFlag(prev)), [setIsOwned]); const toggleEditor = useCallback(() => setIsEditor(prev => toggleTristateFlag(prev)), [setIsEditor]); - const toggleFolderMode = useCallback(() => setFolderMode(prev => !prev), [setFolderMode]); + const toggleFolderMode = useCallback(() => options.setFolderMode(prev => !prev), [options.setFolderMode]); const toggleSubfolders = useCallback(() => setSubfolders(prev => !prev), [setSubfolders]); const resetFilter = useCallback(() => { @@ -84,8 +84,8 @@ function LibraryPage() { setIsVisible(true); setIsOwned(undefined); setIsEditor(undefined); - setLocation(''); - }, [setHead, setIsVisible, setIsOwned, setIsEditor, setLocation]); + options.setLocation(''); + }, [setHead, setIsVisible, setIsOwned, setIsEditor, options.setLocation]); const promptRenameLocation = useCallback(() => { setShowRenameLocation(true); @@ -94,11 +94,11 @@ function LibraryPage() { const handleRenameLocation = useCallback( (newLocation: string) => { const data: IRenameLocationData = { - target: location, + target: options.location, new_location: newLocation }; library.renameLocation(data, () => { - setLocation(newLocation); + options.setLocation(newLocation); toast.success(information.locationRenamed); }); }, @@ -123,18 +123,18 @@ function LibraryPage() { ), - [resetFilter, items, folderMode, toggleFolderMode] + [resetFilter, items, options.folderMode, toggleFolderMode] ); const viewLocations = useMemo( () => ( ), - [location, library.folders, setLocation, toggleFolderMode, subfolders] + [options.location, library.folders, options.setLocation, toggleFolderMode, subfolders] ); return ( @@ -154,12 +154,16 @@ function LibraryPage() { > {showRenameLocation ? ( setShowRenameLocation(false)} /> ) : null} - + } @@ -183,12 +187,12 @@ function LibraryPage() { isEditor={isEditor} toggleEditor={toggleEditor} resetFilter={resetFilter} - folderMode={folderMode} + folderMode={options.folderMode} toggleFolderMode={toggleFolderMode} />
- {folderMode ? viewLocations : null} + {options.folderMode ? viewLocations : null} {viewLibrary}
diff --git a/rsconcept/frontend/src/pages/LibraryPage/ToolbarSearch.tsx b/rsconcept/frontend/src/pages/LibraryPage/ToolbarSearch.tsx index bba15425..4c33ba7c 100644 --- a/rsconcept/frontend/src/pages/LibraryPage/ToolbarSearch.tsx +++ b/rsconcept/frontend/src/pages/LibraryPage/ToolbarSearch.tsx @@ -96,15 +96,20 @@ function ToolbarSearch({
{filtered} из {total}
@@ -138,7 +143,7 @@ function ToolbarSearch({
) : null} -
+
{ + if (!item) { + return; + } + options.setLocation(item.location); + options.setFolderMode(true); + router.push(urls.library, event.ctrlKey || event.metaKey); + }, + [options.setLocation, options.setFolderMode, item, router] + ); + if (!item) { return null; } return (
- } - value={item.location} - title={controller.isAttachedToOSS ? 'Путь наследуется от ОСС' : 'Путь'} - onClick={controller.promptLocation} - disabled={isModified || controller.isProcessing || controller.isAttachedToOSS || accessLevel < UserLevel.OWNER} - /> +
+ } + onClick={handleOpenLibrary} + /> + } + value={item.location} + title={controller.isAttachedToOSS ? 'Путь наследуется от ОСС' : 'Путь'} + onClick={controller.promptLocation} + disabled={ + isModified || controller.isProcessing || controller.isAttachedToOSS || accessLevel < UserLevel.OWNER + } + /> +
{ownerSelector.isOpen ? ( diff --git a/rsconcept/frontend/src/pages/RSFormPage/MenuRSTabs.tsx b/rsconcept/frontend/src/pages/RSFormPage/MenuRSTabs.tsx index 87b902b5..4d3735d5 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/MenuRSTabs.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/MenuRSTabs.tsx @@ -27,9 +27,9 @@ import { IconUpload } from '@/components/Icons'; import Button from '@/components/ui/Button'; -import DropdownDivider from '@/components/ui/DropdownDivider'; import Dropdown from '@/components/ui/Dropdown'; import DropdownButton from '@/components/ui/DropdownButton'; +import DropdownDivider from '@/components/ui/DropdownDivider'; import { useAccessMode } from '@/context/AccessModeContext'; import { useAuth } from '@/context/AuthContext'; import { useGlobalOss } from '@/context/GlobalOssContext';