From 3ac6a3577d6aa04fc2d54257fcc836897d134237 Mon Sep 17 00:00:00 2001
From: IRBorisov <8611739+IRBorisov@users.noreply.github.com>
Date: Wed, 27 Mar 2024 15:32:59 +0300
Subject: [PATCH] Refactoring: standardize localStorage and add prefix
---
.vscode/settings.json | 1 +
.../frontend/src/app/ApplicationLayout.tsx | 4 +-
.../src/app/Navigation/NavigationButton.tsx | 4 +-
.../frontend/src/components/ui/Button.tsx | 4 +-
.../frontend/src/components/ui/Checkbox.tsx | 4 +-
.../src/components/ui/CheckboxTristate.tsx | 4 +-
.../src/components/ui/DropdownButton.tsx | 4 +-
.../frontend/src/components/ui/MiniButton.tsx | 4 +-
.../src/components/ui/SelectorButton.tsx | 4 +-
.../frontend/src/components/ui/TabLabel.tsx | 4 +-
.../frontend/src/context/AuthContext.tsx | 3 +-
.../src/context/NavigationContext.tsx | 4 +-
.../frontend/src/context/ThemeContext.tsx | 8 ++--
.../frontend/src/hooks/useLocalStorage.ts | 11 +++--
.../src/pages/LibraryPage/LibraryPage.tsx | 17 +++----
.../src/pages/LibraryPage/ViewLibrary.tsx | 3 +-
.../EditorConstituenta/EditorConstituenta.tsx | 8 ++--
.../EditorRSExpression/EditorRSExpression.tsx | 3 +-
.../EditorRSExpression/RSLocalButton.tsx | 4 +-
.../EditorRSExpression/RSTokenButton.tsx | 4 +-
.../EditorRSExpression/StatusBar.tsx | 4 +-
.../RSFormPage/EditorRSForm/EditorRSForm.tsx | 6 +--
.../EditorTermGraph/EditorTermGraph.tsx | 13 +++--
.../ViewConstituents/ConstituentsSearch.tsx | 10 ++--
rsconcept/frontend/src/pages/RegisterPage.tsx | 6 +--
rsconcept/frontend/src/utils/constants.ts | 47 ++++++++++++++-----
26 files changed, 108 insertions(+), 80 deletions(-)
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 4d20f1e9..2b5f4ec9 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -106,6 +106,7 @@
"rseditor",
"rsform",
"rsforms",
+ "rsgraph",
"rslang",
"rstemplates",
"SIDELIST",
diff --git a/rsconcept/frontend/src/app/ApplicationLayout.tsx b/rsconcept/frontend/src/app/ApplicationLayout.tsx
index 2a447b5c..a6365d15 100644
--- a/rsconcept/frontend/src/app/ApplicationLayout.tsx
+++ b/rsconcept/frontend/src/app/ApplicationLayout.tsx
@@ -5,7 +5,7 @@ import Footer from '@/app/Footer';
import Navigation from '@/app/Navigation';
import { NavigationState } from '@/context/NavigationContext';
import { useConceptTheme } from '@/context/ThemeContext';
-import { globalIDs } from '@/utils/constants';
+import { globals } from '@/utils/constants';
function ApplicationLayout() {
const { viewportHeight, mainHeight, showScroll } = useConceptTheme();
@@ -22,7 +22,7 @@ function ApplicationLayout() {
{
const { users } = useUsers();
- const [user, setUser] = useLocalStorage
('user', undefined);
+ const [user, setUser] = useState(undefined);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(undefined);
diff --git a/rsconcept/frontend/src/context/NavigationContext.tsx b/rsconcept/frontend/src/context/NavigationContext.tsx
index d286b0b6..02c34792 100644
--- a/rsconcept/frontend/src/context/NavigationContext.tsx
+++ b/rsconcept/frontend/src/context/NavigationContext.tsx
@@ -3,7 +3,7 @@
import { createContext, useCallback, useContext, useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
-import { globalIDs } from '@/utils/constants';
+import { globals } from '@/utils/constants';
interface INavigationContext {
push: (path: string) => void;
@@ -43,7 +43,7 @@ export const NavigationState = ({ children }: NavigationStateProps) => {
const scrollTop = useCallback(() => {
window.scrollTo(0, 0);
- const mainScroll = document.getElementById(globalIDs.main_scroll);
+ const mainScroll = document.getElementById(globals.main_scroll);
if (mainScroll) {
mainScroll.scroll(0, 0);
}
diff --git a/rsconcept/frontend/src/context/ThemeContext.tsx b/rsconcept/frontend/src/context/ThemeContext.tsx
index 7afa1165..1522b44a 100644
--- a/rsconcept/frontend/src/context/ThemeContext.tsx
+++ b/rsconcept/frontend/src/context/ThemeContext.tsx
@@ -8,7 +8,7 @@ import useLocalStorage from '@/hooks/useLocalStorage';
import { FontStyle } from '@/models/miscellaneous';
import { animationDuration } from '@/styling/animations';
import { darkT, IColorTheme, lightT } from '@/styling/color';
-import { globalIDs } from '@/utils/constants';
+import { globals, storage } from '@/utils/constants';
interface IThemeContext {
viewportHeight: string;
@@ -49,8 +49,8 @@ interface ThemeStateProps {
}
export const ThemeState = ({ children }: ThemeStateProps) => {
- const [darkMode, setDarkMode] = useLocalStorage('darkMode', false);
- const [mathFont, setMathFont] = useLocalStorage('editor_font_math', 'math');
+ const [darkMode, setDarkMode] = useLocalStorage(storage.themeDark, false);
+ const [mathFont, setMathFont] = useLocalStorage(storage.rseditFont, 'math');
const [colors, setColors] = useState(lightT);
const [noNavigation, setNoNavigation] = useState(false);
const [noNavigationAnimation, setNoNavigationAnimation] = useState(false);
@@ -129,7 +129,7 @@ export const ThemeState = ({ children }: ThemeStateProps) => {
<>
(key: string, defaultValue: ValueType | (() => ValueType)) {
+ const prefixedKey = `${storage.PREFIX}${key}`;
const [value, setValue] = useState(() => {
- const loadedJson = localStorage.getItem(key);
+ const loadedJson = localStorage.getItem(prefixedKey);
if (loadedJson != null) {
return JSON.parse(loadedJson) as ValueType;
} else if (typeof defaultValue === 'function') {
@@ -16,11 +19,11 @@ function useLocalStorage(key: string, defaultValue: ValueType | (() =
useEffect(() => {
if (value === undefined) {
- localStorage.removeItem(key);
+ localStorage.removeItem(prefixedKey);
} else {
- localStorage.setItem(key, JSON.stringify(value));
+ localStorage.setItem(prefixedKey, JSON.stringify(value));
}
- }, [key, value]);
+ }, [prefixedKey, value]);
return [value, setValue] as [ValueType, typeof setValue];
}
diff --git a/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx b/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx
index cff6da23..03c33590 100644
--- a/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx
+++ b/rsconcept/frontend/src/pages/LibraryPage/LibraryPage.tsx
@@ -12,6 +12,7 @@ import useQueryStrings from '@/hooks/useQueryStrings';
import { ILibraryItem } from '@/models/library';
import { ILibraryFilter, LibraryFilterStrategy } from '@/models/miscellaneous';
import { filterFromStrategy } from '@/models/miscellaneousAPI';
+import { storage } from '@/utils/constants';
import SearchPanel from './SearchPanel';
import ViewLibrary from './ViewLibrary';
@@ -19,7 +20,7 @@ import ViewLibrary from './ViewLibrary';
function LibraryPage() {
const router = useConceptNavigation();
const urlParams = useQueryStrings();
- const searchFilter = (urlParams.get('filter') || null) as LibraryFilterStrategy | null;
+ const queryFilter = (urlParams.get('filter') || null) as LibraryFilterStrategy | null;
const { user } = useAuth();
@@ -31,23 +32,19 @@ function LibraryPage() {
const [query, setQuery] = useState('');
const [strategy, setStrategy] = useLocalStorage(
- 'search_strategy',
+ storage.librarySearchStrategy,
LibraryFilterStrategy.MANUAL
);
useLayoutEffect(() => {
- if (searchFilter === null) {
+ if (!queryFilter || !Object.values(LibraryFilterStrategy).includes(queryFilter)) {
router.replace(`/library?filter=${strategy}`);
return;
}
- const inputStrategy =
- searchFilter && Object.values(LibraryFilterStrategy).includes(searchFilter)
- ? searchFilter
- : LibraryFilterStrategy.MANUAL;
setQuery('');
- setStrategy(inputStrategy);
- setFilter(filterFromStrategy(inputStrategy));
- }, [user, router, setQuery, setFilter, setStrategy, strategy, searchFilter]);
+ setStrategy(queryFilter);
+ setFilter(filterFromStrategy(queryFilter));
+ }, [user, router, setQuery, setFilter, setStrategy, strategy, queryFilter]);
useLayoutEffect(() => {
setShowScroll(true);
diff --git a/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx b/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx
index 929b3baf..648c2bd4 100644
--- a/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx
+++ b/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx
@@ -15,6 +15,7 @@ import useLocalStorage from '@/hooks/useLocalStorage';
import useWindowSize from '@/hooks/useWindowSize';
import { ILibraryItem } from '@/models/library';
import { HelpTopic } from '@/models/miscellaneous';
+import { storage } from '@/utils/constants';
import ItemIcons from './ItemIcons';
@@ -30,7 +31,7 @@ function ViewLibrary({ items, resetQuery }: ViewLibraryProps) {
const intl = useIntl();
const { user } = useAuth();
const { getUserLabel } = useUsers();
- const [itemsPerPage, setItemsPerPage] = useLocalStorage('library_per_page', 50);
+ const [itemsPerPage, setItemsPerPage] = useLocalStorage(storage.libraryPagination, 50);
const handleOpenItem = (item: ILibraryItem) => router.push(`/rsforms/${item.id}`);
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorConstituenta/EditorConstituenta.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorConstituenta/EditorConstituenta.tsx
index 8c20e764..142ed22a 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorConstituenta/EditorConstituenta.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorConstituenta/EditorConstituenta.tsx
@@ -7,7 +7,7 @@ import { useMemo, useState } from 'react';
import useLocalStorage from '@/hooks/useLocalStorage';
import useWindowSize from '@/hooks/useWindowSize';
import { ConstituentaID, IConstituenta } from '@/models/rsform';
-import { globalIDs } from '@/utils/constants';
+import { globals, storage } from '@/utils/constants';
import { useRSEdit } from '../RSEditContext';
import ViewConstituents from '../ViewConstituents';
@@ -31,7 +31,7 @@ function EditorConstituenta({ activeCst, isModified, setIsModified, onOpenEdit }
const controller = useRSEdit();
const windowSize = useWindowSize();
- const [showList, setShowList] = useLocalStorage('rseditor-show-list', true);
+ const [showList, setShowList] = useLocalStorage(storage.rseditShowList, true);
const [toggleReset, setToggleReset] = useState(false);
const disabled = useMemo(
@@ -62,7 +62,7 @@ function EditorConstituenta({ activeCst, isModified, setIsModified, onOpenEdit }
}
function initiateSubmit() {
- const element = document.getElementById(globalIDs.constituenta_editor) as HTMLFormElement;
+ const element = document.getElementById(globals.constituenta_editor) as HTMLFormElement;
if (element) {
element.requestSubmit();
}
@@ -104,7 +104,7 @@ function EditorConstituenta({ activeCst, isModified, setIsModified, onOpenEdit }
([]);
const [expression, setExpression] = useState('');
const [showAST, setShowAST] = useState(false);
- const [showControls, setShowControls] = useLocalStorage('rseditor-show-controls', true);
+ const [showControls, setShowControls] = useLocalStorage(storage.rseditShowControls, true);
useLayoutEffect(() => {
setIsModified(false);
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSLocalButton.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSLocalButton.tsx
index 09a28bc8..fa224d20 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSLocalButton.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSLocalButton.tsx
@@ -2,7 +2,7 @@ import clsx from 'clsx';
import { CProps } from '@/components/props';
import { TokenID } from '@/models/rslang';
-import { globalIDs } from '@/utils/constants';
+import { globals } from '@/utils/constants';
interface RSLocalButtonProps extends CProps.Titled {
text: string;
@@ -16,7 +16,7 @@ function RSLocalButton({ text, title, titleHtml, hideTitle, disabled, onInsert }
type='button'
tabIndex={-1}
disabled={disabled}
- data-tooltip-id={!!title || !!titleHtml ? globalIDs.tooltip : undefined}
+ data-tooltip-id={!!title || !!titleHtml ? globals.tooltip : undefined}
data-tooltip-html={titleHtml}
data-tooltip-content={title}
data-tooltip-hidden={hideTitle}
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSTokenButton.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSTokenButton.tsx
index b6f8ae34..2d99197b 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSTokenButton.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/RSTokenButton.tsx
@@ -1,7 +1,7 @@
import clsx from 'clsx';
import { TokenID } from '@/models/rslang';
-import { globalIDs } from '@/utils/constants';
+import { globals } from '@/utils/constants';
import { describeToken, labelToken } from '@/utils/labels';
interface RSTokenButtonProps {
@@ -30,7 +30,7 @@ function RSTokenButton({ token, disabled, onInsert }: RSTokenButtonProps) {
'w-[1.7rem] sm:w-[2.25rem]': label.length <= 3
}
)}
- data-tooltip-id={globalIDs.tooltip}
+ data-tooltip-id={globals.tooltip}
data-tooltip-html={describeToken(token)}
>
{label ? {label} : null}
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/StatusBar.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/StatusBar.tsx
index ebe746fa..2f1c1b2e 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/StatusBar.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/StatusBar.tsx
@@ -11,7 +11,7 @@ import { type IConstituenta } from '@/models/rsform';
import { inferStatus } from '@/models/rsformAPI';
import { IExpressionParse, ParsingStatus } from '@/models/rslang';
import { colorBgCstStatus } from '@/styling/color';
-import { globalIDs } from '@/utils/constants';
+import { globals } from '@/utils/constants';
import { labelExpressionStatus, prepareTooltip } from '@/utils/labels';
import StatusIcon from './StatusIcon';
@@ -48,7 +48,7 @@ function StatusBar({ isModified, processing, constituenta, parseData, onAnalyze
'duration-500 transition-colors'
)}
style={{ backgroundColor: processing ? colors.bgDefault : colorBgCstStatus(status, colors) }}
- data-tooltip-id={globalIDs.tooltip}
+ data-tooltip-id={globals.tooltip}
data-tooltip-html={prepareTooltip('Проверить определение', 'Ctrl + Q')}
onClick={onAnalyze}
>
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/EditorRSForm.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/EditorRSForm.tsx
index 6b746335..fe2f9232 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/EditorRSForm.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/EditorRSForm.tsx
@@ -7,7 +7,7 @@ import Divider from '@/components/ui/Divider';
import FlexColumn from '@/components/ui/FlexColumn';
import { useAuth } from '@/context/AuthContext';
import { useRSForm } from '@/context/RSFormContext';
-import { globalIDs } from '@/utils/constants';
+import { globals } from '@/utils/constants';
import FormRSForm from './FormRSForm';
import RSFormStats from './RSFormStats';
@@ -24,7 +24,7 @@ function EditorRSForm({ isModified, onDestroy, setIsModified }: EditorRSFormProp
const { user } = useAuth();
function initiateSubmit() {
- const element = document.getElementById(globalIDs.library_item_editor) as HTMLFormElement;
+ const element = document.getElementById(globals.library_item_editor) as HTMLFormElement;
if (element) {
element.requestSubmit();
}
@@ -51,7 +51,7 @@ function EditorRSForm({ isModified, onDestroy, setIsModified }: EditorRSFormProp
/>
-
+
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/EditorTermGraph.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/EditorTermGraph.tsx
index 88d27d07..8759a1bc 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/EditorTermGraph.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/EditorTermGraph.tsx
@@ -14,7 +14,7 @@ import useLocalStorage from '@/hooks/useLocalStorage';
import { GraphColoringScheme, GraphFilterParams } from '@/models/miscellaneous';
import { ConstituentaID, CstType } from '@/models/rsform';
import { colorBgGraphNode } from '@/styling/color';
-import { TIMEOUT_GRAPH_REFRESH } from '@/utils/constants';
+import { storage, TIMEOUT_GRAPH_REFRESH } from '@/utils/constants';
import { useRSEdit } from '../RSEditContext';
import GraphSidebar from './GraphSidebar';
@@ -33,7 +33,7 @@ function EditorTermGraph({ selected, setSelected, onOpenEdit }: EditorTermGraphP
const controller = useRSEdit();
const { colors } = useConceptTheme();
- const [filterParams, setFilterParams] = useLocalStorage('graph_filter', {
+ const [filterParams, setFilterParams] = useLocalStorage(storage.rsgraphFilter, {
noHermits: true,
noTemplates: false,
noTransitive: true,
@@ -55,10 +55,13 @@ function EditorTermGraph({ selected, setSelected, onOpenEdit }: EditorTermGraphP
const nothingSelected = useMemo(() => selected.length === 0, [selected]);
- const [layout, setLayout] = useLocalStorage('graph_layout', 'treeTd2d');
- const is3D = useMemo(() => layout.includes('3d'), [layout]);
- const [coloringScheme, setColoringScheme] = useLocalStorage('graph_coloring', 'type');
+ const [layout, setLayout] = useLocalStorage(storage.rsgraphLayout, 'treeTd2d');
+ const [coloringScheme, setColoringScheme] = useLocalStorage(
+ storage.rsgraphColoringScheme,
+ 'type'
+ );
const [orbit, setOrbit] = useState(false);
+ const is3D = useMemo(() => layout.includes('3d'), [layout]);
const [hoverID, setHoverID] = useState(undefined);
const hoverCst = useMemo(() => {
diff --git a/rsconcept/frontend/src/pages/RSFormPage/ViewConstituents/ConstituentsSearch.tsx b/rsconcept/frontend/src/pages/RSFormPage/ViewConstituents/ConstituentsSearch.tsx
index 5294323a..7632269a 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/ViewConstituents/ConstituentsSearch.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/ViewConstituents/ConstituentsSearch.tsx
@@ -1,6 +1,6 @@
'use client';
-import { useCallback, useLayoutEffect } from 'react';
+import { useCallback, useLayoutEffect, useState } from 'react';
import { BiCog, BiFilterAlt } from 'react-icons/bi';
import Dropdown from '@/components/ui/Dropdown';
@@ -14,7 +14,7 @@ import { applyGraphFilter } from '@/models/miscellaneousAPI';
import { ConstituentaID, IConstituenta, IRSForm } from '@/models/rsform';
import { createMockConstituenta, matchConstituenta } from '@/models/rsformAPI';
import { extractGlobals } from '@/models/rslangAPI';
-import { prefixes } from '@/utils/constants';
+import { prefixes, storage } from '@/utils/constants';
import { describeCstMatchMode, describeCstSource, labelCstMatchMode, labelCstSource } from '@/utils/labels';
interface ConstituentsSearchProps {
@@ -25,9 +25,9 @@ interface ConstituentsSearchProps {
}
function ConstituentsSearch({ schema, activeID, activeExpression, setFiltered }: ConstituentsSearchProps) {
- const [filterMatch, setFilterMatch] = useLocalStorage('side-filter-match', CstMatchMode.ALL);
- const [filterText, setFilterText] = useLocalStorage('side-filter-text', '');
- const [filterSource, setFilterSource] = useLocalStorage('side-filter-dependency', DependencyMode.ALL);
+ const [filterMatch, setFilterMatch] = useLocalStorage(storage.cstFilterMatch, CstMatchMode.ALL);
+ const [filterSource, setFilterSource] = useLocalStorage(storage.cstFilterGraph, DependencyMode.ALL);
+ const [filterText, setFilterText] = useState('');
const matchModeMenu = useDropdown();
const sourceMenu = useDropdown();
diff --git a/rsconcept/frontend/src/pages/RegisterPage.tsx b/rsconcept/frontend/src/pages/RegisterPage.tsx
index 211d4a75..26d960f8 100644
--- a/rsconcept/frontend/src/pages/RegisterPage.tsx
+++ b/rsconcept/frontend/src/pages/RegisterPage.tsx
@@ -19,7 +19,7 @@ import ExpectedAnonymous from '@/components/wrap/ExpectedAnonymous';
import { useAuth } from '@/context/AuthContext';
import { useConceptNavigation } from '@/context/NavigationContext';
import { type IUserSignupData } from '@/models/library';
-import { globalIDs, patterns } from '@/utils/constants';
+import { globals, patterns } from '@/utils/constants';
function RegisterPage() {
const router = useConceptNavigation();
@@ -74,10 +74,10 @@ function RegisterPage() {
-
+
-
+
- используйте уникальный пароль
- портал функционирует в тестовом режиме
diff --git a/rsconcept/frontend/src/utils/constants.ts b/rsconcept/frontend/src/utils/constants.ts
index dad0f1e6..dcd91340 100644
--- a/rsconcept/frontend/src/utils/constants.ts
+++ b/rsconcept/frontend/src/utils/constants.ts
@@ -29,15 +29,6 @@ export const TIMEOUT_GRAPH_REFRESH = 200;
*/
export const EXTEOR_TRS_FILE = '.trs';
-/**
- * Resource relative URIs.
- */
-export const resources = {
- graph_font: '/DejaVu.ttf',
- privacy_policy: '/privacy.pdf',
- logo: '/logo_full.svg'
-};
-
/**
* Numeric limitations.
*/
@@ -53,6 +44,15 @@ export const patterns = {
library_alias: `.{1,${limits.library_alias_len}}`
};
+/**
+ * Local URIs.
+ */
+export const resources = {
+ graph_font: '/DejaVu.ttf',
+ privacy_policy: '/privacy.pdf',
+ logo: '/logo_full.svg'
+};
+
/**
* Youtube IDs for embedding.
*/
@@ -61,7 +61,7 @@ export const youtube = {
};
/**
- * Constant URLs.
+ * External URLs.
*/
export const urls = {
concept: 'https://www.acconcept.ru/',
@@ -77,9 +77,32 @@ export const urls = {
};
/**
- * Global unique IDs.
+ * Local storage ID.
*/
-export const globalIDs = {
+export const storage = {
+ PREFIX: 'portal.',
+
+ themeDark: 'theme.dark',
+
+ rseditFont: 'rsedit.font',
+ rseditShowList: 'rsedit.show_list',
+ rseditShowControls: 'rsedit.show_controls',
+
+ librarySearchStrategy: 'library.search.strategy',
+ libraryPagination: 'library.pagination',
+
+ rsgraphFilter: 'rsgraph.filter',
+ rsgraphLayout: 'rsgraph.layout',
+ rsgraphColoringScheme: 'rsgraph.coloring_scheme',
+
+ cstFilterMatch: 'cst.filter.match',
+ cstFilterGraph: 'cst.filter.graph'
+};
+
+/**
+ * Global element ID.
+ */
+export const globals = {
tooltip: 'global_tooltip',
password_tooltip: 'password_tooltip',
main_scroll: 'main_scroll',