brut 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +1 -1
- data/brut-css/package-lock.json +2 -2
- data/brut-css/package.json +1 -1
- data/brut-js/package-lock.json +18 -288
- data/brut-js/package.json +2 -2
- data/brut-js/specs/AjaxSubmit.spec.js +48 -0
- data/brut-js/src/AjaxSubmit.js +77 -18
- data/brutrb.com/recipes/authentication.md +6 -6
- data/docs/404.html +2 -2
- data/docs/adrs.html +3 -3
- data/docs/ai.html +3 -3
- data/docs/api/Brut/BackEnd/SeedData.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
- data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
- data/docs/api/Brut/BackEnd/Validators.html +1 -1
- data/docs/api/Brut/BackEnd.html +1 -1
- data/docs/api/Brut/CLI/App.html +1 -1
- data/docs/api/Brut/CLI/AppRunner.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB.html +1 -1
- data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
- data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/JS.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test.html +1 -1
- data/docs/api/Brut/CLI/Apps.html +1 -1
- data/docs/api/Brut/CLI/Command.html +1 -1
- data/docs/api/Brut/CLI/Error.html +1 -1
- data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
- data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
- data/docs/api/Brut/CLI/Executor.html +1 -1
- data/docs/api/Brut/CLI/InvalidOption.html +1 -1
- data/docs/api/Brut/CLI/Options.html +1 -1
- data/docs/api/Brut/CLI/Output.html +1 -1
- data/docs/api/Brut/CLI/SystemExecError.html +1 -1
- data/docs/api/Brut/CLI.html +1 -1
- data/docs/api/Brut/FactoryBot.html +1 -1
- data/docs/api/Brut/Framework/App.html +1 -1
- data/docs/api/Brut/Framework/Config.html +1 -1
- data/docs/api/Brut/Framework/Container.html +1 -1
- data/docs/api/Brut/Framework/Error.html +1 -1
- data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
- data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
- data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
- data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
- data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
- data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
- data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
- data/docs/api/Brut/Framework/Errors.html +1 -1
- data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
- data/docs/api/Brut/Framework/MCP.html +1 -1
- data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
- data/docs/api/Brut/Framework.html +1 -1
- data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
- data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
- data/docs/api/Brut/FrontEnd/Component.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html +16 -12
- data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
- data/docs/api/Brut/FrontEnd/Components.html +1 -1
- data/docs/api/Brut/FrontEnd/CsrfProtector.html +1 -1
- data/docs/api/Brut/FrontEnd/Download.html +1 -1
- data/docs/api/Brut/FrontEnd/Flash.html +1 -1
- data/docs/api/Brut/FrontEnd/Form.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Button.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html +5 -12
- data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms.html +1 -1
- data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
- data/docs/api/Brut/FrontEnd/Handler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
- data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
- data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
- data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
- data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
- data/docs/api/Brut/FrontEnd/Layout.html +1 -1
- data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
- data/docs/api/Brut/FrontEnd/Page.html +1 -1
- data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
- data/docs/api/Brut/FrontEnd/Pages.html +1 -1
- data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing.html +1 -1
- data/docs/api/Brut/FrontEnd/Session.html +1 -1
- data/docs/api/Brut/FrontEnd.html +1 -1
- data/docs/api/Brut/I18n/BaseMethods.html +1 -1
- data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
- data/docs/api/Brut/I18n/ForCLI.html +1 -1
- data/docs/api/Brut/I18n/ForHTML.html +1 -1
- data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
- data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
- data/docs/api/Brut/I18n.html +1 -1
- data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
- data/docs/api/Brut/Instrumentation/Methods/ClassMethods.html +1 -1
- data/docs/api/Brut/Instrumentation/Methods.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
- data/docs/api/Brut/Instrumentation.html +1 -1
- data/docs/api/Brut/RubocopConfig.html +1 -1
- data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
- data/docs/api/Brut/SinatraHelpers.html +1 -1
- data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
- data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
- data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
- data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
- data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
- data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
- data/docs/api/Brut/SpecSupport.html +1 -1
- data/docs/api/Brut.html +1 -1
- data/docs/api/Clock.html +1 -1
- data/docs/api/ModuleName.html +1 -1
- data/docs/api/RichString.html +1 -1
- data/docs/api/SemanticLogger/Appender/Async.html +1 -1
- data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
- data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
- data/docs/api/Sequel/Extensions.html +1 -1
- data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
- data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
- data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
- data/docs/api/Sequel/Plugins/FindBang.html +1 -1
- data/docs/api/Sequel/Plugins.html +1 -1
- data/docs/api/Sequel.html +1 -1
- data/docs/api/_index.html +1 -1
- data/docs/api/file.README.html +1 -1
- data/docs/api/index.html +1 -1
- data/docs/api/top-level-namespace.html +1 -1
- data/docs/assets/{app.V2GOcOrg.js → app.BDtsVxyd.js} +1 -1
- data/docs/assets/chunks/@localSearchIndexroot.BWVzhs5N.js +1 -0
- data/docs/assets/chunks/{VPLocalSearchBox.CZTadcAy.js → VPLocalSearchBox.DCJk5nAW.js} +1 -1
- data/docs/assets/chunks/{theme.FeuYNxyp.js → theme.DZKmijwi.js} +2 -2
- data/docs/assets/{components.md.f4cdTyvV.js → components.md.rMhQ0WdZ.js} +3 -3
- data/docs/assets/{configuration.md.Bs4-rxnS.js → configuration.md.BK42Yjp_.js} +1 -1
- data/docs/assets/{forms.md.Sys-XxVf.js → forms.md.v9qIbmUM.js} +1 -1
- data/docs/assets/{getting-started.md.CFIW0bcE.js → getting-started.md.DTOl4c2g.js} +2 -2
- data/docs/assets/{recipes_authentication.md.BAISoxmN.js → recipes_authentication.md.nwO6F7Ou.js} +6 -6
- data/docs/assets/{tutorials_02-dialog.md.QTFeHdiA.js → tutorials_02-dialog.md.CPNK1SC_.js} +2 -2
- data/docs/assets/{tutorials_02-dialog.md.QTFeHdiA.lean.js → tutorials_02-dialog.md.CPNK1SC_.lean.js} +1 -1
- data/docs/assets.html +3 -3
- data/docs/brut-js/api/AjaxSubmit.html +29 -10
- data/docs/brut-js/api/AjaxSubmit.js.html +78 -19
- data/docs/brut-js/api/Autosubmit.html +1 -1
- data/docs/brut-js/api/Autosubmit.js.html +1 -1
- data/docs/brut-js/api/BaseCustomElement.html +1 -1
- data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
- data/docs/brut-js/api/BrutCustomElements.html +1 -1
- data/docs/brut-js/api/BufferedLogger.html +1 -1
- data/docs/brut-js/api/ConfirmSubmit.html +1 -1
- data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
- data/docs/brut-js/api/ConfirmationDialog.html +1 -1
- data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
- data/docs/brut-js/api/CopyToClipboard.html +1 -1
- data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
- data/docs/brut-js/api/Form.html +1 -1
- data/docs/brut-js/api/Form.js.html +1 -1
- data/docs/brut-js/api/I18nTranslation.html +1 -1
- data/docs/brut-js/api/I18nTranslation.js.html +1 -1
- data/docs/brut-js/api/LocaleDetection.html +1 -1
- data/docs/brut-js/api/LocaleDetection.js.html +1 -1
- data/docs/brut-js/api/Logger.html +1 -1
- data/docs/brut-js/api/Logger.js.html +1 -1
- data/docs/brut-js/api/Message.html +1 -1
- data/docs/brut-js/api/Message.js.html +1 -1
- data/docs/brut-js/api/PrefixedLogger.html +1 -1
- data/docs/brut-js/api/RichString.html +1 -1
- data/docs/brut-js/api/RichString.js.html +1 -1
- data/docs/brut-js/api/Tabs.html +1 -1
- data/docs/brut-js/api/Tabs.js.html +1 -1
- data/docs/brut-js/api/Tracing.html +1 -1
- data/docs/brut-js/api/Tracing.js.html +1 -1
- data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
- data/docs/brut-js/api/external-Performance.html +1 -1
- data/docs/brut-js/api/external-Promise.html +1 -1
- data/docs/brut-js/api/external-ValidityState.html +1 -1
- data/docs/brut-js/api/external-Window.html +1 -1
- data/docs/brut-js/api/external-fetch.html +1 -1
- data/docs/brut-js/api/global.html +1 -1
- data/docs/brut-js/api/index.html +1 -1
- data/docs/brut-js/api/index.js.html +1 -1
- data/docs/brut-js/api/module-testing.html +1 -1
- data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
- data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
- data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
- data/docs/brut-js/api/testing.DOMCreator.html +1 -1
- data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
- data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
- data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
- data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
- data/docs/brut-js/api/testing_index.js.html +1 -1
- data/docs/brut-js.html +3 -3
- data/docs/business-logic.html +3 -3
- data/docs/cli.html +3 -3
- data/docs/components.html +7 -7
- data/docs/configuration.html +5 -5
- data/docs/css.html +3 -3
- data/docs/custom-element-tests.html +3 -3
- data/docs/database-access.html +3 -3
- data/docs/database-schema.html +3 -3
- data/docs/deployment.html +3 -3
- data/docs/dev-environment.html +3 -3
- data/docs/dir-structure.html +3 -3
- data/docs/doc-conventions.html +3 -3
- data/docs/end-to-end-tests.html +3 -3
- data/docs/features.html +3 -3
- data/docs/flash-and-session.html +3 -3
- data/docs/form-constraints.html +3 -3
- data/docs/forms.html +5 -5
- data/docs/getting-started.html +6 -6
- data/docs/handlers.html +3 -3
- data/docs/hashmap.json +1 -1
- data/docs/hooks.html +3 -3
- data/docs/i18n.html +3 -3
- data/docs/index.html +3 -3
- data/docs/instrumentation.html +3 -3
- data/docs/javascript.html +3 -3
- data/docs/jobs.html +3 -3
- data/docs/keyword-injection.html +3 -3
- data/docs/layouts.html +3 -3
- data/docs/lsp.html +3 -3
- data/docs/markdown-examples.html +3 -3
- data/docs/middleware.html +3 -3
- data/docs/overview.html +3 -3
- data/docs/pages.html +3 -3
- data/docs/recipes/alternate-layouts.html +3 -3
- data/docs/recipes/authentication.html +10 -10
- data/docs/recipes/blank-layouts.html +3 -3
- data/docs/recipes/custom-flash.html +3 -3
- data/docs/recipes/form-errors.html +3 -3
- data/docs/recipes/indexed-forms.html +3 -3
- data/docs/recipes/migrations.html +3 -3
- data/docs/recipes/text-field-component.html +3 -3
- data/docs/roadmap.html +3 -3
- data/docs/routes.html +3 -3
- data/docs/security.html +3 -3
- data/docs/seed-data.html +3 -3
- data/docs/space-time-continuum.html +3 -3
- data/docs/tutorial.html +3 -3
- data/docs/tutorials/01-intro.html +3 -3
- data/docs/tutorials/02-dialog.html +5 -5
- data/docs/unit-tests.html +3 -3
- data/docs/why.html +3 -3
- data/lib/brut/front_end/components/inputs/button_tag.rb +5 -2
- data/lib/brut/front_end/forms/button_input_definition.rb +1 -5
- data/lib/brut/version.rb +1 -1
- data/mkbrut/Gemfile.lock +1 -1
- data/mkbrut/lib/mkbrut/version.rb +1 -1
- metadata +17 -17
- data/docs/assets/chunks/@localSearchIndexroot.3Lsq4QTb.js +0 -1
- /data/docs/assets/{components.md.f4cdTyvV.lean.js → components.md.rMhQ0WdZ.lean.js} +0 -0
- /data/docs/assets/{configuration.md.Bs4-rxnS.lean.js → configuration.md.BK42Yjp_.lean.js} +0 -0
- /data/docs/assets/{forms.md.Sys-XxVf.lean.js → forms.md.v9qIbmUM.lean.js} +0 -0
- /data/docs/assets/{getting-started.md.CFIW0bcE.lean.js → getting-started.md.DTOl4c2g.lean.js} +0 -0
- /data/docs/assets/{recipes_authentication.md.BAISoxmN.lean.js → recipes_authentication.md.nwO6F7Ou.lean.js} +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
import{_ as i,c as a,o as n,ag as e}from"./chunks/framework.1L-BeKqY.js";const t="/assets/02-confirmation-flow.D9gZ0S5U.png",l="/assets/02-confirmation-dialog-browser.DH8ALFO4.png",p="/assets/02-confirmation-dialog-browser-element.DPsf0xUW.png",h="/assets/02-confirmation-dialog-browser-element-styled.3NEGM20-.png",
|
1
|
+
import{_ as i,c as a,o as n,ag as e}from"./chunks/framework.1L-BeKqY.js";const t="/assets/02-confirmation-flow.D9gZ0S5U.png",l="/assets/02-confirmation-dialog-browser.DH8ALFO4.png",p="/assets/02-confirmation-dialog-browser-element.DPsf0xUW.png",h="/assets/02-confirmation-dialog-browser-element-styled.3NEGM20-.png",b=JSON.parse('{"title":"Tutorial: Styled Confirmation Dialog","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/02-dialog.md","filePath":"tutorials/02-dialog.md"}'),r={name:"tutorials/02-dialog.md"};function o(k,s,d,c,g,E){return n(),a("div",null,s[0]||(s[0]=[e(`<h1 id="tutorial-styled-confirmation-dialog" tabindex="-1">Tutorial: Styled Confirmation Dialog <a class="header-anchor" href="#tutorial-styled-confirmation-dialog" aria-label="Permalink to "Tutorial: Styled Confirmation Dialog""></a></h1><p>For actions that can't be undone, it's customary to confirm with the visitor that they are sure they want to take that action. Brut provides support for this. You can use <code>window.confirm</code> or create your own styled <code><dialog></code> that Brut will use. Both approaches don't require writing any JavaScript yourself.</p><p><a href="https://video.hardlimit.com/w/4y8Pjd8VVPDK372mozCUdj" target="_blank" rel="noreferrer">You can watching this as a screencast instead</a>.</p><h2 id="set-up" tabindex="-1">Set Up <a class="header-anchor" href="#set-up" aria-label="Permalink to "Set Up""></a></h2><p>If you haven't followed the <a href="/tutorials/01-intro.html">initial tutorial</a>, you'll need to pull down the blog app so you have a place to work.</p><ol><li><p><a href="https://docker.com" target="_blank" rel="noreferrer">Install Docker</a></p><div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p><p>If you are on Windows, we <em>highly</em> recommend you use the Windows Subystem for Linux (WSL2), as this makes Brut, web developement, and, honestly, your entire life as you know it, far easier than trying to get things working natively in Windows.</p></div></li><li><p>Clone the <code>blog-demo</code> repo (<strong>don't use Codespaces as it is not supported</strong>):</p><div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-3hukd" id="tab-jTrnAT9" checked><label data-title="Terminal" for="tab-jTrnAT9">Terminal</label><input type="radio" name="group-3hukd" id="tab-CZvrEe1"><label data-title="GitHub CLI" for="tab-CZvrEe1">GitHub CLI</label></div><div class="blocks"><div class="language-bash vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> git@github.com:thirdtank/blog-demo.git</span></span></code></pre></div><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">gh</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> repo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> thirdtank/blog-demo</span></span></code></pre></div></div></div></li><li><p><code>cd</code> to what you just cloned.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> blog-demo</span></span></code></pre></div></li><li><p>Create a branch named <code>confirmation-dialog</code> off of the <code>02-confirmation-dialog/start</code> branch:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> checkout</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -b</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> confirmation-dialog</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 02-confirmation-dialog/start</span></span></code></pre></div></li><li><p>Build your development image.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dx/build</span></span></code></pre></div></li><li><p>Start the environment, which will pull down Postgres and otel-desktop-viewer</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dx/start</span></span></code></pre></div></li><li><p>In another terminal window, "log in" to your dev environment (note that you can use your editor on your computer to edit code)</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dx/exec</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> bash</span></span></code></pre></div></li><li><p>Set up and run tests to make sure things are working before you start making changes. Note, this is <strong>inside the container</strong>, not directly on your computer.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/setup</span></span>
|
2
2
|
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/ci</span></span></code></pre></div></li></ol><h2 id="what-we-re-doing" tabindex="-1">What We're Doing <a class="header-anchor" href="#what-we-re-doing" aria-label="Permalink to "What We're Doing""></a></h2><p>When writing a blog post, if the title and content satisfy all constraints, the post is saved and shown on the home page. Because this can't currently be undone, we want the user to confirm the posting, just to avoid any accidents.</p><p>Initially, we will use <code>window.confirm</code> to do this. After that, we'll create a nicely styled dialog to do the confirmation. While this will require that the browser execute JavaScript, we won't be writing any. We'll use Brut-provided Web Components to do this.</p><p><img src="`+t+`" alt="Diagram showing the flow, with a screenshot of the blog post editor on the left, and a pink arrow from
|
3
3
|
the 'Post it' button going to the text 'Are You Sure?'. From there, a pink line labeled 'No' goes back
|
4
4
|
to the editor, while a pink line labeled 'Yes' goes to a screenshot of the home page showing the blog
|
@@ -271,4 +271,4 @@ post."></p><h2 id="initial-version-using-window-confirm" tabindex="-1">Initial V
|
|
271
271
|
<span class="line"><span>[ bin/db ] Database exists. Dropping...</span></span>
|
272
272
|
<span class="line"><span>[ bin/db ] blog_test does not exit. Creating...</span></span>
|
273
273
|
<span class="line"><span>[ bin/db ] Migrations applied</span></span>
|
274
|
-
<span class="line"><span>[ bin/test ] ["bin/db rebuild --env=test"] succeeded</span></span></code></pre></div><h2 id="areas-for-self-exploration" tabindex="-1">Areas for Self-Exploration <a class="header-anchor" href="#areas-for-self-exploration" aria-label="Permalink to "Areas for Self-Exploration""></a></h2><ul><li>Extract the dialog into its own component</li><li>Use Internationalization for all the dialog values</li></ul>`,79)]))}const y=i(r,[["render",o]]);export{
|
274
|
+
<span class="line"><span>[ bin/test ] ["bin/db rebuild --env=test"] succeeded</span></span></code></pre></div><h2 id="areas-for-self-exploration" tabindex="-1">Areas for Self-Exploration <a class="header-anchor" href="#areas-for-self-exploration" aria-label="Permalink to "Areas for Self-Exploration""></a></h2><ul><li>Extract the dialog into its own component</li><li>Use Internationalization for all the dialog values</li></ul>`,79)]))}const y=i(r,[["render",o]]);export{b as __pageData,y as default};
|
data/docs/assets/{tutorials_02-dialog.md.QTFeHdiA.lean.js → tutorials_02-dialog.md.CPNK1SC_.lean.js}
RENAMED
@@ -1 +1 @@
|
|
1
|
-
import{_ as i,c as a,o as n,ag as e}from"./chunks/framework.1L-BeKqY.js";const t="/assets/02-confirmation-flow.D9gZ0S5U.png",l="/assets/02-confirmation-dialog-browser.DH8ALFO4.png",p="/assets/02-confirmation-dialog-browser-element.DPsf0xUW.png",h="/assets/02-confirmation-dialog-browser-element-styled.3NEGM20-.png",
|
1
|
+
import{_ as i,c as a,o as n,ag as e}from"./chunks/framework.1L-BeKqY.js";const t="/assets/02-confirmation-flow.D9gZ0S5U.png",l="/assets/02-confirmation-dialog-browser.DH8ALFO4.png",p="/assets/02-confirmation-dialog-browser-element.DPsf0xUW.png",h="/assets/02-confirmation-dialog-browser-element-styled.3NEGM20-.png",b=JSON.parse('{"title":"Tutorial: Styled Confirmation Dialog","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/02-dialog.md","filePath":"tutorials/02-dialog.md"}'),r={name:"tutorials/02-dialog.md"};function o(k,s,d,c,g,E){return n(),a("div",null,s[0]||(s[0]=[e("",79)]))}const y=i(r,[["render",o]]);export{b as __pageData,y as default};
|
data/docs/assets.html
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
<link rel="preload stylesheet" href="/assets/style.B1z60PPQ.css" as="style">
|
10
10
|
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
11
11
|
|
12
|
-
<script type="module" src="/assets/app.
|
13
|
-
<link rel="modulepreload" href="/assets/chunks/theme.
|
12
|
+
<script type="module" src="/assets/app.BDtsVxyd.js"></script>
|
13
|
+
<link rel="modulepreload" href="/assets/chunks/theme.DZKmijwi.js">
|
14
14
|
<link rel="modulepreload" href="/assets/chunks/framework.1L-BeKqY.js">
|
15
15
|
<link rel="modulepreload" href="/assets/assets.md.7C3HWkga.lean.js">
|
16
16
|
<link rel="icon" href="/favicon.ico">
|
@@ -41,7 +41,7 @@
|
|
41
41
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
42
42
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
43
43
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>As you can see, this format could support multiple bundles and additional file types.</p></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/css.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Previous page</span><span class="title" data-v-1bcd8184>CSS</span><!--]--></a></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/brut-js.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Next page</span><span class="title" data-v-1bcd8184>BrutJS</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
|
44
|
-
<script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"BxjHi9-8\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"
|
44
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"BxjHi9-8\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"rMhQ0WdZ\",\"configuration.md\":\"BK42Yjp_\",\"css.md\":\"CltvJqAa\",\"custom-element-tests.md\":\"B_rbta32\",\"database-access.md\":\"gnluu54N\",\"database-schema.md\":\"LpmBPVEU\",\"deployment.md\":\"BLseERGV\",\"dev-environment.md\":\"DRH2D2-O\",\"dir-structure.md\":\"CWir1pic\",\"doc-conventions.md\":\"DOkAuXlt\",\"end-to-end-tests.md\":\"DzqRpZ43\",\"features.md\":\"DPFXsy0z\",\"flash-and-session.md\":\"nPvUpnUx\",\"form-constraints.md\":\"KTv5cdR4\",\"forms.md\":\"v9qIbmUM\",\"getting-started.md\":\"DTOl4c2g\",\"handlers.md\":\"h84MMB1R\",\"hooks.md\":\"Jmb5VOLA\",\"i18n.md\":\"BAm9t9JJ\",\"index.md\":\"Bn9e0sRJ\",\"instrumentation.md\":\"_lNSriEZ\",\"javascript.md\":\"DzrMxUmI\",\"jobs.md\":\"S-2amAYp\",\"keyword-injection.md\":\"95Zgh2eN\",\"layouts.md\":\"CVGl9xIO\",\"lsp.md\":\"Dn1rIiW0\",\"markdown-examples.md\":\"CCFEQO44\",\"middleware.md\":\"Czz_UlJN\",\"overview.md\":\"DlKiRRG_\",\"pages.md\":\"B7Hc-i6H\",\"recipes_alternate-layouts.md\":\"BwEytl59\",\"recipes_authentication.md\":\"nwO6F7Ou\",\"recipes_blank-layouts.md\":\"fyAUJyJR\",\"recipes_custom-flash.md\":\"CrQbI5eH\",\"recipes_form-errors.md\":\"Bv5RCKqH\",\"recipes_indexed-forms.md\":\"CstYyOSo\",\"recipes_migrations.md\":\"CTcnWDJF\",\"recipes_text-field-component.md\":\"H4wLAK0Z\",\"roadmap.md\":\"C6PRi0DX\",\"routes.md\":\"BD6y2i-f\",\"security.md\":\"C0G_AZR-\",\"seed-data.md\":\"BvFZlqIk\",\"space-time-continuum.md\":\"xl44xDos\",\"tutorial.md\":\"BM40jnoq\",\"tutorials_01-intro.md\":\"B4sUBY3X\",\"tutorials_02-dialog.md\":\"CPNK1SC_\",\"unit-tests.md\":\"DUGrnLj5\",\"why.md\":\"C-hk5xgJ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Brut RB\",\"description\":\"Documentation for the Brut.RB web framework.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Overview\",\"link\":\"/overview\"},{\"text\":\"Brut API\",\"link\":\"/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutCSS\",\"link\":\"/brut-css/index.html\",\"target\":\"_self\"}],\"outline\":[2,3],\"sidebar\":[{\"text\":\"Overview\",\"collapsed\":false,\"items\":[{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Concepts\",\"link\":\"/overview\"},{\"text\":\"Features\",\"link\":\"/features\"},{\"text\":\"Directory Structure\",\"link\":\"/dir-structure\"},{\"text\":\"Dev Environment\",\"link\":\"/dev-environment\"},{\"text\":\"Tutorial\",\"link\":\"/tutorial\"},{\"text\":\"Documentation Conventions\",\"link\":\"/doc-conventions\"}]},{\"text\":\"Front-End\",\"collapsed\":false,\"items\":[{\"text\":\"Routes\",\"link\":\"/routes\"},{\"text\":\"Pages\",\"link\":\"/pages\"},{\"text\":\"Layouts\",\"link\":\"/layouts\"},{\"text\":\"Forms\",\"link\":\"/forms\"},{\"text\":\"Form Constraints\",\"link\":\"/form-constraints\"},{\"text\":\"Handlers and Actions\",\"link\":\"/handlers\"},{\"text\":\"Components\",\"link\":\"/components\"},{\"text\":\"Flash and Session\",\"link\":\"/flash-and-session\"},{\"text\":\"Space/Time Continuum\",\"link\":\"/space-time-continuum\"},{\"text\":\"JavaScript\",\"link\":\"/javascript\"},{\"text\":\"CSS\",\"link\":\"/css\"},{\"text\":\"Assets\",\"link\":\"/assets\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js\"}]},{\"text\":\"Back-End\",\"collapsed\":false,\"items\":[{\"text\":\"Database Schema\",\"link\":\"/database-schema\"},{\"text\":\"Database Access\",\"link\":\"/database-access\"},{\"text\":\"Seed Data\",\"link\":\"/seed-data\"},{\"text\":\"Jobs\",\"link\":\"/jobs\"},{\"text\":\"Business Logic\",\"link\":\"/business-logic\"}]},{\"text\":\"Framework\",\"collapsed\":false,\"items\":[{\"text\":\"Configuration\",\"link\":\"/configuration\"},{\"text\":\"Keyword Injection\",\"link\":\"/keyword-injection\"},{\"text\":\"I18n\",\"link\":\"/i18n\"},{\"text\":\"CLI / Tasks\",\"link\":\"/cli\"},{\"text\":\"Deployment\",\"link\":\"/deployment\"}]},{\"text\":\"Testing\",\"collapsed\":false,\"items\":[{\"text\":\"Unit Tests\",\"link\":\"/unit-tests\"},{\"text\":\"End-to-End Tests\",\"link\":\"/end-to-end-tests\"},{\"text\":\"Testing Custom Elements\",\"link\":\"/custom-element-tests\"}]},{\"text\":\"Advanced Topics\",\"collapsed\":true,\"items\":[{\"text\":\"Route Hooks\",\"link\":\"/hooks\"},{\"text\":\"Middleware\",\"link\":\"/middleware\"},{\"text\":\"Instrumentation\",\"link\":\"/instrumentation\"},{\"text\":\"Security\",\"link\":\"/security\"},{\"text\":\"LSP Support\",\"link\":\"/lsp\"}]},{\"text\":\"Recipes\",\"collapsed\":true,\"items\":[{\"text\":\"Migration Basics\",\"link\":\"/recipes/migrations\"},{\"text\":\"Styling Form Errors\",\"link\":\"/recipes/form-errors\"},{\"text\":\"Authentication\",\"link\":\"/recipes/authentication\"},{\"text\":\"Alternate Layouts\",\"link\":\"/recipes/alternate-layouts\"},{\"text\":\"Blank Layouts\",\"link\":\"/recipes/blank-layouts\"},{\"text\":\"Custom Flash Class\",\"link\":\"/recipes/custom-flash\"},{\"text\":\"Indexed Form Elements\",\"link\":\"/recipes/indexed-forms\"},{\"text\":\"Text Field Component\",\"link\":\"/recipes/text-field-component\"}]},{\"text\":\"Meta\",\"collapsed\":false,\"items\":[{\"text\":\"Why?!\",\"link\":\"/why\"},{\"text\":\"ADRs\",\"link\":\"/adrs\"},{\"text\":\"Roadmap to 1.0\",\"link\":\"/roadmap\"},{\"text\":\"AI Declaration\",\"link\":\"/ai\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/thirdtank/brut\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
45
45
|
|
46
46
|
</body>
|
47
47
|
</html>
|
@@ -39,7 +39,8 @@ the form it's a part of via AJAX. It accounts for network failures and timeouts.
|
|
39
39
|
<ol>
|
40
40
|
<li>When the button is clicked, the form's validity is checked. If it's not valid, nothing happens.</li>
|
41
41
|
<li>If the form is valid, this element will be given the <code>requesting</code> attribute.</li>
|
42
|
-
<li>The request will be initiated, set to abort after <code>request-timeout</code> ms
|
42
|
+
<li>The request will be initiated, set to abort after <code>request-timeout</code> ms as well
|
43
|
+
as to abort on an externally-provided AbortSignal (see below).
|
43
44
|
The data submitted will be the contents of <code>new FormData(form)</code>, along with the
|
44
45
|
name/value of the button that was clicked, if it has a name and value.</li>
|
45
46
|
<li>If the request returns OK:
|
@@ -67,8 +68,7 @@ errors to be inserted into the DOM. See below for how that works. In this case
|
|
67
68
|
</li>
|
68
69
|
<li>If fetch throws an error, the operation is aborted.</li>
|
69
70
|
</ol>
|
70
|
-
<
|
71
|
-
<code>log-request-errors</code> to introspect this process.</p>
|
71
|
+
<h2>422 Responses</h2>
|
72
72
|
<p>For a 422 response (where <code>no-server-side-error-parsing</code> is <em>not</em> set),
|
73
73
|
this element assumes the response is <code>text/html</code> and contains one or more <code><brut-cv></code>
|
74
74
|
elements. These elements will be inserted into the proper <code><brut-cv-messages></code> element, as follows:</p>
|
@@ -99,7 +99,17 @@ elements. These elements will be inserted into the proper <code><brut-cv-mes
|
|
99
99
|
<li>the response body will contain one or more <code><brut-cv></code> elements</li>
|
100
100
|
</ul>
|
101
101
|
</li>
|
102
|
-
</ul
|
102
|
+
</ul>
|
103
|
+
<h2>Aborting the <code>fetch</code> Request</h2>
|
104
|
+
<p>By default, the call to <code>fetch</code> will be aborted after the value of <code>request-timeout</code> ms (default is 5,000).
|
105
|
+
When this happens, the <strong>form is submitted through the browser</strong> without Ajax. This is currently
|
106
|
+
not configurable.</p>
|
107
|
+
<p>You <em>can</em> set an additional <code>AbortSignal</code> by setting the <code>abortSignal</code> property. When this is done, then
|
108
|
+
either a timeout or your custom abort will abort the request and <strong>submit the form through the browser</strong>.</p>
|
109
|
+
<p>For your custom abort signal, you can prevent browser submission by providing a reason
|
110
|
+
with the value <code>AjaxSubmit.doNotSubmitThroughBrowser</code>. This can be useful when you are debouncing
|
111
|
+
requests. See the examples. You will also find it useful to set <code>log-request-errors</code> on the element
|
112
|
+
so you can see what is happening.</p></div>
|
103
113
|
|
104
114
|
|
105
115
|
</header>
|
@@ -330,7 +340,7 @@ cause any form submission to be delayed by 2s to allow you to read the console.<
|
|
330
340
|
|
331
341
|
<dt class="tag-source">Source:</dt>
|
332
342
|
<dd class="tag-source"><ul class="dummy"><li>
|
333
|
-
<a href="AjaxSubmit.js.html">AjaxSubmit.js</a>, <a href="AjaxSubmit.js.html#
|
343
|
+
<a href="AjaxSubmit.js.html">AjaxSubmit.js</a>, <a href="AjaxSubmit.js.html#line109">line 109</a>
|
334
344
|
</li></ul></dd>
|
335
345
|
|
336
346
|
|
@@ -366,24 +376,33 @@ cause any form submission to be delayed by 2s to allow you to read the console.<
|
|
366
376
|
|
367
377
|
|
368
378
|
|
369
|
-
<h5>
|
379
|
+
<h5>Examples</h5>
|
380
|
+
|
381
|
+
<p class="code-caption">Typical use</p>
|
370
382
|
|
371
383
|
<pre class="prettyprint"><code><form action="/widgets" method="post">
|
372
384
|
<input type="text" name="name">
|
373
385
|
|
374
386
|
<brut-ajax-submit>
|
375
387
|
<button name="button" value="save">Save</button>
|
376
|
-
|
388
|
+
</brut-ajax-submit>
|
377
389
|
<brut-ajax-submit>
|
378
390
|
<button name="button" value="analyze">Analyze</button>
|
379
|
-
|
391
|
+
</brut-ajax-submit>
|
380
392
|
</form>
|
381
|
-
|
382
393
|
<!-- When "Save" is clicked, "name" will have the value from the text field,
|
383
394
|
and "button" will have the value "save".
|
384
395
|
When "Analyze" is clicked, "name" will have the value from the text
|
385
396
|
field, and "button" will have the value "analyze". --></code></pre>
|
386
397
|
|
398
|
+
<p class="code-caption">Using a custom abort signal</p>
|
399
|
+
|
400
|
+
<pre class="prettyprint"><code>const ajaxSubmit = document.querySelector("brut-ajax-submit")
|
401
|
+
const controller = new AbortController()
|
402
|
+
ajaxSubmit.abortSignal = controller.signal
|
403
|
+
// later, when you want to abort the request
|
404
|
+
controller.abort(AjaxSubmit.doNotSubmitThroughBrowser)</code></pre>
|
405
|
+
|
387
406
|
|
388
407
|
|
389
408
|
|
@@ -424,7 +443,7 @@ cause any form submission to be delayed by 2s to allow you to read the console.<
|
|
424
443
|
<br class="clear">
|
425
444
|
|
426
445
|
<footer>
|
427
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
446
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
428
447
|
</footer>
|
429
448
|
|
430
449
|
<script> prettyPrint(); </script>
|
@@ -37,7 +37,8 @@ import ConstraintViolationMessage from "./ConstraintViolationMessage"
|
|
37
37
|
*
|
38
38
|
* 1. When the button is clicked, the form's validity is checked. If it's not valid, nothing happens.
|
39
39
|
* 2. If the form is valid, this element will be given the `requesting` attribute.
|
40
|
-
* 3. The request will be initiated, set to abort after `request-timeout` ms
|
40
|
+
* 3. The request will be initiated, set to abort after `request-timeout` ms as well
|
41
|
+
* as to abort on an externally-provided AbortSignal (see below).
|
41
42
|
* The data submitted will be the contents of `new FormData(form)`, along with the
|
42
43
|
* name/value of the button that was clicked, if it has a name and value.
|
43
44
|
* 4. If the request returns OK:
|
@@ -56,8 +57,7 @@ import ConstraintViolationMessage from "./ConstraintViolationMessage"
|
|
56
57
|
* - otherwise, the operation is aborted.
|
57
58
|
* 7. If fetch throws an error, the operation is aborted.
|
58
59
|
*
|
59
|
-
*
|
60
|
-
* `log-request-errors` to introspect this process.
|
60
|
+
* ## 422 Responses
|
61
61
|
*
|
62
62
|
* For a 422 response (where `no-server-side-error-parsing` is *not* set),
|
63
63
|
* this element assumes the response is `text/html` and contains one or more `<brut-cv>`
|
@@ -84,6 +84,20 @@ import ConstraintViolationMessage from "./ConstraintViolationMessage"
|
|
84
84
|
* - the response body will be `text/html`
|
85
85
|
* - the response body will contain one or more `<brut-cv>` elements
|
86
86
|
*
|
87
|
+
* ## Aborting the `fetch` Request
|
88
|
+
*
|
89
|
+
* By default, the call to `fetch` will be aborted after the value of `request-timeout` ms (default is 5,000).
|
90
|
+
* When this happens, the **form is submitted through the browser** without Ajax. This is currently
|
91
|
+
* not configurable.
|
92
|
+
*
|
93
|
+
* You *can* set an additional `AbortSignal` by setting the `abortSignal` property. When this is done, then
|
94
|
+
* either a timeout or your custom abort will abort the request and **submit the form through the browser**.
|
95
|
+
*
|
96
|
+
* For your custom abort signal, you can prevent browser submission by providing a reason
|
97
|
+
* with the value `AjaxSubmit.doNotSubmitThroughBrowser`. This can be useful when you are debouncing
|
98
|
+
* requests. See the examples. You will also find it useful to set `log-request-errors` on the element
|
99
|
+
* so you can see what is happening.
|
100
|
+
*
|
87
101
|
* @property {boolean} no-server-side-error-parsing - if set, the response body for a 422 will not be parsed and inserted into the DOM. Instead, the body will be part of the detail of the `brut:submitinvalid` event.
|
88
102
|
* @property {number} request-timeout - number of ms that the entire operation is expected to complete within. Default is 5000
|
89
103
|
* @property {number} submitted-lifetime - number of ms that "submitted" should remain on the element after the form has completed. Default is 2000
|
@@ -95,23 +109,29 @@ import ConstraintViolationMessage from "./ConstraintViolationMessage"
|
|
95
109
|
* @fires brut:submitok Fired when the AJAX request initated by this returns OK and all processing has completed. The detail will include the *parsed document* of the HTML returned in the response.
|
96
110
|
* @fires brut:submitinvalid Fired when the AJAX request initated by this returns a 422 and all logic around managing the reponse has completed. The detail will be null unless `no-server-side-error-parsing` is set, in which case it will be the parsed document of the HTML returned in the response.
|
97
111
|
*
|
98
|
-
* @example
|
112
|
+
* @example <caption>Typical use</caption>
|
99
113
|
* <form action="/widgets" method="post">
|
100
114
|
* <input type="text" name="name">
|
101
115
|
*
|
102
116
|
* <brut-ajax-submit>
|
103
117
|
* <button name="button" value="save">Save</button>
|
104
|
-
*
|
118
|
+
* </brut-ajax-submit>
|
105
119
|
* <brut-ajax-submit>
|
106
120
|
* <button name="button" value="analyze">Analyze</button>
|
107
|
-
*
|
121
|
+
* </brut-ajax-submit>
|
108
122
|
* </form>
|
109
|
-
*
|
110
123
|
* <!-- When "Save" is clicked, "name" will have the value from the text field,
|
111
124
|
* and "button" will have the value "save".
|
112
125
|
* When "Analyze" is clicked, "name" will have the value from the text
|
113
126
|
* field, and "button" will have the value "analyze". -->
|
114
127
|
*
|
128
|
+
* @example <caption>Using a custom abort signal</caption>
|
129
|
+
* const ajaxSubmit = document.querySelector("brut-ajax-submit")
|
130
|
+
* const controller = new AbortController()
|
131
|
+
* ajaxSubmit.abortSignal = controller.signal
|
132
|
+
* // later, when you want to abort the request
|
133
|
+
* controller.abort(AjaxSubmit.doNotSubmitThroughBrowser)
|
134
|
+
*
|
115
135
|
* @customelement brut-ajax-submit
|
116
136
|
*/
|
117
137
|
class AjaxSubmit extends BaseCustomElement {
|
@@ -127,12 +147,28 @@ class AjaxSubmit extends BaseCustomElement {
|
|
127
147
|
"no-server-side-error-parsing",
|
128
148
|
]
|
129
149
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
150
|
+
/* Use this when calling abort() to indicate that the form
|
151
|
+
* should be sub submitted through the browser.
|
152
|
+
*/
|
153
|
+
static doNotSubmitThroughBrowser = "doNotSubmitThroughBrowser"
|
154
|
+
|
155
|
+
#requestErrorLogger = () => {}
|
156
|
+
#formSubmitDelay = 0
|
157
|
+
#submittedLifetime = 2000
|
158
|
+
#requestTimeout = 5000
|
159
|
+
#maxRetryAttempts = 25
|
135
160
|
#serverSideErrorParsing = true
|
161
|
+
#abortSignal = null
|
162
|
+
|
163
|
+
/* Set an additional abort signal to be used when
|
164
|
+
* the form is submitted via Ajax. This allows you to
|
165
|
+
* control the fetch request beyond the built-in timeout.
|
166
|
+
*
|
167
|
+
* @param {AbortSignal} value the AbortSignal to add to the fetch request.
|
168
|
+
*/
|
169
|
+
set abortSignal(value) {
|
170
|
+
this.#abortSignal = value
|
171
|
+
}
|
136
172
|
|
137
173
|
constructor() {
|
138
174
|
super()
|
@@ -233,18 +269,36 @@ class AjaxSubmit extends BaseCustomElement {
|
|
233
269
|
}
|
234
270
|
const urlSearchParams = new URLSearchParams(formData)
|
235
271
|
|
236
|
-
const
|
272
|
+
const signals = [
|
273
|
+
AbortSignal.timeout(this.#requestTimeout),
|
274
|
+
]
|
275
|
+
if (this.#abortSignal) {
|
276
|
+
signals.push(this.#abortSignal)
|
277
|
+
}
|
278
|
+
const abortSignals = AbortSignal.any(signals)
|
279
|
+
|
280
|
+
let url = form.action
|
281
|
+
let body = null
|
282
|
+
|
283
|
+
if (form.method.toLowerCase() == "get") {
|
284
|
+
const sep = url.includes("?") ? "&" : "?"
|
285
|
+
url += sep + urlSearchParams.toString()
|
286
|
+
}
|
287
|
+
else {
|
288
|
+
body = urlSearchParams
|
289
|
+
}
|
237
290
|
|
238
291
|
const request = new Request(
|
239
|
-
|
292
|
+
url,
|
240
293
|
{
|
241
294
|
headers: headers,
|
242
295
|
method: form.method,
|
243
|
-
body:
|
244
|
-
signal:
|
296
|
+
body: body,
|
297
|
+
signal: abortSignals,
|
245
298
|
}
|
246
299
|
)
|
247
300
|
|
301
|
+
|
248
302
|
if (numAttempts > this.#maxRetryAttempts) {
|
249
303
|
this.#requestErrorLogger("%d attempts. Giving up",numAttempts)
|
250
304
|
this.#submitFormThroughBrowser(form)
|
@@ -301,8 +355,13 @@ class AjaxSubmit extends BaseCustomElement {
|
|
301
355
|
}
|
302
356
|
}
|
303
357
|
}).catch( (error) => {
|
304
|
-
|
305
|
-
|
358
|
+
if (error == AjaxSubmit.doNotSubmitThroughBrowser) {
|
359
|
+
this.#requestErrorLogger("Error indicates we should not submit through browser: %o",error)
|
360
|
+
}
|
361
|
+
else {
|
362
|
+
this.#requestErrorLogger("Got %o, which cannot be retried",error)
|
363
|
+
this.#submitFormThroughBrowser(form)
|
364
|
+
}
|
306
365
|
})
|
307
366
|
}
|
308
367
|
|
@@ -482,7 +541,7 @@ export default AjaxSubmit
|
|
482
541
|
<br class="clear">
|
483
542
|
|
484
543
|
<footer>
|
485
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
544
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
486
545
|
</footer>
|
487
546
|
|
488
547
|
<script> prettyPrint(); </script>
|
@@ -183,7 +183,7 @@ That means if your input/textarea/select uses the <code>form</code> attribute, t
|
|
183
183
|
<br class="clear">
|
184
184
|
|
185
185
|
<footer>
|
186
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
186
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
187
187
|
</footer>
|
188
188
|
|
189
189
|
<script> prettyPrint(); </script>
|
@@ -105,7 +105,7 @@ export default Autosubmit
|
|
105
105
|
<br class="clear">
|
106
106
|
|
107
107
|
<footer>
|
108
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
108
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
109
109
|
</footer>
|
110
110
|
|
111
111
|
<script> prettyPrint(); </script>
|
@@ -1082,7 +1082,7 @@ this inside a <code>DOMContentLoaded</code> event, or after the page's HTML has
|
|
1082
1082
|
<br class="clear">
|
1083
1083
|
|
1084
1084
|
<footer>
|
1085
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
1085
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
1086
1086
|
</footer>
|
1087
1087
|
|
1088
1088
|
<script> prettyPrint(); </script>
|
@@ -303,7 +303,7 @@ export default BaseCustomElement
|
|
303
303
|
<br class="clear">
|
304
304
|
|
305
305
|
<footer>
|
306
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
306
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
307
307
|
</footer>
|
308
308
|
|
309
309
|
<script> prettyPrint(); </script>
|
@@ -163,7 +163,7 @@ elements.</p></div>
|
|
163
163
|
<br class="clear">
|
164
164
|
|
165
165
|
<footer>
|
166
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
166
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
167
167
|
</footer>
|
168
168
|
|
169
169
|
<script> prettyPrint(); </script>
|
@@ -164,7 +164,7 @@ information captured before warnings were turned on.</p></div>
|
|
164
164
|
<br class="clear">
|
165
165
|
|
166
166
|
<footer>
|
167
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
167
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
168
168
|
</footer>
|
169
169
|
|
170
170
|
<script> prettyPrint(); </script>
|
@@ -277,7 +277,7 @@ If there is no such dialog or the id references the wrong element type,
|
|
277
277
|
<br class="clear">
|
278
278
|
|
279
279
|
<footer>
|
280
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
280
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
281
281
|
</footer>
|
282
282
|
|
283
283
|
<script> prettyPrint(); </script>
|
@@ -179,7 +179,7 @@ export default ConfirmSubmit
|
|
179
179
|
<br class="clear">
|
180
180
|
|
181
181
|
<footer>
|
182
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
182
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
183
183
|
</footer>
|
184
184
|
|
185
185
|
<script> prettyPrint(); </script>
|
@@ -416,7 +416,7 @@ denied, respectively.</p></td>
|
|
416
416
|
<br class="clear">
|
417
417
|
|
418
418
|
<footer>
|
419
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
419
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
420
420
|
</footer>
|
421
421
|
|
422
422
|
<script> prettyPrint(); </script>
|
@@ -185,7 +185,7 @@ export default ConfirmationDialog
|
|
185
185
|
<br class="clear">
|
186
186
|
|
187
187
|
<footer>
|
188
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
188
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
189
189
|
</footer>
|
190
190
|
|
191
191
|
<script> prettyPrint(); </script>
|
@@ -489,7 +489,7 @@ are managed.</p>
|
|
489
489
|
<br class="clear">
|
490
490
|
|
491
491
|
<footer>
|
492
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
492
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
493
493
|
</footer>
|
494
494
|
|
495
495
|
<script> prettyPrint(); </script>
|
@@ -182,7 +182,7 @@ export default ConstraintViolationMessage
|
|
182
182
|
<br class="clear">
|
183
183
|
|
184
184
|
<footer>
|
185
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
185
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
186
186
|
</footer>
|
187
187
|
|
188
188
|
<script> prettyPrint(); </script>
|
@@ -581,7 +581,7 @@ true. Thus, a <code><brut-cv></code> would be created with <code>key=&quo
|
|
581
581
|
<br class="clear">
|
582
582
|
|
583
583
|
<footer>
|
584
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
584
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
585
585
|
</footer>
|
586
586
|
|
587
587
|
<script> prettyPrint(); </script>
|
@@ -140,7 +140,7 @@ export default ConstraintViolationMessages
|
|
140
140
|
<br class="clear">
|
141
141
|
|
142
142
|
<footer>
|
143
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
143
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
144
144
|
</footer>
|
145
145
|
|
146
146
|
<script> prettyPrint(); </script>
|
@@ -336,7 +336,7 @@ c. The <code>brut:copyfailed</code> event is fired. It's detail contains a <code
|
|
336
336
|
<br class="clear">
|
337
337
|
|
338
338
|
<footer>
|
339
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
339
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
340
340
|
</footer>
|
341
341
|
|
342
342
|
<script> prettyPrint(); </script>
|
@@ -138,7 +138,7 @@ export default CopyToClipboard
|
|
138
138
|
<br class="clear">
|
139
139
|
|
140
140
|
<footer>
|
141
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
141
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
142
142
|
</footer>
|
143
143
|
|
144
144
|
<script> prettyPrint(); </script>
|
data/docs/brut-js/api/Form.html
CHANGED
@@ -282,7 +282,7 @@ when constraint violations have cleared.event:</li>
|
|
282
282
|
<br class="clear">
|
283
283
|
|
284
284
|
<footer>
|
285
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
285
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
286
286
|
</footer>
|
287
287
|
|
288
288
|
<script> prettyPrint(); </script>
|
@@ -189,7 +189,7 @@ export default Form
|
|
189
189
|
<br class="clear">
|
190
190
|
|
191
191
|
<footer>
|
192
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
192
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
193
193
|
</footer>
|
194
194
|
|
195
195
|
<script> prettyPrint(); </script>
|
@@ -400,7 +400,7 @@ if (element) {
|
|
400
400
|
<br class="clear">
|
401
401
|
|
402
402
|
<footer>
|
403
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
403
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
404
404
|
</footer>
|
405
405
|
|
406
406
|
<script> prettyPrint(); </script>
|
@@ -103,7 +103,7 @@ export default I18nTranslation
|
|
103
103
|
<br class="clear">
|
104
104
|
|
105
105
|
<footer>
|
106
|
-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on
|
106
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Mon Sep 08 2025 22:18:07 GMT+0000 (Coordinated Universal Time)
|
107
107
|
</footer>
|
108
108
|
|
109
109
|
<script> prettyPrint(); </script>
|