FIX: Empty param-inout form should reject submit (#309)

The `onSubmit` hook will only be triggered when the form is valid, so we
need to clear the contents of `serializedData` in advance in `submit`.
Otherwise, it may not throw a validation error.
This commit is contained in:
锦心 2024-08-20 10:09:48 +08:00 committed by GitHub
parent 5080ce9b1f
commit 6d179745ec
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 2 deletions

View File

@ -278,6 +278,7 @@ export default class ParamInputForm extends Component {
if (this.form == null) { if (this.form == null) {
throw "No form"; throw "No form";
} }
this.serializedData = null;
await this.form.submit(); await this.form.submit();
if (this.serializedData == null) { if (this.serializedData == null) {
throw new ParamValidationError("validation_failed"); throw new ParamValidationError("validation_failed");
@ -293,7 +294,6 @@ export default class ParamInputForm extends Component {
@action @action
onSubmit(data) { onSubmit(data) {
this.serializedData = null;
const serializedData = {}; const serializedData = {};
for (const [id, val] of Object.entries(data)) { for (const [id, val] of Object.entries(data)) {
serializedData[id] = serializedData[id] =

View File

@ -91,7 +91,7 @@ export default class GroupReportsShowController extends Controller {
} catch (error) { } catch (error) {
if (error.jqXHR?.status === 422 && error.jqXHR.responseJSON) { if (error.jqXHR?.status === 422 && error.jqXHR.responseJSON) {
this.results = error.jqXHR.responseJSON; this.results = error.jqXHR.responseJSON;
} else if (error instanceof ParamValidationError) { } else if (!(error instanceof ParamValidationError)) {
popupAjaxError(error); popupAjaxError(error);
} }
} finally { } finally {

View File

@ -169,4 +169,36 @@ module("Data Explorer Plugin | Component | param-input", function (hooks) {
}); });
} }
} }
test("empty form will reject submit", async function (assert) {
this.setProperties({
param_info: [
{
identifier: "string",
type: "string",
default: null,
nullable: false,
},
],
initialValues: {},
onRegisterApi: ({ submit }) => {
this.submit = submit;
},
});
await render(hbs`
<ParamInputForm
@initialValues={{this.initialValues}}
@paramInfo={{this.param_info}}
@onRegisterApi={{this.onRegisterApi}}
/>`);
assert.rejects(this.submit());
// After successfully submitting the test once, edit and submit again.
await fillIn(`[name="string"]`, "foo");
await this.submit();
await fillIn(`[name="string"]`, "");
assert.rejects(this.submit());
});
}); });