Как получить общий статус ошибки в Material UI DataGrid?
Я использую компонент Material UI DataGrid для рендеринга файла EXCEL. Каждый файл Excel имеет несколько имен столбцов и имеет определенные типы. Например:
const columns = [
{
"field": "uwgroup",
"headerName": "Group",
"minWidth": 200,
"editable": true
},
{
"field": "Amazing column Name ",
"flex": 1,
"minWidth": 150,
"editable": true
},
{
"field": "Building TSI",
"flex": 1,
"minWidth": 150,
"editable": true
},
{
"field": "dev",
"flex": 1,
"minWidth": 150,
"editable": true
}
]
Название столбца
Building TSI
относится к типу
number
. И я добавляю имя класса
invalid
с использованием
cellClassName
, что-то типа:
classnames({
invalid: !isPositiveNumber(params.value)
})
Он отлично работает, отображает имя класса и указывает ячейки с ошибками. Проблема в том, что я хочу подсчитать общее количество ячеек с ошибками. Причина в том, что мы разрешаем сохранять файл Excel только в том случае, если в какой-либо ячейке нет ошибок.
Решения, которые я пробовал до сих пор:
- Добавить состояние и увеличить
errorCount
когда добавляю класс. Это вызывает несколько повторных отрисовок и превышает лимит памяти. - Я пытался использовать
document.getElementByClassNames('invalid')
и проверьте его длину. Работает только для отрендеренного элемента. То есть, если файл Excel содержит более 10 строк, он разбивается на страницы. Подсчет недопустимых ячеек выполняется только для текущей отображаемой страницы. - Я пытался использовать
preProcessEditCellProps
реквизиты для обозначения ошибки. Однако мне не удалось найти способ получить общее количество ячеек с ошибками. Единственное, что я мог извлечь из этого реквизита, - это возможность не позволять пользователю вводить неверное значение. - Я даже пробовал использовать
localStorage
. У него та же проблема, что и у решения номер 2.
Буду признателен, если бы кто-нибудь столкнулся с подобным сценарием. Было бы неплохо получить общее количество ячеек с ошибками, поэтому я могу отключить кнопку СОХРАНИТЬ.
Заранее спасибо!
2 ответа
Может помочь наличие другого свойства в столбцах и ссылка на него перед экспортом для каждой ячейки/строки.
В этом примере вызов функции expiredForExport с определением столбцов и фактическими данными в качестве параметров даст логическое значение, указывающее, существует ли ошибка или нет. Также можно изменить для подсчета ошибок.
const isInvalidBuildingTSI=(value)=>!isPositiveNumber(value);
const isPositiveNumber=(num)=>num>=0;
const eligibleForExport=(columns,data)=>{
return !(data.find(row=>columns.find(column=>row[column.field]
&& typeof column["isValid"] === "function" && column["isValid"](row[column.field]))))
}
const columns = [
{
"field": "uwgroup",
"headerName": "Group",
"minWidth": 200,
"editable": true
},
{
"field": "Building TSI",
"type": 'number',
"flex": 1,
"minWidth": 150,
"editable": true,
"isValid" : isInvalidBuildingTSI,
"cellClassName":isInvalidBuildingTSI(param.value)?"invalid":""
}
];
Если исходные данные всегда действительны , простой способ решить вашу проблему — следовать документации DataGrid о проверке на стороне клиента:
Проверка на стороне клиента
Чтобы проверить значение в ячейках, сначала добавьте
preProcessEditCellProps
обратный вызов определения столбца поля для проверки. После его вызова подтвердите значение, указанное вparams.props.value
. Затем верните новый объект, содержащийparams.props
а также атрибут, установленный в значение true или false. Еслиerror
имеет значение true, значение никогда не будет зафиксировано.const columns: GridColDef[] = [ { field: 'firstName', preProcessEditCellProps: (params: GridEditCellPropsChangeParams) => { const hasError = params.props.value.length < 3; return { ...params.props, error: hasError }; }, }, ];
Для вашего сценария это приведет к следующему:
const columns = [
{
"field": "uwgroup",
"headerName": "Group",
"minWidth": 200,
"editable": true
},
{
"field": "Amazing column Name ",
"flex": 1,
"minWidth": 150,
"editable": true
},
{
"field": "Building TSI",
"type": 'number',
"flex": 1,
"minWidth": 150,
"editable": true,
preProcessEditCellProps(params) {
const invalid = !isPositiveNumber(params.props.value);
return { ...params.props, error: invalid };
}
},
{
"field": "dev",
"flex": 1,
"minWidth": 150,
"editable": true
}
]
Есть важное отличие от того, что у вас есть сейчас. Эта проверка влияет только на правки. Таким образом, исходные данные должны быть действительными. Преимущество в том, что вам больше не нужно использовать
classnames({ invalid: !isPositiveNumber(params.value) })
и кнопка сохранения всегда может быть включена, так как все зафиксированные изменения можно считать действительными.
Если исходные данные могут быть неверными, это, вероятно, не тот ответ, который вы ищете.