import { CloseOutlined, DeleteFilled } from "@ant-design/icons"; import { closestCenter, DndContext, PointerSensor, useSensor, useSensors } from "@dnd-kit/core"; import { arrayMove, rectSortingStrategy, SortableContext, useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { Button, Form, Select, Space } from "antd"; import { ChromePicker } from "react-color"; import { useTranslation } from "react-i18next"; import styled from "styled-components"; import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils"; import ConfigListEmptyState from "../layout-form-row/config-list-empty-state.component.jsx"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import { DEFAULT_TRANSLUCENT_CARD_COLOR, getTintedCardSurfaceStyles } from "./shop-info.color.utils"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); const mapDispatchToProps = () => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoROStatusComponent); const SelectorDiv = styled.div` .ant-form-item .ant-select { width: 200px; } .production-status-color-title-select { min-width: 160px; width: 100%; } .production-status-color-title-select .ant-select-selector { background: transparent !important; border: none !important; box-shadow: none !important; padding-inline: 0 !important; } .production-status-color-title-select .ant-select-selection-item, .production-status-color-title-select .ant-select-selection-placeholder { font-weight: 500; } .job-statuses-source-select .ant-select-selector { align-items: flex-start !important; } .job-statuses-source-select .ant-select-selection-wrap { gap: 4px 0; } .job-statuses-source-tag-wrapper { display: inline-flex; max-width: 100%; margin-inline-end: 4px; touch-action: none; } .job-statuses-source-tag-wrapper .ant-select-selection-item { max-width: 100%; cursor: grab; margin-inline-end: 0; user-select: none; } .job-statuses-source-tag-wrapper .ant-select-selection-item-content { overflow: hidden; text-overflow: ellipsis; } .job-statuses-source-tag-wrapper .ant-select-selection-item:active { cursor: grabbing; } .job-statuses-source-tag-wrapper .ant-select-selection-item-remove { flex: none; } .job-statuses-source-tag-wrapper--dragging { opacity: 0.55; } `; const normalizeStatuses = (statuses) => [...new Set((statuses || []).map((item) => item?.trim()).filter(Boolean))]; const DraggableStatusTag = ({ label, value, closable, onClose }) => { const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: value }); const labelText = String(label ?? value); return ( { if (event.target.closest(".ant-tag-close-icon")) { event.stopPropagation(); } }} {...attributes} {...listeners} > { if (event.target.closest(".ant-select-selection-item-remove")) { event.stopPropagation(); return; } event.preventDefault(); }} title={labelText} > {labelText} {closable ? ( { event.stopPropagation(); onClose?.(event); }} onMouseDown={(event) => { event.stopPropagation(); }} > ) : null} ); }; const SortableStatusesSelect = ({ value, onChange }) => { const statuses = normalizeStatuses(value); const tagSensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 6 } }) ); const handleStatusesChange = (nextValues) => { onChange?.(normalizeStatuses(nextValues)); }; const handleStatusSortEnd = ({ active, over }) => { if (!over || active.id === over.id) return; const oldIndex = statuses.indexOf(active.id); const newIndex = statuses.indexOf(over.id); if (oldIndex < 0 || newIndex < 0) return; onChange?.(arrayMove(statuses, oldIndex, newIndex)); }; const renderStatusTag = ({ label, value: tagValue, closable, onClose }) => { return ; }; return ( ({ value: item, label: item }))} /> } extra={