added "disabled" and transparent background for buttons elements

This commit is contained in:
Dmitri 2026-03-20 12:51:22 +04:00
parent c18220d6ba
commit 0d1676f942
4 changed files with 66 additions and 5 deletions

View File

@ -55,6 +55,7 @@ class Ui_elementsDBApi extends GenericDBApi {
label: 'Navigation: Forward', label: 'Navigation: Forward',
navLabel: 'Forward', navLabel: 'Forward',
navType: 'forward', navType: 'forward',
navDisabled: false,
transitionReverseMode: 'auto_reverse', transitionReverseMode: 'auto_reverse',
transitionDurationSec: 0.7, transitionDurationSec: 0.7,
appearDelaySec: 0, appearDelaySec: 0,
@ -69,6 +70,7 @@ class Ui_elementsDBApi extends GenericDBApi {
label: 'Navigation: Back', label: 'Navigation: Back',
navLabel: 'Back', navLabel: 'Back',
navType: 'back', navType: 'back',
navDisabled: false,
transitionReverseMode: 'auto_reverse', transitionReverseMode: 'auto_reverse',
transitionDurationSec: 0.7, transitionDurationSec: 0.7,
appearDelaySec: 0, appearDelaySec: 0,

View File

@ -128,6 +128,7 @@ type CanvasElement = {
descriptionBackgroundColor?: string; descriptionBackgroundColor?: string;
navLabel?: string; navLabel?: string;
navType?: NavigationButtonKind; navType?: NavigationButtonKind;
navDisabled?: boolean;
targetPageId?: string; targetPageId?: string;
transitionVideoUrl?: string; transitionVideoUrl?: string;
transitionReverseMode?: 'auto_reverse' | 'separate_video'; transitionReverseMode?: 'auto_reverse' | 'separate_video';
@ -505,6 +506,7 @@ const createDefaultElement = (
...base, ...base,
navLabel: getNavigationButtonLabel(type), navLabel: getNavigationButtonLabel(type),
navType: getNavigationButtonKind(type), navType: getNavigationButtonKind(type),
navDisabled: false,
iconUrl: '', iconUrl: '',
transitionReverseMode: 'auto_reverse', transitionReverseMode: 'auto_reverse',
}; };
@ -1955,6 +1957,9 @@ const ConstructorPage = ({ mode = 'constructor' }: ConstructorPageProps) => {
const onCanvasElementClick = (element: CanvasElement) => { const onCanvasElementClick = (element: CanvasElement) => {
if (!isConstructorEditMode) { if (!isConstructorEditMode) {
if (isNavigationElementType(element.type)) { if (isNavigationElementType(element.type)) {
if (element.navDisabled) {
return;
}
const direction = const direction =
element.navType === 'back' || element.type === 'navigation_prev' element.navType === 'back' || element.type === 'navigation_prev'
? 'back' ? 'back'
@ -2859,10 +2864,17 @@ const ConstructorPage = ({ mode = 'constructor' }: ConstructorPageProps) => {
(element.type === 'navigation_next' || (element.type === 'navigation_next' ||
element.type === 'navigation_prev'); element.type === 'navigation_prev');
const hasTransparentBackground = const hasTransparentBackground =
element.type === 'description' && (element.type === 'description' &&
!element.iconUrl && !element.iconUrl &&
(!element.descriptionBackgroundColor || (!element.descriptionBackgroundColor ||
element.descriptionBackgroundColor === 'transparent'); element.descriptionBackgroundColor === 'transparent')) ||
element.type === 'navigation_next' ||
element.type === 'navigation_prev' ||
element.type === 'tooltip' ||
element.type === 'gallery' ||
element.type === 'carousel';
const isNavDisabled =
isNavigationElementType(element.type) && element.navDisabled;
return ( return (
<button <button
@ -2876,7 +2888,11 @@ const ConstructorPage = ({ mode = 'constructor' }: ConstructorPageProps) => {
} ${ } ${
isNavigationIconElement ? 'flex items-center justify-center' : '' isNavigationIconElement ? 'flex items-center justify-center' : ''
} ${ } ${
isConstructorEditMode ? 'cursor-move' : 'cursor-pointer' isConstructorEditMode
? 'cursor-move'
: isNavDisabled
? 'cursor-not-allowed opacity-50'
: 'cursor-pointer'
} ${ } ${
selectedElementId === element.id selectedElementId === element.id
? 'border-blue-500 bg-blue-50 border shadow' ? 'border-blue-500 bg-blue-50 border shadow'
@ -3198,6 +3214,20 @@ const ConstructorPage = ({ mode = 'constructor' }: ConstructorPageProps) => {
} }
/> />
</div> </div>
<div>
<label className='flex items-center gap-2 text-[11px] font-semibold text-gray-600'>
<input
type='checkbox'
checked={selectedElement.navDisabled || false}
onChange={(event) =>
updateSelectedElement({
navDisabled: event.target.checked,
})
}
/>
Disabled
</label>
</div>
<div> <div>
<label className='mb-1 block text-[11px] font-semibold text-gray-600'> <label className='mb-1 block text-[11px] font-semibold text-gray-600'>
Icon Icon

View File

@ -74,6 +74,7 @@ type ConstructorElement = {
iconUrl?: string; iconUrl?: string;
navLabel?: string; navLabel?: string;
navType?: 'forward' | 'back'; navType?: 'forward' | 'back';
navDisabled?: boolean;
targetPageId?: string; targetPageId?: string;
transitionVideoUrl?: string; transitionVideoUrl?: string;
transitionReverseMode?: 'auto_reverse' | 'separate_video'; transitionReverseMode?: 'auto_reverse' | 'separate_video';
@ -222,6 +223,7 @@ const PageElementsProjectEditPage = () => {
const [iconUrl, setIconUrl] = useState(''); const [iconUrl, setIconUrl] = useState('');
const [navLabel, setNavLabel] = useState(''); const [navLabel, setNavLabel] = useState('');
const [navType, setNavType] = useState<'forward' | 'back'>('forward'); const [navType, setNavType] = useState<'forward' | 'back'>('forward');
const [navDisabled, setNavDisabled] = useState(false);
const [targetPageId, setTargetPageId] = useState(''); const [targetPageId, setTargetPageId] = useState('');
const [transitionVideoUrl, setTransitionVideoUrl] = useState(''); const [transitionVideoUrl, setTransitionVideoUrl] = useState('');
const [transitionReverseMode, setTransitionReverseMode] = useState<'auto_reverse' | 'separate_video'>('auto_reverse'); const [transitionReverseMode, setTransitionReverseMode] = useState<'auto_reverse' | 'separate_video'>('auto_reverse');
@ -278,6 +280,7 @@ const PageElementsProjectEditPage = () => {
setIconUrl(String(item.iconUrl || '')); setIconUrl(String(item.iconUrl || ''));
setNavLabel(String(item.navLabel || '')); setNavLabel(String(item.navLabel || ''));
setNavType(item.navType === 'back' ? 'back' : 'forward'); setNavType(item.navType === 'back' ? 'back' : 'forward');
setNavDisabled(Boolean(item.navDisabled));
setTargetPageId(String(item.targetPageId || '')); setTargetPageId(String(item.targetPageId || ''));
setTransitionVideoUrl(String(item.transitionVideoUrl || '')); setTransitionVideoUrl(String(item.transitionVideoUrl || ''));
setTransitionReverseMode(item.transitionReverseMode === 'separate_video' ? 'separate_video' : 'auto_reverse'); setTransitionReverseMode(item.transitionReverseMode === 'separate_video' ? 'separate_video' : 'auto_reverse');
@ -488,6 +491,7 @@ const PageElementsProjectEditPage = () => {
nextElement.iconUrl = iconUrl.trim(); nextElement.iconUrl = iconUrl.trim();
nextElement.navLabel = navLabel.trim(); nextElement.navLabel = navLabel.trim();
nextElement.navType = navType; nextElement.navType = navType;
nextElement.navDisabled = navDisabled;
nextElement.targetPageId = targetPageId.trim(); nextElement.targetPageId = targetPageId.trim();
nextElement.transitionVideoUrl = transitionVideoUrl.trim(); nextElement.transitionVideoUrl = transitionVideoUrl.trim();
nextElement.transitionReverseMode = transitionReverseMode; nextElement.transitionReverseMode = transitionReverseMode;
@ -792,6 +796,17 @@ const PageElementsProjectEditPage = () => {
<option value='back'>Back</option> <option value='back'>Back</option>
</select> </select>
</FormField> </FormField>
<FormField label='Disabled'>
<label className='flex items-center gap-2 text-sm pt-2'>
<input
type='checkbox'
checked={navDisabled}
onChange={(event) => setNavDisabled(event.target.checked)}
disabled={!hasUpdatePermission}
/>
Button is disabled (not clickable)
</label>
</FormField>
<FormField label='Target page'> <FormField label='Target page'>
<select <select
value={targetPageId} value={targetPageId}

View File

@ -153,6 +153,7 @@ const UiElementDetailsPage = () => {
const [iconUrl, setIconUrl] = useState(''); const [iconUrl, setIconUrl] = useState('');
const [navLabel, setNavLabel] = useState(''); const [navLabel, setNavLabel] = useState('');
const [navType, setNavType] = useState<'forward' | 'back'>('forward'); const [navType, setNavType] = useState<'forward' | 'back'>('forward');
const [navDisabled, setNavDisabled] = useState(false);
const [targetPageId, setTargetPageId] = useState(''); const [targetPageId, setTargetPageId] = useState('');
const [transitionVideoUrl, setTransitionVideoUrl] = useState(''); const [transitionVideoUrl, setTransitionVideoUrl] = useState('');
const [transitionReverseMode, setTransitionReverseMode] = useState<'auto_reverse' | 'separate_video'>('auto_reverse'); const [transitionReverseMode, setTransitionReverseMode] = useState<'auto_reverse' | 'separate_video'>('auto_reverse');
@ -216,6 +217,7 @@ const UiElementDetailsPage = () => {
setIconUrl(String(settings.iconUrl || '')); setIconUrl(String(settings.iconUrl || ''));
setNavLabel(String(settings.navLabel || '')); setNavLabel(String(settings.navLabel || ''));
setNavType(settings.navType === 'back' ? 'back' : 'forward'); setNavType(settings.navType === 'back' ? 'back' : 'forward');
setNavDisabled(Boolean(settings.navDisabled));
setTargetPageId(String(settings.targetPageId || '')); setTargetPageId(String(settings.targetPageId || ''));
setTransitionVideoUrl(String(settings.transitionVideoUrl || '')); setTransitionVideoUrl(String(settings.transitionVideoUrl || ''));
setTransitionReverseMode(settings.transitionReverseMode === 'separate_video' ? 'separate_video' : 'auto_reverse'); setTransitionReverseMode(settings.transitionReverseMode === 'separate_video' ? 'separate_video' : 'auto_reverse');
@ -413,6 +415,7 @@ const UiElementDetailsPage = () => {
defaultSettings.iconUrl = iconUrl.trim(); defaultSettings.iconUrl = iconUrl.trim();
defaultSettings.navLabel = navLabel.trim(); defaultSettings.navLabel = navLabel.trim();
defaultSettings.navType = navType; defaultSettings.navType = navType;
defaultSettings.navDisabled = navDisabled;
defaultSettings.targetPageId = targetPageId.trim(); defaultSettings.targetPageId = targetPageId.trim();
defaultSettings.transitionVideoUrl = transitionVideoUrl.trim(); defaultSettings.transitionVideoUrl = transitionVideoUrl.trim();
defaultSettings.transitionReverseMode = transitionReverseMode; defaultSettings.transitionReverseMode = transitionReverseMode;
@ -540,6 +543,7 @@ const UiElementDetailsPage = () => {
minHeight, minHeight,
minWidth, minWidth,
name, name,
navDisabled,
navLabel, navLabel,
navType, navType,
opacity, opacity,
@ -747,6 +751,16 @@ const UiElementDetailsPage = () => {
<option value='back'>Back</option> <option value='back'>Back</option>
</select> </select>
</FormField> </FormField>
<FormField label='Disabled'>
<label className='inline-flex items-center gap-2 text-sm'>
<input
type='checkbox'
checked={navDisabled}
onChange={(event) => setNavDisabled(event.target.checked)}
/>
Button is disabled (not clickable)
</label>
</FormField>
<FormField label='Target page ID (optional)'> <FormField label='Target page ID (optional)'>
<input value={targetPageId} onChange={(event) => setTargetPageId(event.target.value)} /> <input value={targetPageId} onChange={(event) => setTargetPageId(event.target.value)} />
</FormField> </FormField>