Hi everyone,
I’m new to Dash and trying to validate the data in a new row of my Dash data table.
When the admin input a negative integer, the alert would pop out.
My current code is as below:
@app.callback(
[Output('editable-input-table', 'children'),
Output('validation-alert', 'children'),
Output('validation-alert', 'is_open')],
Input('editable-input-table', 'data_timestamp'),
[State('editable-input-table', 'data')],
)
def validate_new_data(timestamp, data):
for row in data:
if not (type(row['index']) in {int, np.int64} and row['index'] > 0):
# or row['index'] in set(table['index']): # don't understand the purpose of this line
return [dash.no_update, '"index" must be a unique integer']
elif not (type(row['centre']) == str):
# or row['centre'] in set(table['centre']): # don't understand the purpose of this line
return [dash.no_update, '"centre" must be a unique string']
elif not (type(row['minBooths']) in {int, np.int64} and row['minBooths'] > 0):
return [dash.no_update, '"minBooths" must be a non-negative integer']
elif not (type(row['maxBooths']) in {int, np.int64} and row['maxBooths'] > row['minBooths']):
return [dash.no_update, '"minBooths" must be an integer no less than "maxBooths"']
elif not (type(row['maxDays']) in {int, np.int64} and row['maxDays'] >= 0 and row['maxDays'] <= 7):
return [dash.no_update, '"maxDays" must be an integer between 0 and 7']
elif not (type(row['vaxHours']) in {int, np.int64, float} and row['vaxHours'] >= 0 and row['vaxHours'] <= 24):
return [dash.no_update, '"vaxHours" must be an integer or float between 0 and 24']
elif not (type(row['workingHours']) in {int, np.int64, float} and row['workingHours'] >= 0 and row[
'workingHours'] <= 24):
return [dash.no_update, '"workingHours" must be an integer or float between 0 and 24']
elif not (type(row['reqDose']) in {int, np.int64} and row['reqDose'] >= 0):
return [dash.no_update, '"reqDose" must be a non-negative integer']
elif not (type(row['vph']) in {int, np.int64, float, np.float64} and row['vph'] >= 0):
return [dash.no_update, '"vph" must be a non-negative integer or float']
elif not (type(row['catchment']) in {int, np.int64} and row['catchment'] >= 0):
return [dash.no_update, '"catchment" must be a non-negative integer']
elif not (type(row['enabled']) in ['true', 'false']):
return [dash.no_update, '"enabled" must be a boolean value i.e. either "True" or "False"']
elif not (type(row['flex']) in ['true', 'false']):
return [dash.no_update, '"flex" must be a boolean value i.e. either "True" or "False"']
elif not (type(row['lat']) in {int, np.int64, float, np.float64} and row['lat'] >= -90 and row['lat'] <= 90):
return [dash.no_update, '"lat" must be an integer or float between -90 and 90']
elif not (type(row['lon']) in {int, np.int64, float, np.float64} and row['lon'] >= -90 and row['lon'] <= 90):
return [dash.no_update, '"lon" must be an integer or float between -180 and 180']
page = html.Div([
dbc.Row([
html.Div(logo, style={'padding': 40}),
dbc.Row([
dbc.Row(html.Div(editable_input)),
dbc.Row(html.Div(new_row)),
dbc.Alert(id='validation-alert',
color="danger",
dismissable=True
),
dbc.Row(html.Br()),
]),
]),
Thank you for reading!