Compare commits

..

No commits in common. "66f5e51e1efdbfcf66c351dae267422ca3406b31" and "ea83eba5b54fe720144004ac9d4ed428dea15ccd" have entirely different histories.

9 changed files with 82 additions and 109 deletions

View File

@ -26,13 +26,10 @@ import { useTasksFunctions } from "../hooks/tasks_hooks"; //Состояние
//Стили //Стили
const STYLES = { const STYLES = {
MENU_ITEM_DELIMITER: { borderBottom: "1px solid lightgrey" }, MENU_ITEM_DELIMITER: { borderBottom: "1px solid lightgrey" },
CARD: (task, colorRule) => { CARD: (indicatorClr, bgClr) => {
const expiredColor = getTaskExpiredColor(task); const i = indicatorClr ? { borderLeft: `solid ${indicatorClr}` } : null;
const backgroundColor = task.nClosed ? "#d3d3d3" : colorRule.SCOLOR ? getTaskBgColorByRule(task, colorRule) : null; const bc = bgClr ? { backgroundColor: bgClr } : null;
return { return { ...i, ...bc };
...(expiredColor ? { borderLeft: `solid ${expiredColor}` } : {}),
...(backgroundColor ? { backgroundColor: backgroundColor } : {})
};
}, },
CARD_HEADER_TITLE: { CARD_HEADER_TITLE: {
padding: "4px", padding: "4px",
@ -45,12 +42,14 @@ const STYLES = {
}, },
CARD_HEADER: { padding: 0, cursor: "pointer" }, CARD_HEADER: { padding: 0, cursor: "pointer" },
CARD_CONTENT: { padding: "4px !important" }, CARD_CONTENT: { padding: "4px !important" },
CARD_CONTENT_BOX: { display: "flex", alignItems: "center", width: "100%" }, CARD_CONTENT_BOX: { display: "flex", alignItems: "center" },
STACK_SENDER: { alignItems: "center", marginLeft: "auto", width: "50%", justifyContent: "flex-end", paddingLeft: "10px", gap: "5px" }, STACK_SENDER: { alignItems: "center", marginLeft: "auto" },
TYPOGRAPHY_TASK: { color: "text.secondary", fontSize: 14, width: "40%", overflow: "hidden" }, TYPOGRAPHY_SECONDARY: {
TYPOGRAPHY_SENDER: { color: "text.secondary", fontSize: 14, width: "80%", overflow: "hidden", textAlign: "end" }, color: "text.secondary",
fontSize: 14
},
ICON_COLOR: linked => { ICON_COLOR: linked => {
return { color: theme => (linked ? TASK_COLORS.LINKED : theme.palette.grey[500]), width: "10%" }; return { color: theme => (linked ? TASK_COLORS.LINKED : theme.palette.grey[500]) };
} }
}; };
@ -61,7 +60,6 @@ const STYLES = {
//Действия карточки события //Действия карточки события
const CardActions = ({ const CardActions = ({
taskRn, taskRn,
taskClosed,
menuItems, menuItems,
cardActions, cardActions,
onMethodsMenuButtonClick, onMethodsMenuButtonClick,
@ -94,7 +92,6 @@ const CardActions = ({
sx={action.delimiter ? STYLES.MENU_ITEM_DELIMITER : {}} sx={action.delimiter ? STYLES.MENU_ITEM_DELIMITER : {}}
key={`${taskRn}_${action.method}`} key={`${taskRn}_${action.method}`}
onClick={() => handleActionClick(action)} onClick={() => handleActionClick(action)}
disabled={taskClosed === 1 && action.disableClosed ? true : false}
> >
<Icon>{action.icon}</Icon> <Icon>{action.icon}</Icon>
<Typography pl={1}>{action.name}</Typography> <Typography pl={1}>{action.name}</Typography>
@ -109,7 +106,6 @@ const CardActions = ({
//Контроль свойств - Действия карточки события //Контроль свойств - Действия карточки события
CardActions.propTypes = { CardActions.propTypes = {
taskRn: PropTypes.number.isRequired, taskRn: PropTypes.number.isRequired,
taskClosed: PropTypes.oneOf([0, 1]).isRequired,
menuItems: PropTypes.array.isRequired, menuItems: PropTypes.array.isRequired,
cardActions: PropTypes.object.isRequired, cardActions: PropTypes.object.isRequired,
onMethodsMenuButtonClick: PropTypes.func.isRequired, onMethodsMenuButtonClick: PropTypes.func.isRequired,
@ -334,7 +330,12 @@ const TaskCard = ({ task, index, onTasksReload, colorRule, pointSettings, onOpen
) : null} ) : null}
<Draggable draggableId={task.id.toString()} key={task.id} index={index}> <Draggable draggableId={task.id.toString()} key={task.id} index={index}>
{provided => ( {provided => (
<Card ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} sx={STYLES.CARD(task, colorRule)}> <Card
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
sx={STYLES.CARD(getTaskExpiredColor(task), colorRule.SCOLOR ? getTaskBgColorByRule(task, colorRule) : null)}
>
<CardHeader <CardHeader
title={ title={
<Typography <Typography
@ -346,7 +347,6 @@ const TaskCard = ({ task, index, onTasksReload, colorRule, pointSettings, onOpen
action.method === "EDIT" ? action.func(task.nRn, action.tasksReload ? onTasksReload : null) : null action.method === "EDIT" ? action.func(task.nRn, action.tasksReload ? onTasksReload : null) : null
); );
}} }}
title={task.sDescription}
> >
{task.sDescription} {task.sDescription}
</Typography> </Typography>
@ -355,7 +355,6 @@ const TaskCard = ({ task, index, onTasksReload, colorRule, pointSettings, onOpen
action={ action={
<CardActions <CardActions
taskRn={task.nRn} taskRn={task.nRn}
taskClosed={task.nClosed}
menuItems={menuItems} menuItems={menuItems}
cardActions={cardActions} cardActions={cardActions}
onMethodsMenuButtonClick={handleMethodsMenuButtonClick} onMethodsMenuButtonClick={handleMethodsMenuButtonClick}
@ -378,14 +377,10 @@ const TaskCard = ({ task, index, onTasksReload, colorRule, pointSettings, onOpen
> >
<Icon>assignment</Icon> <Icon>assignment</Icon>
</IconButton> </IconButton>
<Typography sx={STYLES.TYPOGRAPHY_TASK} noWrap title={task.name}> <Typography sx={STYLES.TYPOGRAPHY_SECONDARY}>{task.name}</Typography>
{task.name}
</Typography>
{task.sSender ? ( {task.sSender ? (
<Stack direction="row" spacing={0.5} sx={STYLES.STACK_SENDER}> <Stack direction="row" spacing={0.5} sx={STYLES.STACK_SENDER}>
<Typography sx={STYLES.TYPOGRAPHY_SENDER} title={task.sSender} noWrap> <Typography sx={STYLES.TYPOGRAPHY_SECONDARY}>{task.sSender}</Typography>
{task.sSender}
</Typography>
<Avatar src={task.avatar ? `data:image/png;base64,${task.avatar}` : null} /> <Avatar src={task.avatar ? `data:image/png;base64,${task.avatar}` : null} />
</Stack> </Stack>
) : null} ) : null}

View File

@ -7,12 +7,14 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useCallback } from "react"; //Классы React import React, { useState, useEffect, useCallback } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Typography, Tabs, Tab, InputAdornment, IconButton, Icon } from "@mui/material"; //Интерфейсные компоненты import { Box, Typography, Tabs, Tab, InputAdornment, IconButton, Icon } from "@mui/material"; //Интерфейсные компоненты
import { TaskFormTabInfo } from "./task_form_tab_info"; //Вкладка основной информации import { TaskFormTabInfo } from "./task_form_tab_info"; //Вкладка основной информации
import { TaskFormTabExecutor } from "./task_form_tab_executor"; //Вкладка информации об исполнителе import { TaskFormTabExecutor } from "./task_form_tab_executor"; //Вкладка информации об исполнителе
import { TaskFormTabProps } from "./task_form_tab_props"; //Вкладка информации со свойствами import { TaskFormTabProps } from "./task_form_tab_props"; //Вкладка информации со свойствами
import { useDocsProps } from "../hooks/task_dialog_hooks"; //Хук для получения свойств раздела "События"
import { hasValue } from "../../../core/utils";
//--------- //---------
//Константы //Константы
@ -72,10 +74,13 @@ export const getInputProps = (onClick, disabled = false, icon = "list") => {
//----------- //-----------
//Форма события //Форма события
const TaskForm = ({ task, taskType, editable, docProps, onTaskChange, onEventNextNumbGet }) => { const TaskForm = ({ task, taskType, onTaskChange, editable, onEventNextNumbGet, onDPReady }) => {
//Состояние вкладки //Состояние вкладки
const [tab, setTab] = useState(0); const [tab, setTab] = useState(0);
//Состояние допустимых дополнительных свойств
const [docProps] = useDocsProps(taskType);
//При изменении вкладки //При изменении вкладки
const handleTabChange = (e, newValue) => { const handleTabChange = (e, newValue) => {
setTab(newValue); setTab(newValue);
@ -102,16 +107,24 @@ const TaskForm = ({ task, taskType, editable, docProps, onTaskChange, onEventNex
[onTaskChange, task.docProps] [onTaskChange, task.docProps]
); );
//Проверка заполненности всех обязательных доп. свойств
useEffect(() => {
//Считываем количество незаполненных обязательных свойств
let notFilled = docProps.props.filter(docProp => docProp.BREQUIRE === true && !hasValue(task.docProps[docProp.SFORMATTED_ID])).length;
//Если доп. свойства загрузились и количество незаполненных = 0 - доп. свойства готовы, иначе не готовы
docProps.loaded && notFilled === 0 ? onDPReady(true) : onDPReady(false);
}, [docProps, onDPReady, task.docProps]);
//Генерация содержимого //Генерация содержимого
return ( return (
<Box sx={STYLES.CONTAINER}> <Box sx={STYLES.CONTAINER}>
<Typography pb={1} variant="h6"> <Typography pb={1} variant="h6">
{task.nRn ? `Исправление события${task.nClosed ? " (событые аннулировано)" : ""}` : "Добавление события"} {task.nRn ? "Исправление события" : "Добавление события"}
</Typography> </Typography>
<Tabs value={tab} onChange={handleTabChange} aria-label="tabs of values"> <Tabs value={tab} onChange={handleTabChange} aria-label="tabs of values">
<Tab label="Событие" {...a11yProps(0)} /> <Tab label="Событие" {...a11yProps(0)} />
<Tab label="Исполнитель" {...a11yProps(1)} /> <Tab label="Исполнитель" {...a11yProps(1)} />
{docProps.length > 0 ? <Tab label="Свойства" {...a11yProps(2)} /> : null} {docProps.props.length > 0 ? <Tab label="Свойства" {...a11yProps(2)} /> : null}
</Tabs> </Tabs>
<CustomTabPanel value={tab} index={0}> <CustomTabPanel value={tab} index={0}>
<TaskFormTabInfo task={task} editable={editable} onFieldEdit={handleFieldEdit} onEventNextNumbGet={onEventNextNumbGet} /> <TaskFormTabInfo task={task} editable={editable} onFieldEdit={handleFieldEdit} onEventNextNumbGet={onEventNextNumbGet} />
@ -119,7 +132,7 @@ const TaskForm = ({ task, taskType, editable, docProps, onTaskChange, onEventNex
<CustomTabPanel value={tab} index={1}> <CustomTabPanel value={tab} index={1}>
<TaskFormTabExecutor task={task} onFieldEdit={handleFieldEdit} /> <TaskFormTabExecutor task={task} onFieldEdit={handleFieldEdit} />
</CustomTabPanel> </CustomTabPanel>
{docProps.length > 0 ? ( {docProps.props.length > 0 ? (
<CustomTabPanel value={tab} index={2}> <CustomTabPanel value={tab} index={2}>
<TaskFormTabProps task={task} taskType={taskType} docProps={docProps} onPropEdit={handlePropEdit} /> <TaskFormTabProps task={task} taskType={taskType} docProps={docProps} onPropEdit={handlePropEdit} />
</CustomTabPanel> </CustomTabPanel>
@ -132,10 +145,10 @@ const TaskForm = ({ task, taskType, editable, docProps, onTaskChange, onEventNex
TaskForm.propTypes = { TaskForm.propTypes = {
task: PropTypes.object.isRequired, task: PropTypes.object.isRequired,
taskType: PropTypes.string.isRequired, taskType: PropTypes.string.isRequired,
editable: PropTypes.bool.isRequired,
docProps: PropTypes.array,
onTaskChange: PropTypes.func.isRequired, onTaskChange: PropTypes.func.isRequired,
onEventNextNumbGet: PropTypes.func.isRequired editable: PropTypes.bool.isRequired,
onEventNextNumbGet: PropTypes.func.isRequired,
onDPReady: PropTypes.func.isRequired
}; };
//---------------- //----------------

View File

@ -89,7 +89,7 @@ const TaskFormTabInfo = ({ task, editable, onFieldEdit, onEventNextNumbGet }) =>
value={task.sCrn} value={task.sCrn}
variant="standard" variant="standard"
onChange={onFieldEdit} onChange={onFieldEdit}
InputProps={getInputProps(handleCrnChange, task.isUpdate || task.nClosed === 1)} InputProps={getInputProps(handleCrnChange)}
required required
disabled={task.isUpdate} disabled={task.isUpdate}
/> />
@ -159,8 +159,8 @@ const TaskFormTabInfo = ({ task, editable, onFieldEdit, onEventNextNumbGet }) =>
value={task.sClntClients} value={task.sClntClients}
variant="standard" variant="standard"
onChange={onFieldEdit} onChange={onFieldEdit}
disabled={!task.sType || task.nClosed === 1} disabled={!task.sType}
InputProps={getInputProps(() => handleClntClientsChange(), !task.sType || task.nClosed === 1)} InputProps={getInputProps(() => handleClntClientsChange(), !task.sType)}
></TextField> ></TextField>
<TextField <TextField
sx={COMMON_STYLES.TASK_FORM_TEXT_FIELD()} sx={COMMON_STYLES.TASK_FORM_TEXT_FIELD()}
@ -169,8 +169,8 @@ const TaskFormTabInfo = ({ task, editable, onFieldEdit, onEventNextNumbGet }) =>
value={task.sClntClnperson} value={task.sClntClnperson}
variant="standard" variant="standard"
onChange={onFieldEdit} onChange={onFieldEdit}
disabled={!task.sType || task.nClosed === 1} disabled={!task.sType}
InputProps={getInputProps(() => handleClntClnpersonChange(), !task.sType || task.nClosed === 1)} InputProps={getInputProps(() => handleClntClnpersonChange(), !task.sType)}
></TextField> ></TextField>
</Box> </Box>
</Box> </Box>

View File

@ -101,7 +101,7 @@ const TaskFormTabProps = ({ task, docProps, onPropEdit }) => {
return ( return (
<Box> <Box>
<Box sx={COMMON_STYLES.BOX_WITH_LEGEND} component="fieldset"> <Box sx={COMMON_STYLES.BOX_WITH_LEGEND} component="fieldset">
{docProps.map((docProp, index) => { {docProps.props.map((docProp, index) => {
return docProp.BSHOW_IN_GRID ? ( return docProp.BSHOW_IN_GRID ? (
<TextField <TextField
error={ error={
@ -158,7 +158,7 @@ const TaskFormTabProps = ({ task, docProps, onPropEdit }) => {
//Контроль свойств - Вкладка информации со свойствами //Контроль свойств - Вкладка информации со свойствами
TaskFormTabProps.propTypes = { TaskFormTabProps.propTypes = {
task: PropTypes.object.isRequired, task: PropTypes.object.isRequired,
docProps: PropTypes.array.isRequired, docProps: PropTypes.object.isRequired,
onPropEdit: PropTypes.func.isRequired onPropEdit: PropTypes.func.isRequired
}; };

View File

@ -74,7 +74,6 @@ const useClientEvent = (taskRn, taskType = "") => {
setTask(pv => ({ setTask(pv => ({
...pv, ...pv,
sCrn: data.XEVENT.SCRN, sCrn: data.XEVENT.SCRN,
nClosed: data.XEVENT.NCLOSED,
sPrefix: data.XEVENT.SPREF, sPrefix: data.XEVENT.SPREF,
sNumber: data.XEVENT.SNUMB, sNumber: data.XEVENT.SNUMB,
sType: data.XEVENT.STYPE, sType: data.XEVENT.STYPE,

View File

@ -326,7 +326,6 @@ const useTasks = (filterValues, ordersValues) => {
nRn: task.NRN, nRn: task.NRN,
sCrn: "", sCrn: "",
nCrn: task.NCRN, nCrn: task.NCRN,
nClosed: task.NCLOSED,
sPrefix: task.SEVPREF, sPrefix: task.SEVPREF,
sNumber: task.SEVNUMB, sNumber: task.SEVNUMB,
sType: task.SEVTYPE_CODE, sType: task.SEVTYPE_CODE,

View File

@ -208,7 +208,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: false, delimiter: false,
tasksReload: false, tasksReload: false,
needAccountsReload: false, needAccountsReload: false,
disableClosed: false,
func: onEdit func: onEdit
}, },
{ {
@ -219,7 +218,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: false, delimiter: false,
tasksReload: false, tasksReload: false,
needAccountsReload: false, needAccountsReload: false,
disableClosed: false,
func: onEditClient func: onEditClient
}, },
{ {
@ -230,7 +228,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: false, delimiter: false,
tasksReload: true, tasksReload: true,
needAccountsReload: false, needAccountsReload: false,
disableClosed: false,
func: onMove func: onMove
}, },
{ {
@ -241,7 +238,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: true, delimiter: true,
tasksReload: true, tasksReload: true,
needAccountsReload: false, needAccountsReload: false,
disableClosed: false,
func: onDelete func: onDelete
}, },
{ {
@ -252,7 +248,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: false, delimiter: false,
tasksReload: true, tasksReload: true,
needAccountsReload: true, needAccountsReload: true,
disableClosed: true,
func: onStateChange func: onStateChange
}, },
{ {
@ -263,7 +258,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: false, delimiter: false,
tasksReload: true, tasksReload: true,
needAccountsReload: true, needAccountsReload: true,
disableClosed: true,
func: onReturn func: onReturn
}, },
{ {
@ -274,7 +268,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: true, delimiter: true,
tasksReload: true, tasksReload: true,
needAccountsReload: true, needAccountsReload: true,
disableClosed: true,
func: onSend func: onSend
}, },
{ {
@ -285,7 +278,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: true, delimiter: true,
tasksReload: false, tasksReload: false,
needAccountsReload: false, needAccountsReload: false,
disableClosed: false,
func: onNotesOpen func: onNotesOpen
}, },
{ {
@ -296,7 +288,6 @@ export const makeCardActionsArray = (onEdit, onEditClient, onDelete, onStateChan
delimiter: false, delimiter: false,
tasksReload: false, tasksReload: false,
needAccountsReload: false, needAccountsReload: false,
disableClosed: false,
func: onFileLinksOpen func: onFileLinksOpen
} }
]; ];

View File

@ -7,16 +7,14 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useCallback, useContext, useEffect } from "react"; //Классы React import React, { useState, useCallback, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogContent, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты import { Dialog, DialogContent, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты
import { useClientEvent } from "./hooks/task_dialog_hooks"; //Хук для события import { useClientEvent } from "./hooks/task_dialog_hooks"; //Хук для события
import { useDocsProps } from "./hooks/task_dialog_hooks"; //Хук для получения доп. свойств раздела "События"
import { TaskForm } from "./components/task_form"; //Форма события import { TaskForm } from "./components/task_form"; //Форма события
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
import { COMMON_STYLES } from "./styles"; //Общие стили import { COMMON_STYLES } from "./styles"; //Общие стили
import { hasValue } from "../../core/utils"; //Вспомогательные процедуры и функции
//--------- //---------
//Константы //Константы
@ -41,15 +39,15 @@ const TaskDialog = ({ taskRn, taskType, editable, onTasksReload, onClose }) => {
//Собственное состояние //Собственное состояние
const [task, setTask] = useClientEvent(taskRn, taskType); const [task, setTask] = useClientEvent(taskRn, taskType);
//Состояние допустимых дополнительных свойств //Состояние заполненности всех обязательных свойств
const [docProps] = useDocsProps(taskType); const [dpReady, setDPReady] = useState(false);
//Состояние заполненности всех обязательных доп. свойств
const [docPropsReady, setDocPropsReady] = useState(false);
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx); const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//При изменении заполненности всех обязательных свойств
const handleDPReady = useCallback(v => setDPReady(v), []);
//При изменении информации о задаче //При изменении информации о задаче
const handleTaskChange = useCallback( const handleTaskChange = useCallback(
newTaskValues => { newTaskValues => {
@ -131,58 +129,37 @@ const TaskDialog = ({ taskRn, taskType, editable, onTasksReload, onClose }) => {
} }
}, [executeStored, setTask, task.sPrefix]); }, [executeStored, setTask, task.sPrefix]);
//Проверка заполненности всех обязательных доп. свойств
useEffect(() => {
//Если доп. свойства загрузились
if (docProps.loaded) {
//Проверяем остались ли обязательные незаполненные свойства
let notFilled = docProps.props.some(docProp => docProp.BREQUIRE === true && !hasValue(task.docProps[docProp.SFORMATTED_ID]));
//Если незаполненных обязательных доп. свойств не осталось - доп. свойства готовы, иначе не готовы
setDocPropsReady(!notFilled);
} else {
//Доп. свойства не готовы
setDocPropsReady(false);
}
}, [docProps.loaded, docProps.props, task.docProps]);
//Генерация содержимого //Генерация содержимого
return ( return (
<> <Dialog open onClose={onClose ? onClose : null} fullWidth>
{!task.init && docProps.loaded && ( <DialogContent sx={STYLES.DIALOG_CONTENT}>
<Dialog open onClose={onClose ? onClose : null} fullWidth> <TaskForm
<DialogContent sx={STYLES.DIALOG_CONTENT}> task={task}
<TaskForm taskType={taskType}
task={task} onTaskChange={handleTaskChange}
taskType={taskType} editable={!taskRn || editable ? true : false}
editable={!taskRn || editable ? true : false} onEventNextNumbGet={handleEventNextNumbGet}
docProps={docProps.props} onDPReady={handleDPReady}
onTaskChange={handleTaskChange} />
onEventNextNumbGet={handleEventNextNumbGet} </DialogContent>
/> {onClose ? (
</DialogContent> <DialogActions sx={COMMON_STYLES.DIALOG_ACTIONS}>
{onClose ? ( {taskRn ? (
<DialogActions sx={COMMON_STYLES.DIALOG_ACTIONS}> <Button
{taskRn ? ( onClick={() => handleUpdateEvent(onClose).then(onTasksReload)}
<Button disabled={task.updateDisabled || !editable || !dpReady}
onClick={() => handleUpdateEvent(onClose).then(onTasksReload)} >
disabled={task.updateDisabled || !editable || !docPropsReady} Исправить
> </Button>
Исправить ) : (
</Button> <Button onClick={() => handleInsertTask(onClose).then(onTasksReload)} disabled={task.insertDisabled || !dpReady}>
) : ( Добавить
<Button </Button>
onClick={() => handleInsertTask(onClose).then(onTasksReload)} )}
disabled={task.insertDisabled || !docPropsReady} <Button onClick={onClose}>Закрыть</Button>
> </DialogActions>
Добавить ) : null}
</Button> </Dialog>
)}
<Button onClick={onClose}>Закрыть</Button>
</DialogActions>
) : null}
</Dialog>
)}{" "}
</>
); );
}; };

View File

@ -1396,7 +1396,6 @@ create or replace package body PKG_P8PANELS_CLNTTSKBRD as
PKG_XFAST.DOWN_NODE(SNAME => 'XDATA'); PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
PKG_XFAST.DOWN_NODE(SNAME => 'XEVENT'); PKG_XFAST.DOWN_NODE(SNAME => 'XEVENT');
PKG_XFAST.ATTR(SNAME => 'SCRN', SVALUE => SCRN); PKG_XFAST.ATTR(SNAME => 'SCRN', SVALUE => SCRN);
PKG_XFAST.ATTR(SNAME => 'NCLOSED', NVALUE => RCLNEVENTS.CLOSED);
PKG_XFAST.ATTR(SNAME => 'SPREF', SVALUE => RCLNEVENTS.EVENT_PREF); PKG_XFAST.ATTR(SNAME => 'SPREF', SVALUE => RCLNEVENTS.EVENT_PREF);
PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => RCLNEVENTS.EVENT_NUMB); PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => RCLNEVENTS.EVENT_NUMB);
PKG_XFAST.ATTR(SNAME => 'STYPE', SVALUE => STYPE); PKG_XFAST.ATTR(SNAME => 'STYPE', SVALUE => STYPE);