const { componentOwnerId, columnIndex, columnName, setColumnName, contract, projectId, addActionStatus, removeColumn, containsTasks, columnDetailsButton, } = props; const PopupContainer = styled.div` position: relative; background-color: #1d1d21; padding: 1rem; width: 489px; height: fit-content; `; const Header = styled.div` display: flex; flex-direction: row; justify-content: space-between; align-items: center; `; const ActionsContainer = styled.div` display: flex; flex-direction: row; gap: 3px; align-items: center; items-center: center; `; const Text = styled.div` display: flex; column-gap: 0.5rem; align-items: center; color: #fff; font-family: Helvetica Neue; font-size: 24px; font-style: normal; font-weight: 500; line-height: 120% margin-bottom: 1rem; `; const Input = styled.input` color: #fff; font-family: Helvetica Neue; font-size: 16px; font-weight: 400; line-height: 24px; letter-spacing: 0em; text-align: left; flex: 1; height: 40px; margin-top: 1rem; margin-bottom: 1rem; border-radius: 4px; background-color: transparent; :focus { outline-width: 0; } ::placeholder { color: #d0fc42; } border: none; `; const Label = styled.label` color: #777583; font-family: Helvetica Neue; font-size: 16px; font-weight: 400; line-height: 24px; letter-spacing: 0em; width: 30%; height: 40px; margin-top: 1rem; margin-bottom: 1rem; background-color: transparent; border: none; display: flex; justify-content: start; align-items: center; `; const CloseButton = styled.div` color: #fff; :hover { color: #d0fc42; } cursor: pointer; `; const DeleteButton = styled.div` color: #fff; :hover { color: #d0fc42; } display: flex; flex-direction: row; cursor: pointer; text-align: center; color: #ffffff; justify-content: center; align-items: center; gap: 3px; `; const DeleteButtonText = styled.p` padding: 0; margin: 0; `; const InputContainer = styled.div` display: flex; flex-direction: row; align-items: center; `; const Divider = styled.div` width: 100%; height: 1px; background-color: #282933; margin-top: 16px; margin-bottom: 16; `; const FieldContainer = styled.div` position: relative; width: 100%; display: flex; flex-direction: row; align-items: center; `; const MissingName = styled.div` position: absolute; left: 8.6rem; top: 2.8rem; font-family: Helvetica Neue; font-size: 16px; font-weight: 400; line-height: 24px; letter-spacing: 0em; color: red; `; const TextContainer = styled.div` display: flex; justify-content: center; flex-direction: column; width: 100%; text-align: center; margin-bottom: 1rem; margin-top: 1rem; `; const SaveButton = styled.button` background-color: #d0fc42; :hover { opacity: 0.8; } color: #0e0e10; border-radius: 4px; margin-top: 1rem; padding-top: 0.5rem; padding-bottom: 0.5rem; border: none; width: 100%; `; const DeleteColumnContainer = styled.div` position: relative; background-color: #1d1d21; padding: 1rem; width: 489px; height: fit-content; `; const CloseDeleteColumnButton = styled.div` background-color: transparent; display: flex; justify-content: center; color: #6b7280; :hover { color: #fff; } cursor: pointer; padding-top: 0.5rem; padding-bottom: 0.5rem; border: none; width: 100%; `; const Overlay = styled.div` background-color: var(--blackA9); position: fixed; z-index: 1000; inset: 0; display: flex; justify-content: center; align-items: center; animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1); `; const ModalContent = styled.div` position: absolute; width: 500px; padding: 30px; border-radius: 20px; color: white; `; const FunctionButton = styled.button` ${({ backgroundColor }) => backgroundColor && `background-color: ${backgroundColor};`} ${({ color }) => (color ? `color: ${color};` : "color: #fff;")} :hover { ${({ hoverColor }) => hoverColor && `background-color: ${hoverColor};`} } border-radius: 4px; padding-top: 0.5rem; padding-bottom: 0.5rem; border: none; width: 100%; `; const DialogTitle = styled.p` color: #777583; font-family: Helvetica Neue; font-size: 15px; font-style: normal; font-weight: 700; line-height: 100%; padding: 0; margin: 0; `; const ButtonContainer = styled.div` display: flex; flex-direction: column; gap: 8px; `; const [columnDetailsOpen, setColumnDetailsOpen] = useState(false); const [editColumnName, setEditColumnName] = useState(columnName); const [editColumnNameMissing, setEditColumnNameMissing] = useState(false); const [deleteContent, setDeleteContent] = useState(false); const [editColumnNameStatus, setEditColumnNameStatus] = useState(undefined); const onChangeEditColumnName = (event) => { setEditColumnNameMissing(false); setEditColumnName(event.target.value); }; const onClose = () => { setColumnDetailsOpen(false); setEditColumnNameMissing(false); setEditColumnName(columnName); }; const handleUpdateColumnName = (columnName, newColumnName, columnIndex) => { if (!newColumnName || newColumnName.trim() === "") { setEditColumnNameMissing(true); return; } if (columnName === newColumnName) { return; } const actionStatusPrefix = "Rename column"; let newActionStatus = { id: actionStatusPrefix + projectId + columnIndex, status: `Saving column ${columnName} as ${newColumnName}`, }; try { addActionStatus(newActionStatus); setColumnName(newColumnName); Near.fakCalimeroCall(contract, "rename_status", { project_id: projectId, status_index: columnIndex, new_name: newColumnName, }).then(() => { newActionStatus.status = `Saved column ${columnName} as ${newColumnName}`; addActionStatus(newActionStatus); }); } catch { newActionStatus.status = `Error saving column ${columnName} as ${newColumnName}`; addActionStatus(newActionStatus); setColumnName(columnName); setColumnDetailsOpen(false); } }; const deleteColumn = useCallback(() => { const actionStatusPrefix = "Delete column"; let newActionStatus = { id: actionStatusPrefix + projectId + columnIndex, status: `Deleting column ${columnName}`, seen: false, }; try { addActionStatus(newActionStatus); removeColumn(columnIndex); Near.fakCalimeroCall(contract, "remove_status", { project_id: projectId, status_index: columnIndex, }).then(() => { newActionStatus.status = `Deleted column ${columnName}`; addActionStatus(newActionStatus); }); } catch (e) { console.log("deleteColumn", e); newActionStatus.status = `Error deleting column ${columnName}`; addActionStatus(newActionStatus); } setColumnDetailsOpen(false); }, [contract, projectId, columnIndex, columnName]); const editColumnContent = ( <Overlay> <ModalContent> <PopupContainer> <Header> <DialogTitle>Edit column name</DialogTitle> <CloseButton onClick={onClose}> <i className="bi bi-x-circle"></i> </CloseButton> </Header> <Divider /> <FieldContainer> <Label>Name</Label> <Input onChange={onChangeEditColumnName} value={editColumnName} placeholder="Add Name" /> {editColumnNameMissing && <MissingName>Missing name</MissingName>} </FieldContainer> <ButtonContainer> <FunctionButton backgroundColor="#D0FC42" color="black" hoverColor="#BBE33B" onClick={() => handleUpdateColumnName(columnName, editColumnName, columnIndex) } > Save </FunctionButton> <FunctionButton backgroundColor="transparent" hoverColor="#F25757" onClick={() => setDeleteContent(true)} > Delete </FunctionButton> </ButtonContainer> </PopupContainer> </ModalContent> </Overlay> ); const deleteColumnContent = ( <Overlay> <ModalContent> <DeleteColumnContainer> <TextContainer> <Text>Are you sure you want to delete this column?</Text> </TextContainer> <FunctionButton backgroundColor="#F25757" hoverColor="#DA4E4E" onClick={deleteColumn} > Delete </FunctionButton> <CloseDeleteColumnButton onClick={() => setDeleteContent(false)}> Close </CloseDeleteColumnButton> </DeleteColumnContainer> </ModalContent> </Overlay> ); const cannotDeleteColumnContent = ( <Overlay> <ModalContent> <DeleteColumnContainer> <TextContainer> <Text>You cannot delete column which contains tasks?</Text> </TextContainer> <CloseDeleteColumnButton onClick={() => setDeleteContent(false)}> Close </CloseDeleteColumnButton> </DeleteColumnContainer> </ModalContent> </Overlay> ); const content = deleteContent ? containsTasks ? cannotDeleteColumnContent : deleteColumnContent : editColumnContent; return ( <Widget src={`${componentOwnerId}/widget/Calimero.TaskChain.Popups.BaseModal`} props={{ toggle: columnDetailsButton, content, open: columnDetailsOpen, onOpenChange: (open) => setColumnDetailsOpen(open), }} /> );