#12 - form live preview

This commit was merged in pull request #14.
This commit is contained in:
Martin Slachta
2026-06-14 14:13:37 +02:00
parent 0fc0addf47
commit 2890a9b993
8 changed files with 375 additions and 32 deletions
@@ -42,6 +42,12 @@ class RsvFormDefinitionController {
],
]);
register_rest_route($this->namespace, '/' . $this->resource_name . '/preview', [
'methods' => 'POST',
'callback' => [$this, 'preview'],
'permission_callback' => [RsvRestPolicy::class, 'admin'],
]);
register_rest_route($this->namespace, '/' . $this->resource_name . '/(?P<id>\d+)', [
[
'methods' => 'GET',
@@ -79,10 +85,17 @@ class RsvFormDefinitionController {
}
function create(WP_REST_Request $request): WP_REST_Response {
$definition = $request->get_param('definition') ?? [];
$errors = (new RsvFormDefinitionValidator())->validate($definition);
if ($errors !== []) {
return new WP_REST_Response(['error' => implode(' ', $errors)], 422);
}
try {
$id = (new RsvFormDefinitionRepository())->add(
$request->get_param('name'),
$request->get_param('definition') ?? []
$definition
);
} catch(Throwable $e) {
Logger::error($e);
@@ -105,6 +118,20 @@ class RsvFormDefinitionController {
return new WP_REST_Response(null, 204);
}
/** Renders an unsaved definition to HTML for the editor's live preview. */
function preview(WP_REST_Request $request): WP_REST_Response {
$definition = $request->get_json_params()['definition'] ?? [];
if (!is_array($definition)) {
$definition = [];
}
ob_start();
(new RsvFormHtmlRenderer())->draw(new RsvFormDefinition('preview', $definition));
$html = ob_get_clean();
return new WP_REST_Response(['html' => $html], 200);
}
function update(WP_REST_Request $request): WP_REST_Response {
$id = (int) $request->get_param('id');
$repo = new RsvFormDefinitionRepository();
@@ -113,7 +140,14 @@ class RsvFormDefinitionController {
return new WP_REST_Response(['error' => 'Not found'], 404);
}
$repo->update($id, $request->get_param('name'), $request->get_param('definition'));
$definition = $request->get_param('definition') ?? [];
$errors = (new RsvFormDefinitionValidator())->validate($definition);
if ($errors !== []) {
return new WP_REST_Response(['error' => implode(' ', $errors)], 422);
}
$repo->update($id, $request->get_param('name'), $definition);
return new WP_REST_Response(null, 204);
}