import React, {useState, useEffect, useCallback, useMemo} from 'react'; import { useFormik } from "formik"; import {useIntl} from 'react-intl'; import { InputGroup, FormGroup, Intent, Button, MenuItem, Classes, HTMLSelect, Menu, H5, H6, } from "@blueprintjs/core"; import {Row, Col} from 'react-grid-system'; import { ReactSortable } from 'react-sortablejs'; import * as Yup from 'yup'; import {pick, get} from 'lodash'; import Icon from 'components/Icon'; import ViewFormConnect from 'connectors/ViewFormPage.connector'; import {compose} from 'utils'; import ErrorMessage from 'components/ErrorMessage'; import DashboardConnect from 'connectors/Dashboard.connector'; import ResourceConnect from 'connectors/Resource.connector'; import AppToaster from 'components/AppToaster'; function ViewForm({ resourceName, columns, fields, viewColumns, viewForm, viewFormColumns, submitView, editView, onDelete, getResourceField, getResourceColumn, }) { const intl = useIntl(); const [draggedColumns, setDraggedColumn] = useState([ ...(viewForm && viewForm.columns) ? viewForm.columns.map((column) => { return getResourceColumn(column.field_id); }) : [] ]); const draggedColumnsIds = useMemo(() => draggedColumns.map(c => c.id), [draggedColumns]); const [availableColumns, setAvailableColumns] = useState([ ...(viewForm && viewForm.columns) ? columns.filter((column) => draggedColumnsIds.indexOf(column.id) === -1 ) : columns, ]); const defaultViewRole = useMemo(() => ({ field_key: '', comparator: '', value: '', index: 1, }), []); const validationSchema = Yup.object().shape({ resource_name: Yup.string().required(), name: Yup.string().required(), logic_expression: Yup.string().required(), roles: Yup.array().of( Yup.object().shape({ comparator: Yup.string().required(), value: Yup.string().required(), field_key: Yup.string().required(), index: Yup.number().required(), }) ), columns: Yup.array().of( Yup.object().shape({ key: Yup.string().required(), index: Yup.string().required(), }), ), }); const initialEmptyForm = useMemo(() => ({ resource_name: resourceName || '', name: '', logic_expression: '', roles: [ defaultViewRole, ], columns: [], }), [defaultViewRole, resourceName]); const initialForm = useMemo(() => ({ ...initialEmptyForm, ...viewForm ? { ...viewForm, resource_name: viewForm.resource.name, } : {}, }), [initialEmptyForm, viewForm]); const { values, errors, touched, setFieldValue, getFieldProps, handleSubmit, isSubmitting, } = useFormik({ enableReinitialize: true, validationSchema: validationSchema, initialValues: { ...pick(initialForm, Object.keys(initialEmptyForm)), logic_expression: initialForm.roles_logic_expression || '', roles: [ ...initialForm.roles.map((role) => { return { ...pick(role, Object.keys(defaultViewRole)), field_key: role.field ? role.field.key : '', }; }), ], }, onSubmit: (values, { setSubmitting }) => { if (viewForm && viewForm.id) { editView(viewForm.id, values).then((response) => { AppToaster.show({ message: 'the_view_has_been_edited' }); setSubmitting(false); }); } else { submitView(values).then((response) => { AppToaster.show({ message: 'the_view_has_been_submit' }); setSubmitting(false); }); } }, }); useEffect(() => { setFieldValue('columns', draggedColumns.map((column, index) => ({ index, key: column.key, }))); }, [setFieldValue, draggedColumns]); const conditionalsItems = useMemo(() => ([ { value: 'and', label: 'AND' }, { value: 'or', label: 'OR' }, ]), []); const whenConditionalsItems = useMemo(() => ([ { value: '', label: 'When' }, ]), []); // Compatotors items. const compatatorsItems = useMemo(() => ([ {value: '', label: 'Compatator'}, {value: 'equals', label: 'Equals'}, {value: 'not_equal', label: 'Not Equal'}, {value: 'contain', label: 'Contain'}, {value: 'not_contain', label: 'Not Contain'}, ]), []); // Resource fields. const resourceFields = useMemo(() => ([ {value: '', label: 'Select a field'}, ...fields.map((field) => ({ value: field.key, label: field.label_name, })), ]), [fields]); // Account item of select accounts field. const selectItem = (item, { handleClick, modifiers, query }) => { return () }; // Handle click new condition button. const onClickNewRole = useCallback(() => { setFieldValue('roles', [ ...values.roles, { ...defaultViewRole, index: values.roles.length + 1, } ]); }, [defaultViewRole, setFieldValue, values]); // Handle click remove view role button. const onClickRemoveRole = useCallback((viewRole, index) => () => { const viewRoles = [...values.roles]; // Can't continue if view roles equals or less than 1. if (viewRoles.length <= 1) { return; } viewRoles.splice(index, 1); viewRoles.map((role, i) => { role.index = i + 1; return role; }); setFieldValue('roles', viewRoles); }, [values, setFieldValue]); const onClickDeleteView = useCallback(() => { onDelete && onDelete(viewForm); }, [onDelete, viewForm]); const hasError = (path) => get(errors, path) && get(touched, path); console.log(errors, touched); return (
} inline={true} fill={true}>
Define the conditionals
{values.roles.map((role, index) => (
{ index + 1 }
{(index === 0) ? ( ) : ( )}
} inline={true} fill={true}>
Columns Preferences
Available Columns
{availableColumns.map((field) => ( ))}
Selected Columns
{draggedColumns.map((field) => ( ))}
); } export default compose( ViewFormConnect, DashboardConnect, ResourceConnect, )(ViewForm);