import { useEffect, useState } from '@wordpress/element'; import { BaseControl, Button, Card, CardBody, CardHeader, CheckboxControl, ComboboxControl, Flex, FormTokenField, Modal, TabPanel, TextControl, ToggleControl, } from '@wordpress/components'; import { debounce } from 'lodash'; import { vfAPI } from '../../../shared/vfAPI'; import { Role } from '../../../customers/roles/Role'; import { convertToComboOptions } from '../../../utils/convertToComboOptions'; import { apiURL } from '../../../data/apiURL'; import { Breadcrumb } from '../../../shared/Breadcrumb'; interface Props { roleId: number; isNew: boolean; } const tabs = [ { name: 'options', title: 'Options', }, { name: 'documents', title: 'Documents', }, ]; export const RoleEdit = ({ isNew, roleId }: Props) => { const [breadcrumbs, setBreadcrumbs] = useState([ { label: 'Customers', href: '?page=vf-customers' }, { label: 'Roles', href: '?page=vf-customers#/roles' }, ]); const [groups, setGroups] = useState([]); const [groupsQuery, setGroupsQuery] = useState(); const [isBusy, setIsBusy] = useState(true); const [isOpen, setOpen] = useState(false); const [priceSheets, setPriceSheets] = useState([]); const [role, setRole] = useState({}); const [domains, setDomains] = useState([]); const addDocument = () => { const newDocument = { name: '', required: false, }; const updatedDocuments = role.documents ? [...role.documents, newDocument] : [newDocument]; setRole({ ...role, documents: updatedDocuments }); }; const closeModal = () => setOpen(false); const deleteDocument = (index: number) => { const updatedDocuments = role.documents; updatedDocuments.splice(index, 1); setRole({ ...role, documents: updatedDocuments }); }; const deleteRole = () => { setIsBusy(true); vfAPI.delete(`${apiURL.ROLES}/${role.id}`).then((response) => { if (!response.data.errors.length) { location.assign( location.href.replace(`/${role.id.toString()}`, '') ); } }); }; const handleGroupQueryChange = debounce((value: string) => { setGroupsQuery(value); }, 500); const getGroups = () => { const params: { q?: string } = {}; if (groupsQuery) { params.q = groupsQuery; } const config = { params, }; vfAPI.get(apiURL.GROUPS, config).then((response) => { if (!response.data.errors.length) { setGroups( convertToComboOptions({ data: response.data.groups.data, labelKey: 'name', valueKey: 'group_id', }) ); } }); }; const getPriceSheets = () => { setIsBusy(true); const config = { params: { rpp: 500, // Override pagination }, }; vfAPI.get(apiURL.PRICESHEETS, config).then((response) => { if (!response.data.errors.length) { setPriceSheets( convertToComboOptions({ data: response.data.pricesheets.data, labelKey: 'sheet', valueKey: 'price_sheet_id', }) ); setIsBusy(false); } }); }; const getRole = (id: number) => { setIsBusy(true); vfAPI.get(`${apiURL.ROLES}/${id}`).then((response) => { if (!response.data.errors.length) { setBreadcrumbs([ ...breadcrumbs, { label: response.data.role.name, href: `?page=vendorfuel#!/customers/roles/${roleId}`, }, ]); setRole(response.data.role); setDomains( response.data.role.allowed_email_domains ? response.data.role.allowed_email_domains : [] ); setPriceSheets( convertToComboOptions({ data: response.data.price_sheets, labelKey: 'sheet', valueKey: 'price_sheet_id', }) ); } setIsBusy(false); }); }; const openModal = () => setOpen(true); const save = () => { setIsBusy(true); vfAPI.post(apiURL.ROLES, role).then((response) => { if (response.data?.role?.id) { location.assign( location.href.replace( 'create', response.data.role.id.toString() ) ); } setIsBusy(false); }); }; const setDocument = ( document: { name: string; required: boolean }, index: number ) => { const updatedDocuments = [...role.documents]; updatedDocuments[index] = document; setRole({ ...role, documents: updatedDocuments }); }; const submit = (e) => { e.preventDefault(); if (isNew) { save(); } else { update(); } }; const update = () => { setIsBusy(true); vfAPI.put(`${apiURL.ROLES}/${role.id}`, role).then((response) => { if (!response.data.errors.length) { setRole(response.data.role); } setIsBusy(false); }); }; // Get Groups when page loads and query changes. useEffect(() => { getGroups(); }, [groupsQuery]); // Get Role if a role ID is passed via props. useEffect(() => { if (roleId) { getRole(roleId); } }, [roleId]); // Initialize breadcrumb and price sheets if new role. useEffect(() => { if (isNew) { setBreadcrumbs([ ...breadcrumbs, { label: 'Add New', href: '?page=vendorfuel#!/customers/roles/create', }, ]); getPriceSheets(); } }, [isNew]); // Update allowed domains when changed. Fixes issue where null value causes FormTokenField component to break. useEffect(() => { if (domains) { setRole({ ...role, allowed_email_domains: domains }); } }, [domains]); // Redirect from "Add New" to "Edit" route if a role is saved for the first time. useEffect(() => { if (isNew && role.id) { location.assign( location.href.replace('create', role.id.toString()) ); } }, [role]); return ( <>

{isNew ? 'Add New' : 'Edit'} role

setRole({ ...role, name: value }) } required /> setRole({ ...role, price_sheet_id: value, }) } /> setRole({ ...role, group_id: value }) } onFilterValueChange={handleGroupQueryChange} /> setRole({ ...role, order_prefix: value, }) } /> setRole({ ...role, terms: value }) } /> setRole({ ...role, customer_class: value, }) } /> setRole({ ...role, registration: value, }) } />
Allowed Email Domains setDomains(tokens)} placeholder="domain.com, mywebsite.org, example.ca.gov" />
{(tab) => ( {tab.name === 'options' && ( <> {tab.title}
Checkout Options setRole({ ...role, price_availability: value, }) } /> setRole({ ...role, credit_line: value, }) } /> setRole({ ...role, allow_payment: value, }) } /> setRole({ ...role, taxable: value, }) } />
Billing and Shipping Options setRole({ ...role, lock_billing: value, }) } /> setRole({ ...role, lock_shipping: value, }) } />
Punchout Options setRole({ ...role, punchout_only: value, }) } /> {role.punchout_only && ( setRole({ ...role, mixed_punchout: value, }) } /> )}
)} {tab.name === 'documents' && ( <> {tab.title} {role.documents && role.documents.map( ( document, index ) => (
setDocument( { ...document, name: value, }, index ) } /> setDocument( { ...document, required: value, }, index ) } />
) )} {(!role.documents || !role.documents .length) && (

No documents found.

)}
)}
)}
{role.id && ( )}
{isOpen && (

This will delete this role.

)} ); };