|
@@ -8,32 +8,23 @@ import { TBlockInstance } from '../types'
|
|
const BlockInstanceInputs = ({
|
|
const BlockInstanceInputs = ({
|
|
value = [],
|
|
value = [],
|
|
name,
|
|
name,
|
|
- onChange
|
|
|
|
|
|
+ onChange,
|
|
}: {
|
|
}: {
|
|
value?: TBlockInstance[]
|
|
value?: TBlockInstance[]
|
|
name: string
|
|
name: string
|
|
onChange: GenericEventHandler
|
|
onChange: GenericEventHandler
|
|
}) => {
|
|
}) => {
|
|
- const [state, setState] = useState(value.map(item => item.id))
|
|
|
|
|
|
+ const [state, setState] = useState(value.map((item) => item.id))
|
|
|
|
|
|
- function updateOrderProperty<T extends { id: U }, U>(
|
|
|
|
- values: T[],
|
|
|
|
- orderList: U[]
|
|
|
|
- ) {
|
|
|
|
- const orderedValues = values.map(value => {
|
|
|
|
- const order = orderList.findIndex(orderedId => orderedId === value.id)
|
|
|
|
|
|
+ function updateOrderProperty<T extends { id: U }, U>(values: T[], orderList: U[]) {
|
|
|
|
+ const orderedValues = values.map((value) => {
|
|
|
|
+ const order = orderList.findIndex((orderedId) => orderedId === value.id)
|
|
return { ...value, order }
|
|
return { ...value, order }
|
|
})
|
|
})
|
|
onChange({ target: { type: 'custom', name, value: orderedValues } })
|
|
onChange({ target: { type: 'custom', name, value: orderedValues } })
|
|
}
|
|
}
|
|
|
|
|
|
- function onSortEnd({
|
|
|
|
- oldIndex,
|
|
|
|
- newIndex
|
|
|
|
- }: {
|
|
|
|
- oldIndex: number
|
|
|
|
- newIndex: number
|
|
|
|
- }) {
|
|
|
|
|
|
+ function onSortEnd({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) {
|
|
const newOrder = arrayMove(state, oldIndex, newIndex)
|
|
const newOrder = arrayMove(state, oldIndex, newIndex)
|
|
setState(newOrder)
|
|
setState(newOrder)
|
|
updateOrderProperty(value, newOrder)
|
|
updateOrderProperty(value, newOrder)
|
|
@@ -41,18 +32,18 @@ const BlockInstanceInputs = ({
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
const missingIds = value
|
|
const missingIds = value
|
|
- .filter(item => !state.includes(item.id))
|
|
|
|
- .filter(item => !item.id.startsWith('--'))
|
|
|
|
- .map(item => item.id)
|
|
|
|
- const stateWithoutRemovedItems = state.filter(stateId =>
|
|
|
|
- value.find(item => stateId === item.id)
|
|
|
|
|
|
+ .filter((item) => !state.includes(item.id))
|
|
|
|
+ .filter((item) => !item.id.startsWith('--'))
|
|
|
|
+ .map((item) => item.id)
|
|
|
|
+ const stateWithoutRemovedItems = state.filter((stateId) =>
|
|
|
|
+ value.find((item) => stateId === item.id)
|
|
)
|
|
)
|
|
setState([...stateWithoutRemovedItems, ...missingIds])
|
|
setState([...stateWithoutRemovedItems, ...missingIds])
|
|
}, [value])
|
|
}, [value])
|
|
|
|
|
|
const items = state
|
|
const items = state
|
|
- .map(stateId => {
|
|
|
|
- const itemIndex = value.findIndex(item => item.id === stateId)
|
|
|
|
|
|
+ .map((stateId) => {
|
|
|
|
+ const itemIndex = value.findIndex((item) => item.id === stateId)
|
|
if (itemIndex < 0) return null
|
|
if (itemIndex < 0) return null
|
|
const item = value[itemIndex]
|
|
const item = value[itemIndex]
|
|
return (
|
|
return (
|
|
@@ -64,6 +55,7 @@ const BlockInstanceInputs = ({
|
|
value={item.order}
|
|
value={item.order}
|
|
type='number'
|
|
type='number'
|
|
onChange={onChange}
|
|
onChange={onChange}
|
|
|
|
+ className='bi-order'
|
|
/>
|
|
/>
|
|
<TextInput
|
|
<TextInput
|
|
name={`${name}.${itemIndex}.rounds`}
|
|
name={`${name}.${itemIndex}.rounds`}
|
|
@@ -71,50 +63,78 @@ const BlockInstanceInputs = ({
|
|
value={item.rounds}
|
|
value={item.rounds}
|
|
type='number'
|
|
type='number'
|
|
onChange={onChange}
|
|
onChange={onChange}
|
|
|
|
+ className='bi-rounds'
|
|
/>
|
|
/>
|
|
<TextInput
|
|
<TextInput
|
|
name={`${name}.${itemIndex}.variation`}
|
|
name={`${name}.${itemIndex}.variation`}
|
|
label='Variation'
|
|
label='Variation'
|
|
value={item.variation}
|
|
value={item.variation}
|
|
onChange={onChange}
|
|
onChange={onChange}
|
|
|
|
+ className='bi-variation'
|
|
/>
|
|
/>
|
|
- {item.block && (
|
|
|
|
- <BlockInputs
|
|
|
|
- name={`${name}.${itemIndex}.block`}
|
|
|
|
- value={item.block}
|
|
|
|
- onChange={onChange}
|
|
|
|
- />
|
|
|
|
- )}
|
|
|
|
|
|
+ <div className='bi-block'>
|
|
|
|
+ {item.block && (
|
|
|
|
+ <BlockInputs
|
|
|
|
+ name={`${name}.${itemIndex}.block`}
|
|
|
|
+ value={item.block}
|
|
|
|
+ onChange={onChange}
|
|
|
|
+ />
|
|
|
|
+ )}
|
|
|
|
+ </div>
|
|
<button
|
|
<button
|
|
type='button'
|
|
type='button'
|
|
- onClick={ev => {
|
|
|
|
- const newOrder = state.filter(orderedId => item.id !== orderedId)
|
|
|
|
|
|
+ onClick={(ev) => {
|
|
|
|
+ const newOrder = state.filter((orderedId) => item.id !== orderedId)
|
|
setState(newOrder)
|
|
setState(newOrder)
|
|
const newValues = item.id?.startsWith('++')
|
|
const newValues = item.id?.startsWith('++')
|
|
? [...value.slice(0, itemIndex), ...value.slice(itemIndex + 1)]
|
|
? [...value.slice(0, itemIndex), ...value.slice(itemIndex + 1)]
|
|
: [
|
|
: [
|
|
...value.slice(0, itemIndex),
|
|
...value.slice(0, itemIndex),
|
|
{ ...item, id: `--${item.id}` },
|
|
{ ...item, id: `--${item.id}` },
|
|
- ...value.slice(itemIndex + 1)
|
|
|
|
|
|
+ ...value.slice(itemIndex + 1),
|
|
]
|
|
]
|
|
updateOrderProperty(newValues, newOrder)
|
|
updateOrderProperty(newValues, newOrder)
|
|
}}
|
|
}}
|
|
|
|
+ className='bi-button'
|
|
>
|
|
>
|
|
Delete block
|
|
Delete block
|
|
</button>
|
|
</button>
|
|
|
|
+
|
|
|
|
+ <style jsx>{`
|
|
|
|
+ @media (min-width: 768px) {
|
|
|
|
+ div {
|
|
|
|
+ display: grid;
|
|
|
|
+ grid-template-areas:
|
|
|
|
+ 'order variation'
|
|
|
|
+ 'rounds variation'
|
|
|
|
+ 'block block'
|
|
|
|
+ 'button button';
|
|
|
|
+ grid-template-columns: 1fr 2fr;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ div :global(.bi-order) {
|
|
|
|
+ grid-area: order;
|
|
|
|
+ }
|
|
|
|
+ div :global(.bi-rounds) {
|
|
|
|
+ grid-area: rounds;
|
|
|
|
+ }
|
|
|
|
+ div :global(.bi-variation) {
|
|
|
|
+ grid-area: variation;
|
|
|
|
+ }
|
|
|
|
+ div :global(.bi-block) {
|
|
|
|
+ grid-area: block;
|
|
|
|
+ }
|
|
|
|
+ div :global(.bi-button) {
|
|
|
|
+ grid-area: button;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ `}</style>
|
|
</div>
|
|
</div>
|
|
)
|
|
)
|
|
})
|
|
})
|
|
- .filter(block => block !== null)
|
|
|
|
|
|
+ .filter((block) => block !== null)
|
|
|
|
|
|
- return (
|
|
|
|
- <SortableList
|
|
|
|
- items={items}
|
|
|
|
- onSortEnd={onSortEnd}
|
|
|
|
- useDragHandle
|
|
|
|
- lockAxis={'y'}
|
|
|
|
- />
|
|
|
|
- )
|
|
|
|
|
|
+ return <SortableList items={items} onSortEnd={onSortEnd} useDragHandle lockAxis={'y'} />
|
|
}
|
|
}
|
|
|
|
|
|
export default BlockInstanceInputs
|
|
export default BlockInstanceInputs
|