import { OrderedListOutlined, FormOutlined } from '@ant-design/icons'; import { DeleteOutlined, LoadingOutlined, RollbackOutlined } from "@ant-design/icons/lib"; import { Alert, Button, Checkbox, Col, Layout, Modal, Row, Space, Spin, Table, Tabs, Tag } from 'antd'; import Column from "antd/es/table/Column"; import { IStudioOrderPart } from 'lemans-api/models/StudioOrder/studioOrder.types'; import { ConfirmationModal, DeleteButton, flash, InlineEdit } from 'lemans-common'; import { useTrigger } from 'lemans-common/libs/useToggle'; import { api, service, WithIntegrationProps } from 'lemans-dashboard-common'; import { permissionCheck } from 'lemans-uac'; import React from 'react'; import { prop } from 'ts-functional'; import { GoLiveColumn, PartBrandColumn, PartDetailsColumn, PartNCColumn, PartNonPunctuatedPartNumColumn, PartNVColumn, PartNYColumn, PartTagsColumn, PartTXColumn, PartVendorColumn, PartWIColumn } from '../../PartList/PartColumns/PartColumns.component'; import { PhotoReshootQueue } from "../../PhotoReshootQueue"; import { statusColor, statusTag } from "../studioOrder.helpers"; import { studioOrderUrl } from "../StudioOrderSearch/StudioOrderSearch.component"; import './StudioOrderDetails.styles.less'; import { StudioOrderDetailsProps } from './StudioOrderDetails.types'; type Props = WithIntegrationProps; const TabPane = Tabs.TabPane; const [CanView, CantView] = permissionCheck(['ds.studioOrder.view', 'ds.studioOrder.edit']); const [CanEdit, CantEdit] = permissionCheck(['ds.studioOrder.edit']); export const StudioOrderDetailsComponent = (props: Props) => { const [selectedParts, setSelectedParts] = React.useState([] as IStudioOrderPart[]); const showSelections = Array.from(new Set(props.parts.map(prop("statusDescr")))).length > 1; const orderFinished = props.details.status === 'Finished'; const orderOpen = props.details.status === 'Open' || props.details.status === null; const orderSubmitted = props.details.status === 'Submitted'; const orderCompleted = props.details.status === 'Shoot Complete'; const shootCompleteParts = props.parts.filter((x: any) => x.statusDescr === 'Shoot Complete'); const submittedParts = props.parts.filter((x: any) => x.statusDescr === 'Submitted'); const noPartsSelected = selectedParts.length === 0; const partsWithSubmittedNotSelected = selectedParts.some((x: any) => x.statusDescr !== 'Submitted'); const hasAnyShootComplete = props.parts.some((x: any) => x.statusDescr === 'Shoot Complete'); const partsWithShootCompleteNotSelected = selectedParts.some((x: any) => x.statusDescr !== 'Shoot Complete'); const [refresh, setRefresh] = useTrigger(); const [isModalVisible, setModalVisibility] = React.useState(false); const [showForm, setShowForm] = React.useState(false); const [isLoading, setIsLoading] = React.useState(false); const [isNoteModalVisible, setIsNoteModalVisible] = React.useState(false); const toggleForm = () => { showForm ? props.goTo(studioOrderUrl(props.studioOrderId), false, true) : props.onAddPartsModalOpen(); setShowForm(!showForm); }; const toggleNoteModal = () => setIsNoteModalVisible(!isNoteModalVisible); const toggleModal = () => setModalVisibility(!isModalVisible); React.useEffect(() => { setIsLoading(true); setSelectedParts([]); props.onSearch(); setIsLoading(false); }, [refresh, props.studioOrderId]); const rowSelection = { getCheckboxProps: (record: any) => ({ disabled: record.statusDescr === 'Finished', }), onChange: (_: any, prts: IStudioOrderPart[]) => { setSelectedParts(prts); }, selectedRowKeys: selectedParts.map(prop("partNumber")), ...(showSelections && { selections: [ { key: 'shootComplete', onSelect: (_: any) => setSelectedParts(shootCompleteParts), text: 'Shoot Complete Only', }, { key: 'submitted', onSelect: (_: any) => setSelectedParts(submittedParts), text: 'Submitted Only', } ] }) }; const statusRender = (_: any, studioOrder: IStudioOrderPart) => statusTag(studioOrder.statusDescr); const actionColumnRender = (_: any, studioOrderPart: IStudioOrderPart) => { return <> {props.details.status === 'Open' && <>Are you sure you want to delete the Part {studioOrderPart.partNumber}? } ; }; const bulkActionOnStudioOrder = (parts: string[], action: string, successMessage: string, statusId?: number, onSuccess?: any) => { props.setLoading(true); service.studioOrder.parts.create(props.details.studioOrderId, { parts, action, ...(statusId ? { statusId } : {}) }).then(setRefresh).then(() => { setSelectedParts([]); flash.success(successMessage); props.setLoading(false); if (onSuccess) { onSuccess() } }).catch((err:any) => { props.setLoading(false); api.handleError(err); }); }; const addPartsToOrder = (partsSelected: string[]): Promise => { return new Promise((resolve, reject) => { service.studioOrder.parts.create(props.details.studioOrderId, { parts: partsSelected, action: 'create' }).then(setRefresh).then(() => { flash.success(`${partsSelected.length} part${partsSelected.length !== 1 ? 's' : ''} added to order`); resolve(true); }).catch((err: any) => { reject(false); console.error('Error fetching data:', err); api.handleError(err); }); }); }; const deletePartsOnOrder = () => { bulkActionOnStudioOrder(selectedParts.map(prop("partNumber")), 'delete', 'Parts deleted from order'); }; const deleteStudioOrderPart = (studioOrderPart: IStudioOrderPart) => () => { bulkActionOnStudioOrder([studioOrderPart.partNumber], 'delete', `Part ${studioOrderPart.punctuatedPartNumber} deleted from order`); }; const submitOrder = () => { props.setLoading(true); service.studioOrder.parts.getByStudioOrderId(props.details.studioOrderId).then((parts: any) => { bulkActionOnStudioOrder(parts.map((part: any) => part.partNumber), 'update', 'Order Submitted', 14201, goToListPage); }) }; const completeOrder = () => { bulkActionOnStudioOrder(selectedParts.map(prop("partNumber")), 'update', 'Parts Completed', 14202); }; const finishOrder = () => { bulkActionOnStudioOrder(selectedParts.map(prop("partNumber")), 'update', 'Parts Finished', 14203); }; const onOtherWarehouseChange = (event: any) => { setIsLoading(true); service.studioOrder.update(props.details.studioOrderId, {"otherWarehouse": event.target.checked}).then(() => { flash.success('Studio Order Updated'); props.onWarehouseUpdate({...props.details, otherWarehouse: event.target.checked}); }).catch(api.handleError).finally(() => { setIsLoading(false); }) }; const goToListPage = () => { props.goTo('/digital-services/studio-orders', false, true) }; const showTotal = (total: number, range: [number, number]) => <>{range[0]} - {range[1]} of {total}; const updateNotes = (studioOrderId: number) => (value: any) => { return service.studioOrder.update(studioOrderId, {note: value}).then(() => { flash.success('Notes Updated'); props.onWarehouseUpdate({...props.details, note: value}); }).catch(api.handleError); } return (

/  {!props.details.studioOrderId && <> Loading...} {props.details.studioOrderId ? props.details.studioOrderName : ''} {props.details.status ? {props.details.status} : ''}

{orderOpen && Are you sure you want to submit Order {props.details.studioOrderName}? }
Other Warehouse
Other Warehouse {orderOpen && <>Delete Parts <>Are you sure you want to delete Selected Parts? } {orderSubmitted && {hasAnyShootComplete && }} {orderCompleted && }
} type={'card'} > Details} key="detail"> {orderOpen && }
); };