@ajsf/bootstrap5 22.2.1 → 22.3.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.
package/README.md CHANGED
@@ -1,57 +1,68 @@
1
1
  # @ajsf/bootstrap5
2
2
 
3
+ Bootstrap 5 framework for [AJSF](https://github.com/hamzahamidi/ajsf#readme), which builds Angular forms from JSON Schema.
4
+
3
5
  ## Getting started
4
6
 
7
+ Install the package and Bootstrap 5:
8
+
5
9
  ```shell
6
- npm install @ajsf/bootstrap5@latest
10
+ npm install @ajsf/bootstrap5 bootstrap@5
7
11
  ```
8
12
 
9
- With YARN, run the following:
13
+ Add Bootstrap's stylesheet to the `styles` of the build target in `angular.json`:
10
14
 
11
- ```shell
12
- yarn add @ajsf/bootstrap5@latest
15
+ ```json
16
+ "styles": [
17
+ "node_modules/bootstrap/dist/css/bootstrap.min.css",
18
+ "src/styles.css"
19
+ ]
13
20
  ```
14
21
 
15
- Then import `Bootstrap5FrameworkModule` in your main application module if you want to use `bootstrap5` UI, like this:
16
-
17
- ```javascript
18
- import { BrowserModule } from '@angular/platform-browser';
19
- import { NgModule } from '@angular/core';
22
+ Import `Bootstrap5FrameworkModule` in the standalone component that renders the form. Nothing goes in `app.config.ts`:
20
23
 
24
+ ```typescript
25
+ import { Component } from '@angular/core';
21
26
  import { Bootstrap5FrameworkModule } from '@ajsf/bootstrap5';
22
27
 
23
- import { AppComponent } from './app.component';
24
-
25
- @NgModule({
26
- declarations: [ AppComponent ],
27
- imports: [
28
- Bootstrap5FrameworkModule
29
- ],
30
- providers: [],
31
- bootstrap: [ AppComponent ]
28
+ @Component({
29
+ selector: 'app-root',
30
+ imports: [Bootstrap5FrameworkModule],
31
+ templateUrl: './app.html',
32
32
  })
33
- export class AppModule { }
33
+ export class App {
34
+ schema = {
35
+ type: 'object',
36
+ properties: {
37
+ name: { type: 'string', title: 'Name' },
38
+ plan: { type: 'string', title: 'Plan', enum: ['free', 'pro', 'team'] },
39
+ },
40
+ required: ['name'],
41
+ };
42
+
43
+ onSubmit(data: any) {
44
+ console.log(data);
45
+ }
46
+ }
34
47
  ```
35
48
 
36
- For basic use, after loading JsonSchemaFormModule as described above, to display a form in your Angular component, simply add the following to your component's template:
49
+ In an `NgModule` app, add `Bootstrap5FrameworkModule` to the module's `imports` instead.
50
+
51
+ Then render the form in the component's template:
37
52
 
38
53
  ```html
39
54
  <json-schema-form
40
- loadExternalAssets="true"
41
- [schema]="yourJsonSchema"
55
+ [schema]="schema"
42
56
  framework="bootstrap-5"
43
- (onSubmit)="yourOnSubmitFn($event)">
57
+ (onSubmit)="onSubmit($event)">
44
58
  </json-schema-form>
45
59
  ```
46
60
 
47
- Where `schema` is a valid JSON schema object, and `onSubmit` calls a function to process the submitted JSON form data. If you don't already have your own schemas, you can find a bunch of samples to test with in the `demo/assets/example-schemas` folder, as described above.
61
+ `framework="bootstrap-5"` selects this package's templates. The other values are `material-design`, `primeng`, `bootstrap-3`, `bootstrap-4` and `no-framework`, the default.
48
62
 
49
- `framework` is for the template you want to use, the default value is `no-framwork`. The possible values are:
63
+ To try the library without installing Bootstrap, bind `[loadExternalAssets]="true"` on `<json-schema-form>` instead, which loads Bootstrap 5 from a CDN. Load the assets yourself in production.
50
64
 
51
- * `material-design` for Material Design.
52
- * `bootstrap-3` for Bootstrap 3.
53
- * `bootstrap-5` for 'Bootstrap 5.
54
- * `no-framework` for (plain HTML).
65
+ The [AJSF README](https://github.com/hamzahamidi/ajsf#readme) covers the other inputs and outputs, layouts, custom widgets and validation messages.
55
66
 
56
67
  ## Checkbox and radio structure, changed in 22.1.0
57
68
 
@@ -103,16 +114,3 @@ applies to the legend.
103
114
  The required marker moves with the title. It was previously appended only to
104
115
  the framework's own label, so a required fieldset, whose title the widget
105
116
  already owned, rendered no asterisk at all; it now does.
106
-
107
- ## Code scaffolding
108
-
109
- Run `ng generate component component-name --project @ajsf/bootstrap5` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project @ajsf/bootstrap5`.
110
- > Note: Don't forget to add `--project @ajsf/bootstrap5` or else it will be added to the default project in your `angular.json` file.
111
-
112
- ## Build
113
-
114
- Run `ng build @ajsf/bootstrap5` to build the project. The build artifacts will be stored in the `dist/` directory.
115
-
116
- ## Running unit tests
117
-
118
- Run `ng test @ajsf/bootstrap5` to execute the unit tests via [Karma](https://karma-runner.github.io).
@@ -1,6 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Input, ChangeDetectionStrategy, Component, Injectable, NgModule } from '@angular/core';
3
3
  import { CommonModule } from '@angular/common';
4
+ import * as i1$1 from '@angular/forms';
5
+ import { ReactiveFormsModule } from '@angular/forms';
4
6
  import * as i1 from '@ajsf/core';
5
7
  import { cloneDeep, inArray, addClasses, CheckboxComponent, CheckboxesComponent, RadiosComponent, Framework, JsonSchemaFormModule, WidgetLibraryModule, JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService } from '@ajsf/core';
6
8
 
@@ -13,6 +15,7 @@ class Bootstrap5FrameworkComponent {
13
15
  this.changeDetector = changeDetector;
14
16
  this.jsf = jsf;
15
17
  this.frameworkInitialized = false;
18
+ this.errorMessage = null;
16
19
  this.formControl = null;
17
20
  this.debugOutput = '';
18
21
  this.debug = '';
@@ -176,7 +179,8 @@ class Bootstrap5FrameworkComponent {
176
179
  }
177
180
  if (this.formControl) {
178
181
  this.updateHelpBlock(this.formControl.status);
179
- this.formControl.statusChanges.subscribe(status => this.updateHelpBlock(status));
182
+ // events, not statusChanges: a blur marks the control touched without changing its status.
183
+ this.formControl.events.subscribe(() => this.updateHelpBlock(this.formControl.status));
180
184
  if (this.options.debug) {
181
185
  const vars = [];
182
186
  this.debugOutput = vars.map(thisVar => JSON.stringify(thisVar, null, 2)).join('\n');
@@ -186,11 +190,11 @@ class Bootstrap5FrameworkComponent {
186
190
  }
187
191
  }
188
192
  updateHelpBlock(status) {
189
- this.options.helpBlock = status === 'INVALID' &&
193
+ this.errorMessage = status === 'INVALID' &&
190
194
  this.options.enableErrorState && this.formControl.errors &&
191
195
  (this.formControl.touched || this.formControl.dirty || this.options.feedbackOnRender) ?
192
- this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) :
193
- this.options.description || this.options.help || null;
196
+ this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) : null;
197
+ this.options.helpBlock = this.errorMessage || this.options.description || this.options.help || null;
194
198
  }
195
199
  setTitle() {
196
200
  switch (this.layoutNode.type) {
@@ -227,11 +231,11 @@ class Bootstrap5FrameworkComponent {
227
231
  this.jsf.removeItem(this);
228
232
  }
229
233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.JsonSchemaFormService }], target: i0.ɵɵFactoryTarget.Component }); }
230
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Bootstrap5FrameworkComponent, isStandalone: false, selector: "bootstrap-5-framework", inputs: { layoutNode: "layoutNode", layoutIndex: "layoutIndex", dataIndex: "dataIndex" }, usesOnChanges: true, ngImport: i0, template: "<!--\nBootstrap 5 replaced the has-error and has-success wrapper classes with\nis-invalid and is-valid on the control itself, so the state classes are bound\nto the field rather than to this container.\n-->\n<div [class]=\"options?.htmlClass || ''\">\n\n @if (options?.messageLocation === 'top') {\n <div>\n @if (options?.helpBlock) {\n <p\n class=\"form-text\"\n [innerHTML]=\"$safeNavigationMigration(options?.helpBlock)\"></p>\n }\n </div>\n }\n\n @if (options?.title && layoutNode?.type !== 'tab') {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [class.visually-hidden]=\"options?.notitle\"\n [innerHTML]=\"$safeNavigationMigration(options?.title)\"></label>\n }\n @if (layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired) {\n <p>\n <strong class=\"text-danger\">*</strong> = required fields\n </p>\n }\n <!-- Bootstrap reveals .invalid-feedback only after the element carrying\n .is-invalid, so the marker belongs on this row, not on the control. -->\n <div\n [class.d-flex]=\"showRemoveButton\"\n [class.align-items-center]=\"showRemoveButton && options?.isInputWidget\"\n [class.align-items-start]=\"showRemoveButton && !options?.isInputWidget\"\n [class.is-invalid]=\"!!options?.errorMessage\">\n <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\n [class.flex-grow-1]=\"showRemoveButton\"\n >\n @if (options?.fieldAddonLeft) {\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonLeft)\"></span>\n </div>\n }\n\n <select-widget-widget\n [layoutNode]=\"widgetLayoutNode\"\n [dataIndex]=\"dataIndex\"\n [layoutIndex]=\"layoutIndex\"></select-widget-widget>\n\n @if (options?.fieldAddonRight) {\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonRight)\"></span>\n </div>\n }\n </div>\n\n @if (showRemoveButton) {\n <button\n class=\"ms-2 btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n }\n </div>\n\n @if (formControl?.touched && options?.errorMessage) {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"$safeNavigationMigration(options?.errorMessage)\"></div>\n }\n\n <!--\n description || help is the order updateHelpBlock uses for options.helpBlock,\n which this block replaced. Reading description alone lost help entirely.\n The messageLocation guard mirrors the paragraph above: containers set it\n to 'top', and without it the same text renders in both places.\n -->\n @if ((options?.description || options?.help) &&\n options?.messageLocation !== 'top' &&\n (!options?.showErrors || !options?.errorMessage)) {\n <div\n class=\"form-text text-muted\"\n [innerHTML]=\"options?.description || options?.help\"></div>\n }\n</div>\n\n@if (debug && debugOutput) {\n <div>debug:\n <pre>{{debugOutput}}</pre>\n </div>\n}\n", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}\n"], dependencies: [{ kind: "component", type: i1.SelectWidgetComponent, selector: "select-widget-widget", inputs: ["layoutNode", "layoutIndex", "dataIndex"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
234
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Bootstrap5FrameworkComponent, isStandalone: false, selector: "bootstrap-5-framework", inputs: { layoutNode: "layoutNode", layoutIndex: "layoutIndex", dataIndex: "dataIndex" }, usesOnChanges: true, ngImport: i0, template: "<!--\nBootstrap 5 replaced the has-error and has-success wrapper classes with\nis-invalid and is-valid on the control itself, so the state classes are bound\nto the field rather than to this container.\n-->\n<div [class]=\"options?.htmlClass || ''\">\n\n @if (options?.messageLocation === 'top') {\n <div>\n @if (options?.helpBlock) {\n <p\n class=\"form-text\"\n [innerHTML]=\"$safeNavigationMigration(options?.helpBlock)\"></p>\n }\n </div>\n }\n\n @if (options?.title && layoutNode?.type !== 'tab') {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [class.visually-hidden]=\"options?.notitle\"\n [innerHTML]=\"$safeNavigationMigration(options?.title)\"></label>\n }\n @if (layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired) {\n <p>\n <strong class=\"text-danger\">*</strong> = required fields\n </p>\n }\n <!-- Bootstrap reveals .invalid-feedback only after the element carrying\n .is-invalid, so the marker belongs on this row, not on the control. -->\n <div\n [class.d-flex]=\"showRemoveButton\"\n [class.align-items-center]=\"showRemoveButton && options?.isInputWidget\"\n [class.align-items-start]=\"showRemoveButton && !options?.isInputWidget\"\n [class.is-invalid]=\"!!errorMessage\">\n <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\n [class.flex-grow-1]=\"showRemoveButton\"\n >\n @if (options?.fieldAddonLeft) {\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonLeft)\"></span>\n </div>\n }\n\n <select-widget-widget\n [layoutNode]=\"widgetLayoutNode\"\n [dataIndex]=\"dataIndex\"\n [layoutIndex]=\"layoutIndex\"></select-widget-widget>\n\n @if (options?.fieldAddonRight) {\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonRight)\"></span>\n </div>\n }\n </div>\n\n @if (showRemoveButton) {\n <button\n class=\"ms-2 btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n }\n </div>\n\n @if (errorMessage && options.messageLocation !== 'top') {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"errorMessage\"></div>\n }\n\n <!--\n description || help is the order updateHelpBlock uses for options.helpBlock,\n which this block replaced. Reading description alone lost help entirely.\n The messageLocation guard mirrors the paragraph above: containers set it\n to 'top', and without it the same text renders in both places.\n -->\n @if ((options?.description || options?.help) &&\n options?.messageLocation !== 'top' && !errorMessage) {\n <div\n class=\"form-text text-muted\"\n [innerHTML]=\"options?.description || options?.help\"></div>\n }\n</div>\n\n@if (debug && debugOutput) {\n <div>debug:\n <pre>{{debugOutput}}</pre>\n </div>\n}\n", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}\n"], dependencies: [{ kind: "component", type: i1.SelectWidgetComponent, selector: "select-widget-widget", inputs: ["layoutNode", "layoutIndex", "dataIndex"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
231
235
  }
232
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkComponent, decorators: [{
233
237
  type: Component,
234
- args: [{ selector: 'bootstrap-5-framework', changeDetection: ChangeDetectionStrategy.Eager, standalone: false, template: "<!--\nBootstrap 5 replaced the has-error and has-success wrapper classes with\nis-invalid and is-valid on the control itself, so the state classes are bound\nto the field rather than to this container.\n-->\n<div [class]=\"options?.htmlClass || ''\">\n\n @if (options?.messageLocation === 'top') {\n <div>\n @if (options?.helpBlock) {\n <p\n class=\"form-text\"\n [innerHTML]=\"$safeNavigationMigration(options?.helpBlock)\"></p>\n }\n </div>\n }\n\n @if (options?.title && layoutNode?.type !== 'tab') {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [class.visually-hidden]=\"options?.notitle\"\n [innerHTML]=\"$safeNavigationMigration(options?.title)\"></label>\n }\n @if (layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired) {\n <p>\n <strong class=\"text-danger\">*</strong> = required fields\n </p>\n }\n <!-- Bootstrap reveals .invalid-feedback only after the element carrying\n .is-invalid, so the marker belongs on this row, not on the control. -->\n <div\n [class.d-flex]=\"showRemoveButton\"\n [class.align-items-center]=\"showRemoveButton && options?.isInputWidget\"\n [class.align-items-start]=\"showRemoveButton && !options?.isInputWidget\"\n [class.is-invalid]=\"!!options?.errorMessage\">\n <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\n [class.flex-grow-1]=\"showRemoveButton\"\n >\n @if (options?.fieldAddonLeft) {\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonLeft)\"></span>\n </div>\n }\n\n <select-widget-widget\n [layoutNode]=\"widgetLayoutNode\"\n [dataIndex]=\"dataIndex\"\n [layoutIndex]=\"layoutIndex\"></select-widget-widget>\n\n @if (options?.fieldAddonRight) {\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonRight)\"></span>\n </div>\n }\n </div>\n\n @if (showRemoveButton) {\n <button\n class=\"ms-2 btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n }\n </div>\n\n @if (formControl?.touched && options?.errorMessage) {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"$safeNavigationMigration(options?.errorMessage)\"></div>\n }\n\n <!--\n description || help is the order updateHelpBlock uses for options.helpBlock,\n which this block replaced. Reading description alone lost help entirely.\n The messageLocation guard mirrors the paragraph above: containers set it\n to 'top', and without it the same text renders in both places.\n -->\n @if ((options?.description || options?.help) &&\n options?.messageLocation !== 'top' &&\n (!options?.showErrors || !options?.errorMessage)) {\n <div\n class=\"form-text text-muted\"\n [innerHTML]=\"options?.description || options?.help\"></div>\n }\n</div>\n\n@if (debug && debugOutput) {\n <div>debug:\n <pre>{{debugOutput}}</pre>\n </div>\n}\n", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}\n"] }]
238
+ args: [{ selector: 'bootstrap-5-framework', changeDetection: ChangeDetectionStrategy.Eager, standalone: false, template: "<!--\nBootstrap 5 replaced the has-error and has-success wrapper classes with\nis-invalid and is-valid on the control itself, so the state classes are bound\nto the field rather than to this container.\n-->\n<div [class]=\"options?.htmlClass || ''\">\n\n @if (options?.messageLocation === 'top') {\n <div>\n @if (options?.helpBlock) {\n <p\n class=\"form-text\"\n [innerHTML]=\"$safeNavigationMigration(options?.helpBlock)\"></p>\n }\n </div>\n }\n\n @if (options?.title && layoutNode?.type !== 'tab') {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [class.visually-hidden]=\"options?.notitle\"\n [innerHTML]=\"$safeNavigationMigration(options?.title)\"></label>\n }\n @if (layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired) {\n <p>\n <strong class=\"text-danger\">*</strong> = required fields\n </p>\n }\n <!-- Bootstrap reveals .invalid-feedback only after the element carrying\n .is-invalid, so the marker belongs on this row, not on the control. -->\n <div\n [class.d-flex]=\"showRemoveButton\"\n [class.align-items-center]=\"showRemoveButton && options?.isInputWidget\"\n [class.align-items-start]=\"showRemoveButton && !options?.isInputWidget\"\n [class.is-invalid]=\"!!errorMessage\">\n <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\n [class.flex-grow-1]=\"showRemoveButton\"\n >\n @if (options?.fieldAddonLeft) {\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonLeft)\"></span>\n </div>\n }\n\n <select-widget-widget\n [layoutNode]=\"widgetLayoutNode\"\n [dataIndex]=\"dataIndex\"\n [layoutIndex]=\"layoutIndex\"></select-widget-widget>\n\n @if (options?.fieldAddonRight) {\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonRight)\"></span>\n </div>\n }\n </div>\n\n @if (showRemoveButton) {\n <button\n class=\"ms-2 btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n }\n </div>\n\n @if (errorMessage && options.messageLocation !== 'top') {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"errorMessage\"></div>\n }\n\n <!--\n description || help is the order updateHelpBlock uses for options.helpBlock,\n which this block replaced. Reading description alone lost help entirely.\n The messageLocation guard mirrors the paragraph above: containers set it\n to 'top', and without it the same text renders in both places.\n -->\n @if ((options?.description || options?.help) &&\n options?.messageLocation !== 'top' && !errorMessage) {\n <div\n class=\"form-text text-muted\"\n [innerHTML]=\"options?.description || options?.help\"></div>\n }\n</div>\n\n@if (debug && debugOutput) {\n <div>debug:\n <pre>{{debugOutput}}</pre>\n </div>\n}\n", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}\n"] }]
235
239
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.JsonSchemaFormService }], propDecorators: { layoutNode: [{
236
240
  type: Input
237
241
  }], layoutIndex: [{
@@ -283,7 +287,7 @@ class Bootstrap5CheckboxComponent extends CheckboxComponent {
283
287
  [innerHTML]="options?.title"></span>
284
288
  }
285
289
  </label>
286
- </div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
290
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
287
291
  }
288
292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxComponent, decorators: [{
289
293
  type: Component,
@@ -737,6 +741,7 @@ class Bootstrap5FrameworkModule {
737
741
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
738
742
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, declarations: [Bootstrap5FrameworkComponent, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5RadiosComponent], imports: [JsonSchemaFormModule,
739
743
  CommonModule,
744
+ ReactiveFormsModule,
740
745
  WidgetLibraryModule], exports: [JsonSchemaFormModule,
741
746
  Bootstrap5FrameworkComponent, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5RadiosComponent] }); }
742
747
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, providers: [
@@ -746,6 +751,7 @@ class Bootstrap5FrameworkModule {
746
751
  { provide: Framework, useClass: Bootstrap5Framework, multi: true },
747
752
  ], imports: [JsonSchemaFormModule,
748
753
  CommonModule,
754
+ ReactiveFormsModule,
749
755
  WidgetLibraryModule, JsonSchemaFormModule] }); }
750
756
  }
751
757
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, decorators: [{
@@ -754,6 +760,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
754
760
  imports: [
755
761
  JsonSchemaFormModule,
756
762
  CommonModule,
763
+ ReactiveFormsModule,
757
764
  WidgetLibraryModule,
758
765
  ],
759
766
  declarations: [
@@ -1 +1 @@
1
- {"version":3,"file":"ajsf-bootstrap5.mjs","sources":["../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.component.html","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-checkbox.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-checkboxes.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-radios.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5.framework.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/public_api.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.module.ts","../../../../projects/ajsf-bootstrap5/src/public_api.ts","../../../../projects/ajsf-bootstrap5/src/ajsf-bootstrap5.ts"],"sourcesContent":["import {\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnInit,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {JsonSchemaFormService, addClasses, cloneDeep, inArray} from '@ajsf/core';\n\n/**\n * Bootstrap 5 framework for Angular JSON Schema Form.\n *\n */\n@Component({\n selector: 'bootstrap-5-framework',\n templateUrl: './bootstrap5-framework.component.html',\n styleUrls: ['./bootstrap5-framework.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false\n})\nexport class Bootstrap5FrameworkComponent implements OnInit, OnChanges {\n frameworkInitialized = false;\n widgetOptions: any; // Options passed to child widget\n widgetLayoutNode: any; // layoutNode passed to child widget\n options: any; // Options used in this framework\n formControl: any = null;\n debugOutput: any = '';\n debug: any = '';\n parentArray: any = null;\n isOrderable = false;\n @Input() layoutNode: any;\n @Input() layoutIndex: number[];\n @Input() dataIndex: number[];\n\n constructor(\n public changeDetector: ChangeDetectorRef,\n public jsf: JsonSchemaFormService\n ) {\n }\n\n get isSingleCheck(): boolean {\n return this.layoutNode.type === 'checkbox' &&\n !this.options.fieldAddonLeft && !this.options.fieldAddonRight;\n }\n\n get showRemoveButton(): boolean {\n if (!this.options.removable || this.options.readonly ||\n this.layoutNode.type === '$ref'\n ) {\n return false;\n }\n if (this.layoutNode.recursiveReference) {\n return true;\n }\n if (!this.layoutNode.arrayItem || !this.parentArray) {\n return false;\n }\n // If array length <= minItems, don't allow removing any items\n return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false :\n // For removable list items, allow removing any item\n this.layoutNode.arrayItemType === 'list' ? true :\n // For removable tuple items, only allow removing last item in list\n this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2;\n }\n\n ngOnInit() {\n this.initializeFramework();\n if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') {\n this.parentArray = this.jsf.getParentNode(this);\n if (this.parentArray) {\n this.isOrderable = this.layoutNode.arrayItemType === 'list' &&\n !this.options.readonly && this.parentArray.options.orderable;\n }\n }\n }\n\n ngOnChanges() {\n if (!this.frameworkInitialized) {\n this.initializeFramework();\n }\n }\n\n initializeFramework() {\n if (this.layoutNode) {\n this.options = cloneDeep(this.layoutNode.options);\n this.widgetLayoutNode = {\n ...this.layoutNode,\n options: cloneDeep(this.layoutNode.options)\n };\n this.widgetOptions = this.widgetLayoutNode.options;\n this.formControl = this.jsf.getFormControl(this);\n\n this.options.isInputWidget = inArray(this.layoutNode.type, [\n 'button', 'checkbox', 'checkboxbuttons', 'checkboxes-inline',\n 'checkboxes', 'color',\n 'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden',\n 'image', 'integer', 'month', 'number', 'password', 'radio',\n 'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search',\n 'select', 'submit', 'tel', 'text', 'textarea', 'time', 'url', 'week'\n ]);\n\n this.options.title = this.setTitle();\n\n this.options.htmlClass =\n addClasses(this.options.htmlClass, 'schema-form-' + this.layoutNode.type);\n this.options.htmlClass =\n this.layoutNode.type === 'array' ?\n addClasses(this.options.htmlClass, 'list-group') :\n this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ?\n addClasses(this.options.htmlClass, 'list-group-item') :\n // Bootstrap 5 dropped .form-group in favour of margin utilities.\n addClasses(this.options.htmlClass, 'mb-3');\n this.widgetOptions.htmlClass = '';\n this.options.labelHtmlClass =\n addClasses(this.options.labelHtmlClass, 'form-label');\n this.widgetOptions.activeClass =\n addClasses(this.widgetOptions.activeClass, 'active');\n this.options.fieldAddonLeft =\n this.options.fieldAddonLeft || this.options.prepend;\n this.options.fieldAddonRight =\n this.options.fieldAddonRight || this.options.append;\n\n // Named types only: submit also has a null title here, and its widget\n // uses the title as an input value, where markup would render literally.\n const titled = this.layoutNode.type === 'array' || this.layoutNode.type === 'fieldset'\n ? this.widgetOptions : this.options;\n if (titled.title && this.layoutNode.type !== 'tab' &&\n !this.options.notitle && this.options.required &&\n !titled.title.includes('*')\n ) {\n titled.title += ' <strong class=\"text-danger\">*</strong>';\n }\n // Set miscelaneous styles and settings for each control type\n switch (this.layoutNode.type) {\n // Checkbox controls\n // The framework template puts [class.form-check]=\"isSingleCheck\" on\n // its own wrapper div, so the single checkbox takes .form-check from\n // there rather than from this switch.\n case 'checkbox':\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n case 'checkboxes':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n case 'checkboxes-inline':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check form-check-inline');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n // Radio controls\n case 'radio':\n case 'radios':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n case 'radios-inline':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check form-check-inline');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n // Button sets - checkboxbuttons and radiobuttons\n case 'checkboxbuttons':\n case 'radiobuttons':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'btn-group');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'btn');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass,\n this.options.style || 'btn-outline-primary');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'btn-check');\n break;\n // Single button controls\n case 'button':\n case 'submit':\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'btn');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-info');\n break;\n // Containers - arrays and fieldsets\n case 'array':\n case 'fieldset':\n case 'section':\n case 'conditional':\n case 'advancedfieldset':\n case 'authfieldset':\n case 'selectfieldset':\n case 'optionfieldset':\n this.options.messageLocation = 'top';\n break;\n case 'tabarray':\n case 'tabs':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'tab-content');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'tab-pane');\n this.widgetOptions.labelHtmlClass = addClasses(\n this.widgetOptions.labelHtmlClass, 'nav nav-tabs');\n break;\n // 'Add' buttons - references\n case '$ref':\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'btn pull-right');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-default');\n this.options.icon = 'glyphicon glyphicon-plus';\n break;\n // Default - including regular inputs\n default:\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-control');\n }\n\n if (this.formControl) {\n this.updateHelpBlock(this.formControl.status);\n this.formControl.statusChanges.subscribe(status => this.updateHelpBlock(status));\n\n if (this.options.debug) {\n const vars: any[] = [];\n this.debugOutput = vars.map(thisVar => JSON.stringify(thisVar, null, 2)).join('\\n');\n }\n }\n this.frameworkInitialized = true;\n }\n\n }\n\n updateHelpBlock(status) {\n this.options.helpBlock = status === 'INVALID' &&\n this.options.enableErrorState && this.formControl.errors &&\n (this.formControl.touched || this.formControl.dirty || this.options.feedbackOnRender) ?\n this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) :\n this.options.description || this.options.help || null;\n }\n\n setTitle(): string {\n switch (this.layoutNode.type) {\n case 'button':\n case 'checkbox':\n case 'section':\n case 'help':\n case 'msg':\n case 'submit':\n case 'message':\n case 'tabarray':\n case 'tabs':\n case '$ref':\n return null;\n case 'advancedfieldset':\n this.widgetOptions.expandable = true;\n this.widgetOptions.title = 'Advanced options';\n return null;\n case 'authfieldset':\n this.widgetOptions.expandable = true;\n this.widgetOptions.title = 'Authentication settings';\n return null;\n // An array is a fieldset: the widget owns the title and renders the legend.\n case 'array':\n case 'fieldset':\n this.widgetOptions.title = this.options.title;\n return null;\n default:\n this.widgetOptions.title = null;\n return this.jsf.setItemTitle(this);\n }\n }\n\n removeItem() {\n this.jsf.removeItem(this);\n }\n}\n","<!--\nBootstrap 5 replaced the has-error and has-success wrapper classes with\nis-invalid and is-valid on the control itself, so the state classes are bound\nto the field rather than to this container.\n-->\n<div [class]=\"options?.htmlClass || ''\">\n\n @if (options?.messageLocation === 'top') {\n <div>\n @if (options?.helpBlock) {\n <p\n class=\"form-text\"\n [innerHTML]=\"$safeNavigationMigration(options?.helpBlock)\"></p>\n }\n </div>\n }\n\n @if (options?.title && layoutNode?.type !== 'tab') {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [class.visually-hidden]=\"options?.notitle\"\n [innerHTML]=\"$safeNavigationMigration(options?.title)\"></label>\n }\n @if (layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired) {\n <p>\n <strong class=\"text-danger\">*</strong> = required fields\n </p>\n }\n <!-- Bootstrap reveals .invalid-feedback only after the element carrying\n .is-invalid, so the marker belongs on this row, not on the control. -->\n <div\n [class.d-flex]=\"showRemoveButton\"\n [class.align-items-center]=\"showRemoveButton && options?.isInputWidget\"\n [class.align-items-start]=\"showRemoveButton && !options?.isInputWidget\"\n [class.is-invalid]=\"!!options?.errorMessage\">\n <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\n [class.flex-grow-1]=\"showRemoveButton\"\n >\n @if (options?.fieldAddonLeft) {\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonLeft)\"></span>\n </div>\n }\n\n <select-widget-widget\n [layoutNode]=\"widgetLayoutNode\"\n [dataIndex]=\"dataIndex\"\n [layoutIndex]=\"layoutIndex\"></select-widget-widget>\n\n @if (options?.fieldAddonRight) {\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonRight)\"></span>\n </div>\n }\n </div>\n\n @if (showRemoveButton) {\n <button\n class=\"ms-2 btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n }\n </div>\n\n @if (formControl?.touched && options?.errorMessage) {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"$safeNavigationMigration(options?.errorMessage)\"></div>\n }\n\n <!--\n description || help is the order updateHelpBlock uses for options.helpBlock,\n which this block replaced. Reading description alone lost help entirely.\n The messageLocation guard mirrors the paragraph above: containers set it\n to 'top', and without it the same text renders in both places.\n -->\n @if ((options?.description || options?.help) &&\n options?.messageLocation !== 'top' &&\n (!options?.showErrors || !options?.errorMessage)) {\n <div\n class=\"form-text text-muted\"\n [innerHTML]=\"options?.description || options?.help\"></div>\n }\n</div>\n\n@if (debug && debugOutput) {\n <div>debug:\n <pre>{{debugOutput}}</pre>\n </div>\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CheckboxComponent } from '@ajsf/core';\n\n/**\n * Bootstrap 5 wants the input and label as siblings inside .form-check.\n */\n@Component({\n selector: 'bootstrap5-checkbox-widget',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false,\n template: `\n <div [class]=\"options?.htmlClass || ''\">\n @if (boundControl) {\n <input\n [formControl]=\"formControl\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [class]=\"(options?.fieldHtmlClass || '') + (isChecked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [id]=\"'control' + layoutNode?._id\"\n [name]=\"controlName\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n type=\"checkbox\">\n }\n @if (!boundControl) {\n <input\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [checked]=\"isChecked ? 'checked' : null\"\n [class]=\"(options?.fieldHtmlClass || '') + (isChecked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id\"\n [name]=\"controlName\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"controlValue\"\n type=\"checkbox\"\n (change)=\"updateValue($event)\">\n }\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.itemLabelHtmlClass || ''\">\n @if (options?.title) {\n <span\n [style.display]=\"options?.notitle ? 'none' : ''\"\n [innerHTML]=\"options?.title\"></span>\n }\n </label>\n </div>`,\n})\nexport class Bootstrap5CheckboxComponent extends CheckboxComponent {}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CheckboxesComponent } from '@ajsf/core';\n\n/**\n * Siblings throughout: Bootstrap 5 button sets use .btn-check, which is a\n * sibling input too.\n */\n@Component({\n selector: 'bootstrap5-checkboxes-widget',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false,\n template: `\n @if (options?.title) {\n <label\n [class]=\"options?.labelHtmlClass || ''\"\n [style.display]=\"options?.notitle ? 'none' : ''\"\n [innerHTML]=\"options?.title\"></label>\n }\n\n @if (layoutOrientation === 'horizontal') {\n @if (layoutNode?.type === 'checkboxbuttons') {\n <div [class]=\"options?.htmlClass || ''\">\n @for (checkboxItem of checkboxList; track checkboxItem) {\n <input type=\"checkbox\"\n [attr.required]=\"options?.required\"\n [checked]=\"checkboxItem.checked\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [name]=\"checkboxItem?.name\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"checkboxItem.value\"\n (change)=\"updateValue($event, checkboxItem)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"checkboxItem.name\"></label>\n }\n </div>\n } @else {\n <div>\n @for (checkboxItem of checkboxList; track checkboxItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"checkbox\"\n [attr.required]=\"options?.required\"\n [checked]=\"checkboxItem.checked\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [name]=\"checkboxItem?.name\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"checkboxItem.value\"\n (change)=\"updateValue($event, checkboxItem)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"checkboxItem.name\"></label>\n </div>\n }\n </div>\n }\n }\n\n @if (layoutOrientation === 'vertical') {\n <div>\n @for (checkboxItem of checkboxList; track checkboxItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"checkbox\"\n [attr.required]=\"options?.required\"\n [checked]=\"checkboxItem.checked\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [name]=\"checkboxItem?.name\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"checkboxItem.value\"\n (change)=\"updateValue($event, checkboxItem)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"checkboxItem.name\"></label>\n </div>\n }\n </div>\n }`,\n})\nexport class Bootstrap5CheckboxesComponent extends CheckboxesComponent {}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { RadiosComponent } from '@ajsf/core';\n\n/**\n * Siblings throughout: Bootstrap 5 button sets use .btn-check, which is a\n * sibling input too.\n */\n@Component({\n selector: 'bootstrap5-radios-widget',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false,\n template: `\n @if (options?.title) {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [style.display]=\"options?.notitle ? 'none' : ''\"\n [innerHTML]=\"options?.title\"></label>\n }\n\n @if (layoutOrientation === 'horizontal') {\n @if (layoutNode?.type === 'radiobuttons') {\n <div [class]=\"options?.htmlClass || ''\">\n @for (radioItem of radiosList; track radioItem) {\n <input type=\"radio\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [attr.readonly]=\"options?.readonly ? 'readonly' : null\"\n [attr.required]=\"options?.required\"\n [checked]=\"radioItem?.value === controlValue\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [name]=\"controlName\"\n [value]=\"radioItem?.value\"\n (change)=\"updateValue($event)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') +\n ((controlValue + '' === radioItem?.value + '') ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"radioItem?.name\"></label>\n }\n </div>\n } @else {\n <div>\n @for (radioItem of radiosList; track radioItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"radio\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [attr.readonly]=\"options?.readonly ? 'readonly' : null\"\n [attr.required]=\"options?.required\"\n [checked]=\"radioItem?.value === controlValue\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [name]=\"controlName\"\n [value]=\"radioItem?.value\"\n (change)=\"updateValue($event)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') +\n ((controlValue + '' === radioItem?.value + '') ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"radioItem?.name\"></label>\n </div>\n }\n </div>\n }\n }\n\n @if (layoutOrientation !== 'horizontal') {\n <div>\n @for (radioItem of radiosList; track radioItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"radio\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [attr.readonly]=\"options?.readonly ? 'readonly' : null\"\n [attr.required]=\"options?.required\"\n [checked]=\"radioItem?.value === controlValue\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [name]=\"controlName\"\n [value]=\"radioItem?.value\"\n (change)=\"updateValue($event)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') +\n ((controlValue + '' === radioItem?.value + '') ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"radioItem?.name\"></label>\n </div>\n }\n </div>\n }`,\n})\nexport class Bootstrap5RadiosComponent extends RadiosComponent {}\n","import {Injectable} from '@angular/core';\nimport {Framework} from '@ajsf/core';\nimport {Bootstrap5FrameworkComponent} from './bootstrap5-framework.component';\nimport {Bootstrap5CheckboxComponent} from './widgets/bootstrap5-checkbox.component';\nimport {Bootstrap5CheckboxesComponent} from './widgets/bootstrap5-checkboxes.component';\nimport {Bootstrap5RadiosComponent} from './widgets/bootstrap5-radios.component';\n\n// Bootstrap 5 Framework\n// https://github.com/ng-bootstrap/ng-bootstrap\n\n@Injectable()\nexport class Bootstrap5Framework extends Framework {\n name = 'bootstrap-5';\n\n framework = Bootstrap5FrameworkComponent;\n\n widgets = {\n 'checkbox': Bootstrap5CheckboxComponent,\n 'checkboxes': Bootstrap5CheckboxesComponent,\n 'radios': Bootstrap5RadiosComponent,\n };\n\n stylesheets = [\n '//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css'\n ];\n\n // Bootstrap 5 dropped jQuery, and the bundle build already contains Popper,\n // so this is one script where Bootstrap 4 needed three.\n scripts = [\n '//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js',\n ];\n}\n","import { Bootstrap5CheckboxComponent } from './bootstrap5-checkbox.component';\nimport { Bootstrap5CheckboxesComponent } from './bootstrap5-checkboxes.component';\nimport { Bootstrap5RadiosComponent } from './bootstrap5-radios.component';\n\nexport { Bootstrap5CheckboxComponent } from './bootstrap5-checkbox.component';\nexport { Bootstrap5CheckboxesComponent } from './bootstrap5-checkboxes.component';\nexport { Bootstrap5RadiosComponent } from './bootstrap5-radios.component';\n\nexport const BOOTSTRAP5_FRAMEWORK_COMPONENTS = [\n Bootstrap5CheckboxComponent,\n Bootstrap5CheckboxesComponent,\n Bootstrap5RadiosComponent,\n];\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n Framework,\n JsonSchemaFormService,\n WidgetLibraryService,\n FrameworkLibraryService,\n JsonSchemaFormModule,\n WidgetLibraryModule\n} from '@ajsf/core';\nimport {Bootstrap5Framework} from './bootstrap5.framework';\nimport {Bootstrap5FrameworkComponent} from './bootstrap5-framework.component';\nimport {BOOTSTRAP5_FRAMEWORK_COMPONENTS} from './widgets/public_api';\n\n@NgModule({\n imports: [\n JsonSchemaFormModule,\n CommonModule,\n WidgetLibraryModule,\n ],\n declarations: [\n Bootstrap5FrameworkComponent,\n ...BOOTSTRAP5_FRAMEWORK_COMPONENTS,\n ],\n exports: [\n JsonSchemaFormModule,\n Bootstrap5FrameworkComponent,\n ...BOOTSTRAP5_FRAMEWORK_COMPONENTS,\n ],\n providers: [\n JsonSchemaFormService,\n FrameworkLibraryService,\n WidgetLibraryService,\n { provide: Framework, useClass: Bootstrap5Framework, multi: true },\n ]\n})\nexport class Bootstrap5FrameworkModule {\n}\n","/**\n * @module \\@ajsf/bootstrap5\n */\n\nexport * from './lib/bootstrap5-framework.module';\nexport * from './lib/bootstrap5-framework.component';\nexport * from './lib/bootstrap5.framework';\nexport * from './lib/widgets/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.Bootstrap5CheckboxComponent","i2.Bootstrap5CheckboxesComponent","i3.Bootstrap5RadiosComponent"],"mappings":";;;;;;AAUA;;;AAGG;MAQU,4BAA4B,CAAA;IAcvC,WAAA,CACS,cAAiC,EACjC,GAA0B,EAAA;QAD1B,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,GAAG,GAAH,GAAG;QAfZ,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAI5B,IAAA,CAAA,WAAW,GAAQ,IAAI;QACvB,IAAA,CAAA,WAAW,GAAQ,EAAE;QACrB,IAAA,CAAA,KAAK,GAAQ,EAAE;QACf,IAAA,CAAA,WAAW,GAAQ,IAAI;QACvB,IAAA,CAAA,WAAW,GAAG,KAAK;IASnB;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU;AACxC,YAAA,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe;IACjE;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;AAClD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAC/B;AACA,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE;AACtC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnD,YAAA,OAAO,KAAK;QACd;;QAEA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,GAAG,KAAK;;YAEnF,IAAI,CAAC,UAAU,CAAC,aAAa,KAAK,MAAM,GAAG,IAAI;;gBAE7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;IACzF;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE;YAChE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;AAC/C,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,KAAK,MAAM;AACzD,oBAAA,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS;YAChE;QACF;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,IAAI,CAAC,mBAAmB,EAAE;QAC5B;IACF;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACjD,IAAI,CAAC,gBAAgB,GAAG;gBACtB,GAAG,IAAI,CAAC,UAAU;gBAClB,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO;aAC3C;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAClD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC;AAEhD,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACzD,gBAAA,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,mBAAmB;AAC5D,gBAAA,YAAY,EAAE,OAAO;gBACrB,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ;gBAC/D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO;gBAC1D,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;AACrE,gBAAA,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;AAC/D,aAAA,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;YAEpC,IAAI,CAAC,OAAO,CAAC,SAAS;AACpB,gBAAA,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,SAAS;AACpB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO;oBAC9B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC;AAChD,oBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM;wBAC1D,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;;wBAErD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;AAChD,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,cAAc;gBACzB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC;YACvD,IAAI,CAAC,aAAa,CAAC,WAAW;gBAC5B,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,cAAc;gBACzB,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YACrD,IAAI,CAAC,OAAO,CAAC,eAAe;gBAC1B,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;;;AAIrD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK;kBACxE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO;YACrC,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,KAAK;gBAChD,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAC9C,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC3B;AACA,gBAAA,MAAM,CAAC,KAAK,IAAI,yCAAyC;YAC3D;;AAEA,YAAA,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI;;;;;AAK1B,gBAAA,KAAK,UAAU;AACb,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACxD,oBAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;oBAC5D;AACF,gBAAA,KAAK,YAAY;AACf,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CACvC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC;AAC7C,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACxD,oBAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;oBAC5D;AACF,gBAAA,KAAK,mBAAmB;AACtB,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CACvC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,8BAA8B,CAAC;AAC/D,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACxD,oBAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;oBAC5D;;AAEF,gBAAA,KAAK,OAAO;AACZ,gBAAA,KAAK,QAAQ;AACX,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CACvC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC;AAC7C,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACxD,oBAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;oBAC5D;AACF,gBAAA,KAAK,eAAe;AAClB,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CACvC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,8BAA8B,CAAC;AAC/D,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACxD,oBAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;oBAC5D;;AAEF,gBAAA,KAAK,iBAAiB;AACtB,gBAAA,KAAK,cAAc;AACjB,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CACvC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC;AAC5C,oBAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC;oBAC/C,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,UAAU,CAChD,IAAI,CAAC,aAAa,CAAC,kBAAkB,EACrC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC;AAC9C,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC;oBACjD;;AAEF,gBAAA,KAAK,QAAQ;AACb,gBAAA,KAAK,QAAQ;AACX,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC;oBAC3C,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC;oBACtE;;AAEF,gBAAA,KAAK,OAAO;AACZ,gBAAA,KAAK,UAAU;AACf,gBAAA,KAAK,SAAS;AACd,gBAAA,KAAK,aAAa;AAClB,gBAAA,KAAK,kBAAkB;AACvB,gBAAA,KAAK,cAAc;AACnB,gBAAA,KAAK,gBAAgB;AACrB,gBAAA,KAAK,gBAAgB;AACnB,oBAAA,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,KAAK;oBACpC;AACF,gBAAA,KAAK,UAAU;AACf,gBAAA,KAAK,MAAM;AACT,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU,CACvC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC;AAC9C,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC;AAChD,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC;oBACpD;;AAEF,gBAAA,KAAK,MAAM;AACT,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,gBAAgB,CAAC;oBACtD,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;AACzE,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,0BAA0B;oBAC9C;;AAEF,gBAAA;AACE,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,UAAU,CAC5C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC;;AAGxD,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AAC7C,gBAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAEhF,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;oBACtB,MAAM,IAAI,GAAU,EAAE;oBACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrF;YACF;AACA,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAClC;IAEF;AAEA,IAAA,eAAe,CAAC,MAAM,EAAA;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,KAAK,SAAS;YAC7C,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM;AACxD,aAAC,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;AACnF,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;AAC/E,YAAA,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI;IACzD;IAEA,QAAQ,GAAA;AACN,QAAA,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI;AAC1B,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,IAAI;AACb,YAAA,KAAK,kBAAkB;AACrB,gBAAA,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI;AACpC,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,kBAAkB;AAC7C,gBAAA,OAAO,IAAI;AACb,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI;AACpC,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,yBAAyB;AACpD,gBAAA,OAAO,IAAI;;AAEb,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,UAAU;gBACb,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;AAC7C,gBAAA,OAAO,IAAI;AACb,YAAA;AACE,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI;gBAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC;;IAExC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;IAC3B;8GA7QW,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,iMCrBzC,6yGAiGA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FD5Ea,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,KAAK,cAClC,KAAK,EAAA,QAAA,EAAA,6yGAAA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA;;sBAYlB;;sBACA;;sBACA;;;AE9BH;;AAEG;AA6CG,MAAO,2BAA4B,SAAQ,iBAAiB,CAAA;8GAArD,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCD,UAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAEE,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBA5CvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;oBACtC,eAAe,EAAE,uBAAuB,CAAC,KAAK;AAC9C,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCD,UAAA,CAAA;AACV,iBAAA;;;AC9CD;;;AAGG;AAsFG,MAAO,6BAA8B,SAAQ,mBAAmB,CAAA;8GAAzD,6BAA6B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjF9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EN,KAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAEO,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBArFzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;oBACxC,eAAe,EAAE,uBAAuB,CAAC,KAAK;AAC9C,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EN,KAAA,CAAA;AACL,iBAAA;;;ACxFD;;;AAGG;AA6FG,MAAO,yBAA0B,SAAQ,eAAe,CAAA;8GAAjD,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxF1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFN,KAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAEO,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA5FrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,0BAA0B;oBACpC,eAAe,EAAE,uBAAuB,CAAC,KAAK;AAC9C,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFN,KAAA,CAAA;AACL,iBAAA;;;AC3FD;AACA;AAGM,MAAO,mBAAoB,SAAQ,SAAS,CAAA;AADlD,IAAA,WAAA,GAAA;;QAEE,IAAA,CAAA,IAAI,GAAG,aAAa;QAEpB,IAAA,CAAA,SAAS,GAAG,4BAA4B;AAExC,QAAA,IAAA,CAAA,OAAO,GAAG;AACR,YAAA,UAAU,EAAE,2BAA2B;AACvC,YAAA,YAAY,EAAE,6BAA6B;AAC3C,YAAA,QAAQ,EAAE,yBAAyB;SACpC;AAED,QAAA,IAAA,CAAA,WAAW,GAAG;YACZ;SACD;;;AAID,QAAA,IAAA,CAAA,OAAO,GAAG;YACR,wEAAwE;SACzE;AACF,IAAA;8GApBY,mBAAmB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAnB,mBAAmB,EAAA,CAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACFM,MAAM,+BAA+B,GAAG;IAC7C,2BAA2B;IAC3B,6BAA6B;IAC7B,yBAAyB;;;MCyBd,yBAAyB,CAAA;8GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAzB,yBAAyB,EAAA,YAAA,EAAA,CAf9B,4BAA4B,EAAAA,2BAAA,EAAAC,6BAAA,EAAAC,yBAAA,CAAA,EAAA,OAAA,EAAA,CAL5B,oBAAoB;YACpB,YAAY;AACZ,YAAA,mBAAmB,aAOnB,oBAAoB;YACpB,4BAA4B,EAAAF,2BAAA,EAAAC,6BAAA,EAAAC,yBAAA,CAAA,EAAA,CAAA,CAAA;AAUvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,SAAA,EAPvB;YACP,qBAAqB;YACrB,uBAAuB;YACvB,oBAAoB;YACpB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE;AACrE,SAAA,EAAA,OAAA,EAAA,CAlBG,oBAAoB;YACpB,YAAY;AACZ,YAAA,mBAAmB,EAOnB,oBAAoB,CAAA,EAAA,CAAA,CAAA;;2FAWf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAtBrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,oBAAoB;wBACpB,YAAY;wBACZ,mBAAmB;AACtB,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACV,4BAA4B;AAC5B,wBAAA,GAAG,+BAA+B;AACrC,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL,oBAAoB;wBACpB,4BAA4B;AAC5B,wBAAA,GAAG,+BAA+B;AACrC,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACP,qBAAqB;wBACrB,uBAAuB;wBACvB,oBAAoB;wBACpB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE;AACrE;AACJ,iBAAA;;;ACnCD;;AAEG;;ACFH;;AAEG;;"}
1
+ {"version":3,"file":"ajsf-bootstrap5.mjs","sources":["../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.component.html","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-checkbox.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-checkboxes.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-radios.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5.framework.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/public_api.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.module.ts","../../../../projects/ajsf-bootstrap5/src/public_api.ts","../../../../projects/ajsf-bootstrap5/src/ajsf-bootstrap5.ts"],"sourcesContent":["import {\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnInit,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {JsonSchemaFormService, addClasses, cloneDeep, inArray} from '@ajsf/core';\n\n/**\n * Bootstrap 5 framework for Angular JSON Schema Form.\n *\n */\n@Component({\n selector: 'bootstrap-5-framework',\n templateUrl: './bootstrap5-framework.component.html',\n styleUrls: ['./bootstrap5-framework.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false\n})\nexport class Bootstrap5FrameworkComponent implements OnInit, OnChanges {\n frameworkInitialized = false;\n widgetOptions: any; // Options passed to child widget\n widgetLayoutNode: any; // layoutNode passed to child widget\n options: any; // Options used in this framework\n errorMessage: string = null;\n formControl: any = null;\n debugOutput: any = '';\n debug: any = '';\n parentArray: any = null;\n isOrderable = false;\n @Input() layoutNode: any;\n @Input() layoutIndex: number[];\n @Input() dataIndex: number[];\n\n constructor(\n public changeDetector: ChangeDetectorRef,\n public jsf: JsonSchemaFormService\n ) {\n }\n\n get isSingleCheck(): boolean {\n return this.layoutNode.type === 'checkbox' &&\n !this.options.fieldAddonLeft && !this.options.fieldAddonRight;\n }\n\n get showRemoveButton(): boolean {\n if (!this.options.removable || this.options.readonly ||\n this.layoutNode.type === '$ref'\n ) {\n return false;\n }\n if (this.layoutNode.recursiveReference) {\n return true;\n }\n if (!this.layoutNode.arrayItem || !this.parentArray) {\n return false;\n }\n // If array length <= minItems, don't allow removing any items\n return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false :\n // For removable list items, allow removing any item\n this.layoutNode.arrayItemType === 'list' ? true :\n // For removable tuple items, only allow removing last item in list\n this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2;\n }\n\n ngOnInit() {\n this.initializeFramework();\n if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') {\n this.parentArray = this.jsf.getParentNode(this);\n if (this.parentArray) {\n this.isOrderable = this.layoutNode.arrayItemType === 'list' &&\n !this.options.readonly && this.parentArray.options.orderable;\n }\n }\n }\n\n ngOnChanges() {\n if (!this.frameworkInitialized) {\n this.initializeFramework();\n }\n }\n\n initializeFramework() {\n if (this.layoutNode) {\n this.options = cloneDeep(this.layoutNode.options);\n this.widgetLayoutNode = {\n ...this.layoutNode,\n options: cloneDeep(this.layoutNode.options)\n };\n this.widgetOptions = this.widgetLayoutNode.options;\n this.formControl = this.jsf.getFormControl(this);\n\n this.options.isInputWidget = inArray(this.layoutNode.type, [\n 'button', 'checkbox', 'checkboxbuttons', 'checkboxes-inline',\n 'checkboxes', 'color',\n 'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden',\n 'image', 'integer', 'month', 'number', 'password', 'radio',\n 'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search',\n 'select', 'submit', 'tel', 'text', 'textarea', 'time', 'url', 'week'\n ]);\n\n this.options.title = this.setTitle();\n\n this.options.htmlClass =\n addClasses(this.options.htmlClass, 'schema-form-' + this.layoutNode.type);\n this.options.htmlClass =\n this.layoutNode.type === 'array' ?\n addClasses(this.options.htmlClass, 'list-group') :\n this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ?\n addClasses(this.options.htmlClass, 'list-group-item') :\n // Bootstrap 5 dropped .form-group in favour of margin utilities.\n addClasses(this.options.htmlClass, 'mb-3');\n this.widgetOptions.htmlClass = '';\n this.options.labelHtmlClass =\n addClasses(this.options.labelHtmlClass, 'form-label');\n this.widgetOptions.activeClass =\n addClasses(this.widgetOptions.activeClass, 'active');\n this.options.fieldAddonLeft =\n this.options.fieldAddonLeft || this.options.prepend;\n this.options.fieldAddonRight =\n this.options.fieldAddonRight || this.options.append;\n\n // Named types only: submit also has a null title here, and its widget\n // uses the title as an input value, where markup would render literally.\n const titled = this.layoutNode.type === 'array' || this.layoutNode.type === 'fieldset'\n ? this.widgetOptions : this.options;\n if (titled.title && this.layoutNode.type !== 'tab' &&\n !this.options.notitle && this.options.required &&\n !titled.title.includes('*')\n ) {\n titled.title += ' <strong class=\"text-danger\">*</strong>';\n }\n // Set miscelaneous styles and settings for each control type\n switch (this.layoutNode.type) {\n // Checkbox controls\n // The framework template puts [class.form-check]=\"isSingleCheck\" on\n // its own wrapper div, so the single checkbox takes .form-check from\n // there rather than from this switch.\n case 'checkbox':\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n case 'checkboxes':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n case 'checkboxes-inline':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check form-check-inline');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n // Radio controls\n case 'radio':\n case 'radios':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n case 'radios-inline':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'form-check form-check-inline');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'form-check-label');\n break;\n // Button sets - checkboxbuttons and radiobuttons\n case 'checkboxbuttons':\n case 'radiobuttons':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'btn-group');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass, 'btn');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass,\n this.options.style || 'btn-outline-primary');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'btn-check');\n break;\n // Single button controls\n case 'button':\n case 'submit':\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'btn');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-info');\n break;\n // Containers - arrays and fieldsets\n case 'array':\n case 'fieldset':\n case 'section':\n case 'conditional':\n case 'advancedfieldset':\n case 'authfieldset':\n case 'selectfieldset':\n case 'optionfieldset':\n this.options.messageLocation = 'top';\n break;\n case 'tabarray':\n case 'tabs':\n this.widgetOptions.htmlClass = addClasses(\n this.widgetOptions.htmlClass, 'tab-content');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'tab-pane');\n this.widgetOptions.labelHtmlClass = addClasses(\n this.widgetOptions.labelHtmlClass, 'nav nav-tabs');\n break;\n // 'Add' buttons - references\n case '$ref':\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'btn pull-right');\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-default');\n this.options.icon = 'glyphicon glyphicon-plus';\n break;\n // Default - including regular inputs\n default:\n this.widgetOptions.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-control');\n }\n\n if (this.formControl) {\n this.updateHelpBlock(this.formControl.status);\n // events, not statusChanges: a blur marks the control touched without changing its status.\n this.formControl.events.subscribe(() => this.updateHelpBlock(this.formControl.status));\n\n if (this.options.debug) {\n const vars: any[] = [];\n this.debugOutput = vars.map(thisVar => JSON.stringify(thisVar, null, 2)).join('\\n');\n }\n }\n this.frameworkInitialized = true;\n }\n\n }\n\n updateHelpBlock(status) {\n this.errorMessage = status === 'INVALID' &&\n this.options.enableErrorState && this.formControl.errors &&\n (this.formControl.touched || this.formControl.dirty || this.options.feedbackOnRender) ?\n this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) : null;\n this.options.helpBlock = this.errorMessage || this.options.description || this.options.help || null;\n }\n\n setTitle(): string {\n switch (this.layoutNode.type) {\n case 'button':\n case 'checkbox':\n case 'section':\n case 'help':\n case 'msg':\n case 'submit':\n case 'message':\n case 'tabarray':\n case 'tabs':\n case '$ref':\n return null;\n case 'advancedfieldset':\n this.widgetOptions.expandable = true;\n this.widgetOptions.title = 'Advanced options';\n return null;\n case 'authfieldset':\n this.widgetOptions.expandable = true;\n this.widgetOptions.title = 'Authentication settings';\n return null;\n // An array is a fieldset: the widget owns the title and renders the legend.\n case 'array':\n case 'fieldset':\n this.widgetOptions.title = this.options.title;\n return null;\n default:\n this.widgetOptions.title = null;\n return this.jsf.setItemTitle(this);\n }\n }\n\n removeItem() {\n this.jsf.removeItem(this);\n }\n}\n","<!--\nBootstrap 5 replaced the has-error and has-success wrapper classes with\nis-invalid and is-valid on the control itself, so the state classes are bound\nto the field rather than to this container.\n-->\n<div [class]=\"options?.htmlClass || ''\">\n\n @if (options?.messageLocation === 'top') {\n <div>\n @if (options?.helpBlock) {\n <p\n class=\"form-text\"\n [innerHTML]=\"$safeNavigationMigration(options?.helpBlock)\"></p>\n }\n </div>\n }\n\n @if (options?.title && layoutNode?.type !== 'tab') {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [class.visually-hidden]=\"options?.notitle\"\n [innerHTML]=\"$safeNavigationMigration(options?.title)\"></label>\n }\n @if (layoutNode?.type === 'submit' && jsf?.formOptions?.fieldsRequired) {\n <p>\n <strong class=\"text-danger\">*</strong> = required fields\n </p>\n }\n <!-- Bootstrap reveals .invalid-feedback only after the element carrying\n .is-invalid, so the marker belongs on this row, not on the control. -->\n <div\n [class.d-flex]=\"showRemoveButton\"\n [class.align-items-center]=\"showRemoveButton && options?.isInputWidget\"\n [class.align-items-start]=\"showRemoveButton && !options?.isInputWidget\"\n [class.is-invalid]=\"!!errorMessage\">\n <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\n [class.flex-grow-1]=\"showRemoveButton\"\n >\n @if (options?.fieldAddonLeft) {\n <div class=\"input-group-prepend\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonLeft)\"></span>\n </div>\n }\n\n <select-widget-widget\n [layoutNode]=\"widgetLayoutNode\"\n [dataIndex]=\"dataIndex\"\n [layoutIndex]=\"layoutIndex\"></select-widget-widget>\n\n @if (options?.fieldAddonRight) {\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" [innerHTML]=\"$safeNavigationMigration(options?.fieldAddonRight)\"></span>\n </div>\n }\n </div>\n\n @if (showRemoveButton) {\n <button\n class=\"ms-2 btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n }\n </div>\n\n @if (errorMessage && options.messageLocation !== 'top') {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"errorMessage\"></div>\n }\n\n <!--\n description || help is the order updateHelpBlock uses for options.helpBlock,\n which this block replaced. Reading description alone lost help entirely.\n The messageLocation guard mirrors the paragraph above: containers set it\n to 'top', and without it the same text renders in both places.\n -->\n @if ((options?.description || options?.help) &&\n options?.messageLocation !== 'top' && !errorMessage) {\n <div\n class=\"form-text text-muted\"\n [innerHTML]=\"options?.description || options?.help\"></div>\n }\n</div>\n\n@if (debug && debugOutput) {\n <div>debug:\n <pre>{{debugOutput}}</pre>\n </div>\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CheckboxComponent } from '@ajsf/core';\n\n/**\n * Bootstrap 5 wants the input and label as siblings inside .form-check.\n */\n@Component({\n selector: 'bootstrap5-checkbox-widget',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false,\n template: `\n <div [class]=\"options?.htmlClass || ''\">\n @if (boundControl) {\n <input\n [formControl]=\"formControl\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [class]=\"(options?.fieldHtmlClass || '') + (isChecked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [id]=\"'control' + layoutNode?._id\"\n [name]=\"controlName\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n type=\"checkbox\">\n }\n @if (!boundControl) {\n <input\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [checked]=\"isChecked ? 'checked' : null\"\n [class]=\"(options?.fieldHtmlClass || '') + (isChecked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id\"\n [name]=\"controlName\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"controlValue\"\n type=\"checkbox\"\n (change)=\"updateValue($event)\">\n }\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.itemLabelHtmlClass || ''\">\n @if (options?.title) {\n <span\n [style.display]=\"options?.notitle ? 'none' : ''\"\n [innerHTML]=\"options?.title\"></span>\n }\n </label>\n </div>`,\n})\nexport class Bootstrap5CheckboxComponent extends CheckboxComponent {}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CheckboxesComponent } from '@ajsf/core';\n\n/**\n * Siblings throughout: Bootstrap 5 button sets use .btn-check, which is a\n * sibling input too.\n */\n@Component({\n selector: 'bootstrap5-checkboxes-widget',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false,\n template: `\n @if (options?.title) {\n <label\n [class]=\"options?.labelHtmlClass || ''\"\n [style.display]=\"options?.notitle ? 'none' : ''\"\n [innerHTML]=\"options?.title\"></label>\n }\n\n @if (layoutOrientation === 'horizontal') {\n @if (layoutNode?.type === 'checkboxbuttons') {\n <div [class]=\"options?.htmlClass || ''\">\n @for (checkboxItem of checkboxList; track checkboxItem) {\n <input type=\"checkbox\"\n [attr.required]=\"options?.required\"\n [checked]=\"checkboxItem.checked\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [name]=\"checkboxItem?.name\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"checkboxItem.value\"\n (change)=\"updateValue($event, checkboxItem)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"checkboxItem.name\"></label>\n }\n </div>\n } @else {\n <div>\n @for (checkboxItem of checkboxList; track checkboxItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"checkbox\"\n [attr.required]=\"options?.required\"\n [checked]=\"checkboxItem.checked\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [name]=\"checkboxItem?.name\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"checkboxItem.value\"\n (change)=\"updateValue($event, checkboxItem)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"checkboxItem.name\"></label>\n </div>\n }\n </div>\n }\n }\n\n @if (layoutOrientation === 'vertical') {\n <div>\n @for (checkboxItem of checkboxList; track checkboxItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"checkbox\"\n [attr.required]=\"options?.required\"\n [checked]=\"checkboxItem.checked\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [name]=\"checkboxItem?.name\"\n [readonly]=\"options?.readonly ? 'readonly' : null\"\n [value]=\"checkboxItem.value\"\n (change)=\"updateValue($event, checkboxItem)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + checkboxItem.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"checkboxItem.name\"></label>\n </div>\n }\n </div>\n }`,\n})\nexport class Bootstrap5CheckboxesComponent extends CheckboxesComponent {}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { RadiosComponent } from '@ajsf/core';\n\n/**\n * Siblings throughout: Bootstrap 5 button sets use .btn-check, which is a\n * sibling input too.\n */\n@Component({\n selector: 'bootstrap5-radios-widget',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false,\n template: `\n @if (options?.title) {\n <label\n [attr.for]=\"'control' + layoutNode?._id\"\n [class]=\"options?.labelHtmlClass || ''\"\n [style.display]=\"options?.notitle ? 'none' : ''\"\n [innerHTML]=\"options?.title\"></label>\n }\n\n @if (layoutOrientation === 'horizontal') {\n @if (layoutNode?.type === 'radiobuttons') {\n <div [class]=\"options?.htmlClass || ''\">\n @for (radioItem of radiosList; track radioItem) {\n <input type=\"radio\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [attr.readonly]=\"options?.readonly ? 'readonly' : null\"\n [attr.required]=\"options?.required\"\n [checked]=\"radioItem?.value === controlValue\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [name]=\"controlName\"\n [value]=\"radioItem?.value\"\n (change)=\"updateValue($event)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') +\n ((controlValue + '' === radioItem?.value + '') ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"radioItem?.name\"></label>\n }\n </div>\n } @else {\n <div>\n @for (radioItem of radiosList; track radioItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"radio\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [attr.readonly]=\"options?.readonly ? 'readonly' : null\"\n [attr.required]=\"options?.required\"\n [checked]=\"radioItem?.value === controlValue\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [name]=\"controlName\"\n [value]=\"radioItem?.value\"\n (change)=\"updateValue($event)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') +\n ((controlValue + '' === radioItem?.value + '') ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"radioItem?.name\"></label>\n </div>\n }\n </div>\n }\n }\n\n @if (layoutOrientation !== 'horizontal') {\n <div>\n @for (radioItem of radiosList; track radioItem) {\n <div [class]=\"options?.htmlClass || ''\">\n <input type=\"radio\"\n [attr.aria-describedby]=\"'control' + layoutNode?._id + 'Status'\"\n [attr.readonly]=\"options?.readonly ? 'readonly' : null\"\n [attr.required]=\"options?.required\"\n [checked]=\"radioItem?.value === controlValue\"\n [class]=\"options?.fieldHtmlClass || ''\"\n [disabled]=\"controlDisabled\"\n [id]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [name]=\"controlName\"\n [value]=\"radioItem?.value\"\n (change)=\"updateValue($event)\">\n <label\n [attr.for]=\"'control' + layoutNode?._id + '/' + radioItem?.value\"\n [class]=\"(options?.itemLabelHtmlClass || '') +\n ((controlValue + '' === radioItem?.value + '') ?\n (' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :\n (' ' + (options?.style?.unselected || '')))\"\n [innerHTML]=\"radioItem?.name\"></label>\n </div>\n }\n </div>\n }`,\n})\nexport class Bootstrap5RadiosComponent extends RadiosComponent {}\n","import {Injectable} from '@angular/core';\nimport {Framework} from '@ajsf/core';\nimport {Bootstrap5FrameworkComponent} from './bootstrap5-framework.component';\nimport {Bootstrap5CheckboxComponent} from './widgets/bootstrap5-checkbox.component';\nimport {Bootstrap5CheckboxesComponent} from './widgets/bootstrap5-checkboxes.component';\nimport {Bootstrap5RadiosComponent} from './widgets/bootstrap5-radios.component';\n\n// Bootstrap 5 Framework\n// https://github.com/ng-bootstrap/ng-bootstrap\n\n@Injectable()\nexport class Bootstrap5Framework extends Framework {\n name = 'bootstrap-5';\n\n framework = Bootstrap5FrameworkComponent;\n\n widgets = {\n 'checkbox': Bootstrap5CheckboxComponent,\n 'checkboxes': Bootstrap5CheckboxesComponent,\n 'radios': Bootstrap5RadiosComponent,\n };\n\n stylesheets = [\n '//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css'\n ];\n\n // Bootstrap 5 dropped jQuery, and the bundle build already contains Popper,\n // so this is one script where Bootstrap 4 needed three.\n scripts = [\n '//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js',\n ];\n}\n","import { Bootstrap5CheckboxComponent } from './bootstrap5-checkbox.component';\nimport { Bootstrap5CheckboxesComponent } from './bootstrap5-checkboxes.component';\nimport { Bootstrap5RadiosComponent } from './bootstrap5-radios.component';\n\nexport { Bootstrap5CheckboxComponent } from './bootstrap5-checkbox.component';\nexport { Bootstrap5CheckboxesComponent } from './bootstrap5-checkboxes.component';\nexport { Bootstrap5RadiosComponent } from './bootstrap5-radios.component';\n\nexport const BOOTSTRAP5_FRAMEWORK_COMPONENTS = [\n Bootstrap5CheckboxComponent,\n Bootstrap5CheckboxesComponent,\n Bootstrap5RadiosComponent,\n];\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {\n Framework,\n JsonSchemaFormService,\n WidgetLibraryService,\n FrameworkLibraryService,\n JsonSchemaFormModule,\n WidgetLibraryModule\n} from '@ajsf/core';\nimport {Bootstrap5Framework} from './bootstrap5.framework';\nimport {Bootstrap5FrameworkComponent} from './bootstrap5-framework.component';\nimport {BOOTSTRAP5_FRAMEWORK_COMPONENTS} from './widgets/public_api';\n\n@NgModule({\n imports: [\n JsonSchemaFormModule,\n CommonModule,\n ReactiveFormsModule,\n WidgetLibraryModule,\n ],\n declarations: [\n Bootstrap5FrameworkComponent,\n ...BOOTSTRAP5_FRAMEWORK_COMPONENTS,\n ],\n exports: [\n JsonSchemaFormModule,\n Bootstrap5FrameworkComponent,\n ...BOOTSTRAP5_FRAMEWORK_COMPONENTS,\n ],\n providers: [\n JsonSchemaFormService,\n FrameworkLibraryService,\n WidgetLibraryService,\n { provide: Framework, useClass: Bootstrap5Framework, multi: true },\n ]\n})\nexport class Bootstrap5FrameworkModule {\n}\n","/**\n * @module \\@ajsf/bootstrap5\n */\n\nexport * from './lib/bootstrap5-framework.module';\nexport * from './lib/bootstrap5-framework.component';\nexport * from './lib/bootstrap5.framework';\nexport * from './lib/widgets/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i1.Bootstrap5CheckboxComponent","i2.Bootstrap5CheckboxesComponent","i3.Bootstrap5RadiosComponent"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ajsf/bootstrap5",
3
- "version": "22.2.1",
3
+ "version": "22.3.0",
4
4
  "description": "Angular JSON Schema Form builder using Bootstrap 5 UI",
5
5
  "author": "https://github.com/hamzahamidi/ajsf/graphs/contributors",
6
6
  "keywords": [
@@ -29,7 +29,7 @@
29
29
  "funding": "https://github.com/sponsors/hamzahamidi",
30
30
  "private": false,
31
31
  "dependencies": {
32
- "@ajsf/core": "^22.2.1",
32
+ "@ajsf/core": "^22.3.0",
33
33
  "tslib": "^2.0.0"
34
34
  },
35
35
  "peerDependencies": {
@@ -3,6 +3,7 @@ import { OnInit, OnChanges, ChangeDetectorRef } from '@angular/core';
3
3
  import * as i5 from '@ajsf/core';
4
4
  import { JsonSchemaFormService, CheckboxComponent, CheckboxesComponent, RadiosComponent, Framework } from '@ajsf/core';
5
5
  import * as i6 from '@angular/common';
6
+ import * as i7 from '@angular/forms';
6
7
 
7
8
  /**
8
9
  * Bootstrap 5 framework for Angular JSON Schema Form.
@@ -15,6 +16,7 @@ declare class Bootstrap5FrameworkComponent implements OnInit, OnChanges {
15
16
  widgetOptions: any;
16
17
  widgetLayoutNode: any;
17
18
  options: any;
19
+ errorMessage: string;
18
20
  formControl: any;
19
21
  debugOutput: any;
20
22
  debug: any;
@@ -64,7 +66,7 @@ declare class Bootstrap5RadiosComponent extends RadiosComponent {
64
66
 
65
67
  declare class Bootstrap5FrameworkModule {
66
68
  static ɵfac: i0.ɵɵFactoryDeclaration<Bootstrap5FrameworkModule, never>;
67
- static ɵmod: i0.ɵɵNgModuleDeclaration<Bootstrap5FrameworkModule, [typeof Bootstrap5FrameworkComponent, typeof Bootstrap5CheckboxComponent, typeof Bootstrap5CheckboxesComponent, typeof Bootstrap5RadiosComponent], [typeof i5.JsonSchemaFormModule, typeof i6.CommonModule, typeof i5.WidgetLibraryModule], [typeof i5.JsonSchemaFormModule, typeof Bootstrap5FrameworkComponent, typeof Bootstrap5CheckboxComponent, typeof Bootstrap5CheckboxesComponent, typeof Bootstrap5RadiosComponent]>;
69
+ static ɵmod: i0.ɵɵNgModuleDeclaration<Bootstrap5FrameworkModule, [typeof Bootstrap5FrameworkComponent, typeof Bootstrap5CheckboxComponent, typeof Bootstrap5CheckboxesComponent, typeof Bootstrap5RadiosComponent], [typeof i5.JsonSchemaFormModule, typeof i6.CommonModule, typeof i7.ReactiveFormsModule, typeof i5.WidgetLibraryModule], [typeof i5.JsonSchemaFormModule, typeof Bootstrap5FrameworkComponent, typeof Bootstrap5CheckboxComponent, typeof Bootstrap5CheckboxesComponent, typeof Bootstrap5RadiosComponent]>;
68
70
  static ɵinj: i0.ɵɵInjectorDeclaration<Bootstrap5FrameworkModule>;
69
71
  }
70
72