1
0
Fork 0
mirror of synced 2024-10-02 01:56:57 +13:00

Merge pull request #2114 from mslourens/clear_form_action

Clear form action
This commit is contained in:
Martin McKeaveney 2021-07-28 10:42:17 +01:00 committed by GitHub
commit e40c8cd9ef
6 changed files with 79 additions and 1 deletions

View file

@ -0,0 +1,35 @@
<script>
import { Select, Label } from "@budibase/bbui"
import { currentAsset, store } from "builderStore"
import { getActionProviderComponents } from "builderStore/dataBinding"
export let parameters
$: actionProviders = getActionProviderComponents(
$currentAsset,
$store.selectedComponentId,
"ClearForm"
)
</script>
<div class="root">
<Label small>Form</Label>
<Select
bind:value={parameters.componentId}
options={actionProviders}
getOptionLabel={x => x._instanceName}
getOptionValue={x => x._id}
/>
</div>
<style>
.root {
display: grid;
column-gap: var(--spacing-l);
row-gap: var(--spacing-s);
grid-template-columns: 60px 1fr;
align-items: center;
max-width: 800px;
margin: 0 auto;
}
</style>

View file

@ -5,6 +5,7 @@ import ExecuteQuery from "./ExecuteQuery.svelte"
import TriggerAutomation from "./TriggerAutomation.svelte"
import ValidateForm from "./ValidateForm.svelte"
import LogOut from "./LogOut.svelte"
import ClearForm from "./ClearForm.svelte"
// Defines which actions are available to configure in the front end.
// Unfortunately the "name" property is used as the identifier so please don't
@ -42,4 +43,8 @@ export default [
name: "Log Out",
component: LogOut,
},
{
name: "Clear Form",
component: ClearForm,
},
]

View file

@ -6,6 +6,7 @@ export const ActionTypes = {
ValidateForm: "ValidateForm",
RefreshDatasource: "RefreshDatasource",
SetDataProviderQuery: "SetDataProviderQuery",
ClearForm: "ClearForm",
}
export const ApiVersion = "1"

View file

@ -86,6 +86,14 @@ const logoutHandler = async () => {
await authStore.actions.logOut()
}
const clearFormHandler = async (action, context) => {
return await executeActionHandler(
context,
action.parameters.componentId,
ActionTypes.ClearForm
)
}
const handlerMap = {
["Save Row"]: saveRowHandler,
["Delete Row"]: deleteRowHandler,
@ -95,6 +103,7 @@ const handlerMap = {
["Validate Form"]: validateFormHandler,
["Refresh Datasource"]: refreshDatasourceHandler,
["Log Out"]: logoutHandler,
["Clear Form"]: clearFormHandler,
}
const confirmTextMap = {

View file

@ -1647,7 +1647,8 @@
"hasChildren": true,
"illegalChildren": ["section"],
"actions": [
"ValidateForm"
"ValidateForm",
"ClearForm"
],
"styles": ["size"],
"settings": [

View file

@ -64,6 +64,13 @@
})
return get(formState).valid
},
clear: () => {
const fields = Object.keys(fieldMap)
fields.forEach(field => {
const { fieldApi } = fieldMap[field]
fieldApi.clearValue()
})
},
}
// Provide both form API and state to children
@ -72,6 +79,7 @@
// Action context to pass to children
const actions = [
{ type: ActionTypes.ValidateForm, callback: formApi.validate },
{ type: ActionTypes.ClearForm, callback: formApi.clear },
]
// Creates an API for a specific field
@ -108,8 +116,27 @@
return !newError
}
const clearValue = () => {
const { fieldState } = fieldMap[field]
const newValue = initialValues[field] ?? defaultValue
fieldState.update(state => {
state.value = newValue
state.error = null
return state
})
formState.update(state => {
state.values = { ...state.values, [field]: newValue }
delete state.errors[field]
state.valid = Object.keys(state.errors).length === 0
return state
})
}
return {
setValue,
clearValue,
validate: () => {
const { fieldState } = fieldMap[field]
setValue(get(fieldState).value, true)