}
onClick={handleSavePositions}
disabled={isProcessing}
/>
}
onClick={handleEditItem}
disabled={selectedItems.length !== 1 || isProcessing}
/>
+
+ }
+ onClick={handleMenuToggle}
+ disabled={isProcessing}
+ />
+
+ }
+ onClick={onCreateBlock}
+ />
+ }
+ onClick={onCreateSchema}
+ />
+ }
+ onClick={onImportSchema}
+ />
+ }
+ onClick={onCreateSynthesis}
+ />
+ {user.is_staff ? (
+ }
+ onClick={notImplemented}
+ />
+ ) : null}
+ {user.is_staff ? (
+ }
+ onClick={notImplemented}
+ />
+ ) : null}
+
+
}
- onClick={onCreateOperation}
- disabled={isProcessing}
- />
-
}
- onClick={onCreateBlock}
- disabled={isProcessing}
- />
-
-
}
onClick={onDelete}
disabled={
diff --git a/rsconcept/frontend/src/features/rsform/components/refs-input/tooltip.ts b/rsconcept/frontend/src/features/rsform/components/refs-input/tooltip.ts
index 60be00dd..5ad20b6a 100644
--- a/rsconcept/frontend/src/features/rsform/components/refs-input/tooltip.ts
+++ b/rsconcept/frontend/src/features/rsform/components/refs-input/tooltip.ts
@@ -4,6 +4,7 @@ import { hoverTooltip, type TooltipView } from '@codemirror/view';
import clsx from 'clsx';
import { findContainedNodes } from '@/utils/codemirror';
+import { isMac } from '@/utils/utils';
import { describeConstituentaTerm, labelGrammeme } from '../../labels';
import { type IEntityReference, type ISyntacticReference } from '../../models/language';
@@ -95,7 +96,9 @@ function domTooltipEntityReference(ref: IEntityReference, cst: IConstituenta | n
if (canClick) {
const clickTip = document.createElement('p');
clickTip.className = 'text-center text-xs mt-1';
- clickTip.innerHTML = '
Ctrl + клик для перехода
Ctrl + пробел для редактирования';
+ clickTip.innerHTML = isMac()
+ ? '
Cmd + клик для перехода
Cmd + пробел для редактирования'
+ : '
Ctrl + клик для перехода
Ctrl + пробел для редактирования';
dom.appendChild(clickTip);
}
@@ -140,7 +143,9 @@ function domTooltipSyntacticReference(
if (canClick) {
const clickTip = document.createElement('p');
clickTip.className = 'text-center text-xs mt-1';
- clickTip.innerHTML = '
Ctrl + пробел для редактирования';
+ clickTip.innerHTML = isMac()
+ ? '
Cmd + пробел для редактирования'
+ : '
Ctrl + пробел для редактирования';
dom.appendChild(clickTip);
}
diff --git a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/toolbar-constituenta.tsx b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/toolbar-constituenta.tsx
index 0a8cdfbf..ff4d809d 100644
--- a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/toolbar-constituenta.tsx
+++ b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/toolbar-constituenta.tsx
@@ -22,7 +22,7 @@ import { cn } from '@/components/utils';
import { useModificationStore } from '@/stores/modification';
import { usePreferencesStore } from '@/stores/preferences';
import { tooltipText } from '@/utils/labels';
-import { prepareTooltip } from '@/utils/utils';
+import { isMac, prepareTooltip } from '@/utils/utils';
import { useMutatingRSForm } from '../../../backend/use-mutating-rsform';
import { type IConstituenta } from '../../../models/rsform';
@@ -97,7 +97,7 @@ export function ToolbarConstituenta({
{isContentEditable ? (
<>
}
onClick={onSubmit}
diff --git a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsexpression/status-bar.tsx b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsexpression/status-bar.tsx
index 9731a2f4..1d862338 100644
--- a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsexpression/status-bar.tsx
+++ b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsexpression/status-bar.tsx
@@ -10,7 +10,7 @@ import { cn } from '@/components/utils';
import { APP_COLORS } from '@/styling/colors';
import { globalIDs } from '@/utils/constants';
import { type RO } from '@/utils/meta';
-import { prepareTooltip } from '@/utils/utils';
+import { isMac, prepareTooltip } from '@/utils/utils';
import { type IExpressionParseDTO, ParsingStatus } from '../../../backend/types';
import { colorStatusBar } from '../../../colors';
@@ -55,7 +55,7 @@ export function StatusBar({ className, isModified, processing, activeCst, parseD
)}
style={{ backgroundColor: processing ? APP_COLORS.bgDefault : colorStatusBar(status) }}
data-tooltip-id={globalIDs.tooltip}
- data-tooltip-html={prepareTooltip('Проверить определение', 'Ctrl + Q')}
+ data-tooltip-html={prepareTooltip('Проверить определение', isMac() ? 'Cmd + Q' : 'Ctrl + Q')}
onClick={onAnalyze}
>
{processing ? (
diff --git a/rsconcept/frontend/src/utils/utils.ts b/rsconcept/frontend/src/utils/utils.ts
index fe11fe15..95e29e80 100644
--- a/rsconcept/frontend/src/utils/utils.ts
+++ b/rsconcept/frontend/src/utils/utils.ts
@@ -176,6 +176,25 @@ export function sharePage() {
.catch(console.error);
}
+/**
+ * Show error message about not implemented function.
+ */
+export function notImplemented() {
+ toast.error('Данная функция еще не реализована');
+ console.error('Not implemented');
+}
+
+/**
+ * Wrap event handler to prevent default and stop propagation.
+ */
+export function withPreventDefault
(handler: (event: T) => void) {
+ return (event: T) => {
+ event.preventDefault();
+ event.stopPropagation();
+ handler(event);
+ };
+}
+
/**
* Remove html tags from target string.
*/
@@ -196,12 +215,22 @@ export function prepareTooltip(text: string, hotkey?: string) {
/**
* Utility to detect iOS/iPadOS.
*/
-export function isIOS() {
+export function isIOS(): boolean {
if (typeof navigator === 'undefined') {
return false;
}
return (
- /iPad|iPhone|iPod/.test(navigator.userAgent) ||
+ /iPad|iPhone|iPod/i.test(navigator.userAgent) ||
(navigator.userAgent.includes('Macintosh') && 'ontouchend' in document)
);
}
+
+/**
+ * Utility to detect Mac device.
+ */
+export function isMac(): boolean {
+ if (typeof navigator === 'undefined') {
+ return false;
+ }
+ return /Macintosh|MacIntel|MacPPC|Mac68K|Mac OS/i.test(navigator.userAgent);
+}