diff --git a/rsconcept/frontend/src/components/Common/TextInput.tsx b/rsconcept/frontend/src/components/Common/TextInput.tsx index e70c62f5..82ec6449 100644 --- a/rsconcept/frontend/src/components/Common/TextInput.tsx +++ b/rsconcept/frontend/src/components/Common/TextInput.tsx @@ -9,15 +9,17 @@ extends Omit, 'className' | 'title'> colorClass?: string dense?: boolean noBorder?: boolean + noOutline?: boolean } function TextInput({ - id, required, label, dense, tooltip, noBorder, + id, required, label, dense, tooltip, noBorder, noOutline, dimensions = 'w-full', colorClass = 'clr-input', ...props }: TextInputProps) { const borderClass = noBorder ? '': 'border'; + const outlineClass = noOutline ? '': 'clr-outline'; return (
{label && @@ -27,7 +29,7 @@ function TextInput({ />} diff --git a/rsconcept/frontend/src/components/Help/HelpConstituenta.tsx b/rsconcept/frontend/src/components/Help/HelpConstituenta.tsx index 63063755..629f27b2 100644 --- a/rsconcept/frontend/src/components/Help/HelpConstituenta.tsx +++ b/rsconcept/frontend/src/components/Help/HelpConstituenta.tsx @@ -6,7 +6,7 @@ function HelpConstituenta() {

Подсказки

Изменения сохраняются ПОСЛЕ нажатия на соответствующую кнопку снизу или по центру

-

Клик на формальное выражение - обратите внимание на кнопки снизу
Горячие клавиши указаны в подсказках при наведении

+

Формальное определение - обратите внимание на кнопки снизу
Горячие клавиши указаны в подсказках при наведении

Поля Термин и Определение - Ctrl + Пробел открывает диалог редактирования отсылок
Перед открытием диалога переместите текстовый курсор на заменяемое слово или ссылку

Список конституент справа - обратите внимание на настройки фильтрации

- слева от ввода текста настраивается набор атрибутов конституенты

diff --git a/rsconcept/frontend/src/context/LibraryContext.tsx b/rsconcept/frontend/src/context/LibraryContext.tsx index 0505bb12..0b99759b 100644 --- a/rsconcept/frontend/src/context/LibraryContext.tsx +++ b/rsconcept/frontend/src/context/LibraryContext.tsx @@ -4,8 +4,8 @@ import { ErrorInfo } from '../components/BackendError'; import { matchLibraryItem } from '../models/library'; import { ILibraryItem } from '../models/library'; import { ILibraryFilter } from '../models/miscelanious'; -import { IRSFormCreateData, IRSFormData } from '../models/rsform'; -import { DataCallback, deleteLibraryItem, getLibrary, getTemplates, postCloneLibraryItem, postNewRSForm } from '../utils/backendAPI'; +import { IRSForm, IRSFormCreateData, IRSFormData, loadRSFormData } from '../models/rsform'; +import { DataCallback, deleteLibraryItem, getLibrary, getRSFormDetails, getTemplates, postCloneLibraryItem, postNewRSForm } from '../utils/backendAPI'; import { useAuth } from './AuthContext'; interface ILibraryContext { @@ -15,8 +15,9 @@ interface ILibraryContext { processing: boolean error: ErrorInfo setError: (error: ErrorInfo) => void - + applyFilter: (params: ILibraryFilter) => ILibraryItem[] + retrieveTemplate: (templateID: number, callback: (schema: IRSForm) => void) => void createItem: (data: IRSFormCreateData, callback?: DataCallback) => void cloneItem: (target: number, data: IRSFormCreateData, callback: DataCallback) => void destroyItem: (target: number, callback?: () => void) => void @@ -38,13 +39,15 @@ interface LibraryStateProps { } export const LibraryState = ({ children }: LibraryStateProps) => { - const [ items, setItems ] = useState([]) - const [ templates, setTemplates ] = useState([]) + const [ items, setItems ] = useState([]); + const [ templates, setTemplates ] = useState([]); const [ loading, setLoading ] = useState(false); const [ processing, setProcessing ] = useState(false); const [ error, setError ] = useState(undefined); const { user } = useAuth(); + const [ cachedTemplates, setCachedTemplates ] = useState([]); + const applyFilter = useCallback( (params: ILibraryFilter) => { let result = items; @@ -69,6 +72,26 @@ export const LibraryState = ({ children }: LibraryStateProps) => { return result; }, [items, user]); + const retrieveTemplate = useCallback( + (templateID: number, callback: (schema: IRSForm) => void) => { + const cached = cachedTemplates.find(schema => schema.id == templateID); + if (cached) { + callback(cached); + return; + } + setError(undefined); + getRSFormDetails(String(templateID), { + showError: true, + setLoading: setLoading, + onError: error => setError(error), + onSuccess: data => { + const schema = loadRSFormData(data); + setCachedTemplates(prev => ([...prev, schema])); + callback(schema); + } + }); + }, [cachedTemplates]); + const reload = useCallback( (callback?: () => void) => { setItems([]); @@ -150,7 +173,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => { return ( { children } diff --git a/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx b/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx index 29deb9ea..9a80fc14 100644 --- a/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx +++ b/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx @@ -77,7 +77,7 @@ function DlgCreateCst({ hideWindow, initial, schema, onCreate }: DlgCreateCstPro spellCheck onChange={event => updateCstData({ term_raw: event.target.value })} /> - ); }, [handleSelectGrams, selectedGrams]); - const columnsConstituenta = useMemo( () => [ constituentaHelper.accessor('alias', { diff --git a/rsconcept/frontend/src/dialogs/DlgTemplates/ConstituentaTab.tsx b/rsconcept/frontend/src/dialogs/DlgTemplates/ConstituentaTab.tsx new file mode 100644 index 00000000..8fd6748c --- /dev/null +++ b/rsconcept/frontend/src/dialogs/DlgTemplates/ConstituentaTab.tsx @@ -0,0 +1,65 @@ +import { Dispatch } from 'react'; + +import SelectSingle from '../../components/Common/SelectSingle'; +import TextArea from '../../components/Common/TextArea'; +import TextInput from '../../components/Common/TextInput'; +import RSInput from '../../components/RSInput'; +import { CstType, ICstCreateData } from '../../models/rsform'; +import { labelCstType } from '../../utils/labels'; +import { SelectorCstType } from '../../utils/selectors'; + +interface ConstituentaTabProps { + state: ICstCreateData + partialUpdate: Dispatch> +} + +function ConstituentaTab({state, partialUpdate}: ConstituentaTabProps) { + return ( +
+
+ partialUpdate({ cst_type: data?.value ?? CstType.TERM})} + /> + partialUpdate({ alias: event.target.value})} + /> +
+