Add component for size settings
[MAILPOET-2811]
This commit is contained in:
committed by
Veljko V
parent
6615494312
commit
60d70ad453
@@ -80,3 +80,11 @@
|
|||||||
width: 300px;
|
width: 300px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mailpoet-size-settings-control {
|
||||||
|
.components-radio-control__option {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 1em;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -0,0 +1,58 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { action } from '@storybook/addon-actions';
|
||||||
|
import { SizeSettings } from '../size_settings';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: 'FormEditor/Size Settings',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Settings = () => (
|
||||||
|
<>
|
||||||
|
<SizeSettings
|
||||||
|
label="Basic Size Settings"
|
||||||
|
value={{
|
||||||
|
unit: 'pixel',
|
||||||
|
value: 200,
|
||||||
|
}}
|
||||||
|
onChange={action('on change no action')}
|
||||||
|
/>
|
||||||
|
<SizeSettings
|
||||||
|
label="Size Settings With All Props"
|
||||||
|
value={{
|
||||||
|
unit: 'pixel',
|
||||||
|
value: 200,
|
||||||
|
}}
|
||||||
|
defaultPercentValue={25}
|
||||||
|
defaultPixelValue={150}
|
||||||
|
maxPercents={80}
|
||||||
|
maxPixels={500}
|
||||||
|
minPercents={20}
|
||||||
|
minPixels={100}
|
||||||
|
onChange={action('on change no action')}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
export const SettingsInSidebar = () => (
|
||||||
|
<div className="edit-post-sidebar mailpoet_form_editor_sidebar">
|
||||||
|
<SizeSettings
|
||||||
|
label="Basic Size Settings"
|
||||||
|
value={{
|
||||||
|
unit: 'pixel',
|
||||||
|
value: 200,
|
||||||
|
}}
|
||||||
|
onChange={action('on change no action')}
|
||||||
|
/>
|
||||||
|
<SizeSettings
|
||||||
|
label="Size Settings in %"
|
||||||
|
value={{
|
||||||
|
unit: 'percent',
|
||||||
|
value: 100,
|
||||||
|
}}
|
||||||
|
maxPercents={100}
|
||||||
|
minPercents={10}
|
||||||
|
onChange={action('on change no action')}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
66
assets/js/src/form_editor/components/size_settings.tsx
Normal file
66
assets/js/src/form_editor/components/size_settings.tsx
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { RangeControl, RadioControl } from '@wordpress/components';
|
||||||
|
|
||||||
|
export type SizeDefinition = {
|
||||||
|
value: number|undefined,
|
||||||
|
unit: 'percent'|'pixel',
|
||||||
|
};
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
label: string,
|
||||||
|
minPercents?: number,
|
||||||
|
maxPercents?: number,
|
||||||
|
minPixels?: number,
|
||||||
|
maxPixels?: number,
|
||||||
|
value: SizeDefinition|undefined,
|
||||||
|
defaultPercentValue?: number,
|
||||||
|
defaultPixelValue?: number,
|
||||||
|
onChange: (value: SizeDefinition) => any,
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SizeSettings = ({
|
||||||
|
label,
|
||||||
|
minPercents = 0,
|
||||||
|
maxPercents = 100,
|
||||||
|
minPixels = 10,
|
||||||
|
maxPixels = 1000,
|
||||||
|
value,
|
||||||
|
defaultPercentValue = 50,
|
||||||
|
defaultPixelValue = 200,
|
||||||
|
onChange,
|
||||||
|
}: Props) => {
|
||||||
|
const [localValue, setLocalValue] = useState(value ?? { unit: 'pixel', value: undefined });
|
||||||
|
return (
|
||||||
|
<div className="mailpoet-size-settings-control">
|
||||||
|
<h3>{label}</h3>
|
||||||
|
<RadioControl
|
||||||
|
selected={localValue.unit || 'pixel'}
|
||||||
|
options={[
|
||||||
|
{ label: 'px', value: 'pixel' },
|
||||||
|
{ label: '%', value: 'percent' },
|
||||||
|
]}
|
||||||
|
onChange={(unit) => {
|
||||||
|
const newValue = {
|
||||||
|
value: unit === 'pixel' ? defaultPixelValue : defaultPercentValue,
|
||||||
|
unit,
|
||||||
|
};
|
||||||
|
setLocalValue(newValue);
|
||||||
|
onChange(newValue);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<RangeControl
|
||||||
|
value={localValue.value ?? (localValue.unit === 'pixel' ? defaultPixelValue : defaultPercentValue)}
|
||||||
|
min={localValue.unit === 'pixel' ? minPixels : minPercents}
|
||||||
|
max={localValue.unit === 'pixel' ? maxPixels : maxPercents}
|
||||||
|
onChange={(val) => {
|
||||||
|
const newValue: SizeDefinition = {
|
||||||
|
unit: localValue.unit === 'pixel' ? 'pixel' : 'percent',
|
||||||
|
value: val,
|
||||||
|
};
|
||||||
|
setLocalValue(newValue);
|
||||||
|
onChange(newValue);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
Reference in New Issue
Block a user