@ajsf/bootstrap5 22.2.1 → 22.3.1
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 +40 -42
- package/fesm2022/ajsf-bootstrap5.mjs +14 -7
- package/fesm2022/ajsf-bootstrap5.mjs.map +1 -1
- package/package.json +2 -2
- package/types/ajsf-bootstrap5.d.ts +3 -1
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@
|
|
10
|
+
npm install @ajsf/bootstrap5 bootstrap@5
|
|
7
11
|
```
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
Add Bootstrap's stylesheet to the `styles` of the build target in `angular.json`:
|
|
10
14
|
|
|
11
|
-
```
|
|
12
|
-
|
|
15
|
+
```json
|
|
16
|
+
"styles": [
|
|
17
|
+
"node_modules/bootstrap/dist/css/bootstrap.min.css",
|
|
18
|
+
"src/styles.css"
|
|
19
|
+
]
|
|
13
20
|
```
|
|
14
21
|
|
|
15
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
[schema]="yourJsonSchema"
|
|
55
|
+
[schema]="schema"
|
|
42
56
|
framework="bootstrap-5"
|
|
43
|
-
(onSubmit)="
|
|
57
|
+
(onSubmit)="onSubmit($event)">
|
|
44
58
|
</json-schema-form>
|
|
45
59
|
```
|
|
46
60
|
|
|
47
|
-
|
|
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
|
-
`
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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]=\"!!
|
|
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\">×</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]=\"!!
|
|
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\">×</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\">×</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":"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"}
|
|
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\">×</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.
|
|
3
|
+
"version": "22.3.1",
|
|
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.
|
|
32
|
+
"@ajsf/core": "^22.3.1",
|
|
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
|
|