2018-09-16 11:48:56 +09:00
|
|
|
import React from 'react';
|
2018-07-26 17:07:48 +02:00
|
|
|
import PropTypes from 'prop-types';
|
2018-11-14 11:38:41 +01:00
|
|
|
import { Components, registerComponent, mergeWithComponents } from 'meteor/vulcan:core';
|
2018-07-26 17:07:48 +02:00
|
|
|
|
2018-10-25 12:07:50 +02:00
|
|
|
const FormNestedItemLayout = ({ content, removeButton }) => (
|
|
|
|
<div className="form-nested-item">
|
|
|
|
<div className="form-nested-item-inner">{content}</div>
|
|
|
|
{removeButton && [
|
|
|
|
<div key="remove-button" className="form-nested-item-remove">
|
|
|
|
{removeButton}
|
|
|
|
</div>,
|
|
|
|
<div
|
|
|
|
key="remove-button-overlay"
|
|
|
|
className="form-nested-item-deleted-overlay"
|
|
|
|
/>
|
|
|
|
]}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
FormNestedItemLayout.propTypes = {
|
|
|
|
content: PropTypes.node.isRequired,
|
|
|
|
removeButton: PropTypes.node
|
|
|
|
};
|
|
|
|
registerComponent({
|
|
|
|
name: 'FormNestedItemLayout',
|
|
|
|
component: FormNestedItemLayout
|
|
|
|
});
|
|
|
|
|
|
|
|
const FormNestedItem = (
|
|
|
|
{ nestedFields, name, path, removeItem, itemIndex, formComponents, ...props },
|
|
|
|
{ errors }
|
|
|
|
) => {
|
|
|
|
const FormComponents = mergeWithComponents(formComponents);
|
2018-09-16 11:48:56 +09:00
|
|
|
const isArray = typeof itemIndex !== 'undefined';
|
|
|
|
return (
|
2018-10-25 12:07:50 +02:00
|
|
|
<FormComponents.FormNestedItemLayout
|
|
|
|
content={nestedFields.map((field, i) => {
|
|
|
|
return (
|
|
|
|
<FormComponents.FormComponent
|
|
|
|
key={i}
|
|
|
|
{...props}
|
|
|
|
{...field}
|
|
|
|
path={`${path}.${field.name}`}
|
|
|
|
itemIndex={itemIndex}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
removeButton={
|
|
|
|
isArray && [
|
|
|
|
<div key="remove-button" className="form-nested-item-remove">
|
|
|
|
<Components.Button
|
|
|
|
className="form-nested-button"
|
|
|
|
variant="danger"
|
|
|
|
size="small"
|
|
|
|
iconButton
|
|
|
|
tabIndex="-1"
|
|
|
|
onClick={() => {
|
|
|
|
removeItem(name);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<Components.IconRemove height={12} width={12} />
|
|
|
|
</Components.Button>
|
|
|
|
</div>,
|
|
|
|
<div
|
|
|
|
key="remove-button-overlay"
|
|
|
|
className="form-nested-item-deleted-overlay"
|
|
|
|
/>
|
|
|
|
]
|
|
|
|
}
|
|
|
|
/>
|
2018-09-16 11:48:56 +09:00
|
|
|
);
|
2018-07-26 17:07:48 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
FormNestedItem.propTypes = {
|
2018-09-16 11:48:56 +09:00
|
|
|
path: PropTypes.string.isRequired,
|
|
|
|
itemIndex: PropTypes.number,
|
2018-10-25 12:07:50 +02:00
|
|
|
formComponents: PropTypes.object
|
2018-09-16 11:48:56 +09:00
|
|
|
};
|
2018-07-26 17:07:48 +02:00
|
|
|
|
|
|
|
FormNestedItem.contextTypes = {
|
2018-10-25 12:07:50 +02:00
|
|
|
errors: PropTypes.array
|
2018-07-26 17:07:48 +02:00
|
|
|
};
|
|
|
|
|
2018-09-16 11:48:56 +09:00
|
|
|
registerComponent('FormNestedItem', FormNestedItem);
|