@ajsf/bootstrap5 22.0.0 → 22.2.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 +51 -0
- package/fesm2022/ajsf-bootstrap5.mjs +525 -16
- package/fesm2022/ajsf-bootstrap5.mjs.map +1 -1
- package/package.json +3 -3
- package/types/ajsf-bootstrap5.d.ts +60 -5
package/README.md
CHANGED
|
@@ -53,6 +53,57 @@ Where `schema` is a valid JSON schema object, and `onSubmit` calls a function to
|
|
|
53
53
|
* `bootstrap-5` for 'Bootstrap 5.
|
|
54
54
|
* `no-framework` for (plain HTML).
|
|
55
55
|
|
|
56
|
+
## Checkbox and radio structure, changed in 22.1.0
|
|
57
|
+
|
|
58
|
+
Checkboxes and radios previously rendered the `<input>` inside its `<label>`,
|
|
59
|
+
which is the Bootstrap 3 shape this package was copied from. They now render
|
|
60
|
+
as siblings inside a `.form-check` wrapper, which is what Bootstrap 5
|
|
61
|
+
documents and what its state styling requires:
|
|
62
|
+
|
|
63
|
+
<div class="form-check">
|
|
64
|
+
<input class="form-check-input" id="control1" type="checkbox">
|
|
65
|
+
<label class="form-check-label" for="control1">Accept</label>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
Every variant takes this sibling shape, including toggle buttons
|
|
69
|
+
(`checkboxbuttons`, `radiobuttons`) and the inline forms (`checkboxes-inline`,
|
|
70
|
+
`radios-inline`), because Bootstrap 5 styles its `.btn-check` toggle buttons
|
|
71
|
+
through a sibling input too, unlike Bootstrap 4's nested `.btn-group-toggle`.
|
|
72
|
+
|
|
73
|
+
If you wrote CSS selecting `label > input` or styling the label as the
|
|
74
|
+
control's ancestor, that is where the difference is.
|
|
75
|
+
|
|
76
|
+
## Array row layout, changed in 22.2.0
|
|
77
|
+
|
|
78
|
+
The remove button on an array item used to be the first child of the field
|
|
79
|
+
wrapper and floated, so it left normal flow and sat at the top of the row
|
|
80
|
+
rather than beside the control. It now shares a flex row with the field. Beside
|
|
81
|
+
a single control it aligns to that control's centre; when the item is a group
|
|
82
|
+
of fields it anchors at the group's top edge, because a group's midpoint moves
|
|
83
|
+
as its contents grow.
|
|
84
|
+
|
|
85
|
+
Two details matter if you have written CSS against the old output. Every field
|
|
86
|
+
gains one wrapper element between the outer `form-group` container and the field
|
|
87
|
+
itself, and that wrapper becomes a flex container only on a removable array
|
|
88
|
+
item. The invalid marker moved onto that wrapper, so a selector written as
|
|
89
|
+
`.input-group.is-invalid` no longer matches; the marker is now on the
|
|
90
|
+
element directly above it.
|
|
91
|
+
|
|
92
|
+
## Array titles, changed in 22.2.0
|
|
93
|
+
|
|
94
|
+
An array rendered its title twice: once as the field label, and again as the
|
|
95
|
+
fieldset legend, which the widget rebuilt from the raw property name. A
|
|
96
|
+
`phone_numbers` property showed "Phone Numbers" followed by "Phone_numbers".
|
|
97
|
+
|
|
98
|
+
The title now belongs to the widget, as it already did for a fieldset, so it
|
|
99
|
+
renders once, on the `<legend>` that names the group, in the normalised
|
|
100
|
+
spelling. If your CSS targets the array label through `labelHtmlClass`, it now
|
|
101
|
+
applies to the legend.
|
|
102
|
+
|
|
103
|
+
The required marker moves with the title. It was previously appended only to
|
|
104
|
+
the framework's own label, so a required fieldset, whose title the widget
|
|
105
|
+
already owned, rendered no asterisk at all; it now does.
|
|
106
|
+
|
|
56
107
|
## Code scaffolding
|
|
57
108
|
|
|
58
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`.
|
|
@@ -2,7 +2,7 @@ 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
4
|
import * as i1 from '@ajsf/core';
|
|
5
|
-
import { cloneDeep, inArray, addClasses, Framework, JsonSchemaFormModule, WidgetLibraryModule, JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService } from '@ajsf/core';
|
|
5
|
+
import { cloneDeep, inArray, addClasses, CheckboxComponent, CheckboxesComponent, RadiosComponent, Framework, JsonSchemaFormModule, WidgetLibraryModule, JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService } from '@ajsf/core';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Bootstrap 5 framework for Angular JSON Schema Form.
|
|
@@ -66,7 +66,8 @@ class Bootstrap5FrameworkComponent {
|
|
|
66
66
|
this.widgetOptions = this.widgetLayoutNode.options;
|
|
67
67
|
this.formControl = this.jsf.getFormControl(this);
|
|
68
68
|
this.options.isInputWidget = inArray(this.layoutNode.type, [
|
|
69
|
-
'button', 'checkbox', '
|
|
69
|
+
'button', 'checkbox', 'checkboxbuttons', 'checkboxes-inline',
|
|
70
|
+
'checkboxes', 'color',
|
|
70
71
|
'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden',
|
|
71
72
|
'image', 'integer', 'month', 'number', 'password', 'radio',
|
|
72
73
|
'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search',
|
|
@@ -91,17 +92,24 @@ class Bootstrap5FrameworkComponent {
|
|
|
91
92
|
this.options.fieldAddonLeft || this.options.prepend;
|
|
92
93
|
this.options.fieldAddonRight =
|
|
93
94
|
this.options.fieldAddonRight || this.options.append;
|
|
94
|
-
// Add asterisk to titles if required
|
|
95
|
-
|
|
95
|
+
// Add asterisk to titles if required. setTitle hands the title to the
|
|
96
|
+
// widget for an array or a fieldset and leaves none here, so the marker
|
|
97
|
+
// follows it. Named types only: setTitle also returns null for submit,
|
|
98
|
+
// whose widget uses the title as an input value rather than as HTML, so
|
|
99
|
+
// markup appended there would render literally.
|
|
100
|
+
const titled = this.layoutNode.type === 'array' || this.layoutNode.type === 'fieldset'
|
|
101
|
+
? this.widgetOptions : this.options;
|
|
102
|
+
if (titled.title && this.layoutNode.type !== 'tab' &&
|
|
96
103
|
!this.options.notitle && this.options.required &&
|
|
97
|
-
!
|
|
98
|
-
|
|
104
|
+
!titled.title.includes('*')) {
|
|
105
|
+
titled.title += ' <strong class="text-danger">*</strong>';
|
|
99
106
|
}
|
|
100
107
|
// Set miscelaneous styles and settings for each control type
|
|
101
108
|
switch (this.layoutNode.type) {
|
|
102
109
|
// Checkbox controls
|
|
103
|
-
//
|
|
104
|
-
// single checkbox takes .form-check from
|
|
110
|
+
// The framework template puts [class.form-check]="isSingleCheck" on
|
|
111
|
+
// its own wrapper div, so the single checkbox takes .form-check from
|
|
112
|
+
// there rather than from this switch.
|
|
105
113
|
case 'checkbox':
|
|
106
114
|
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'form-check-input');
|
|
107
115
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
@@ -112,8 +120,9 @@ class Bootstrap5FrameworkComponent {
|
|
|
112
120
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
113
121
|
break;
|
|
114
122
|
case 'checkboxes-inline':
|
|
123
|
+
this.widgetOptions.htmlClass = addClasses(this.widgetOptions.htmlClass, 'form-check form-check-inline');
|
|
115
124
|
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'form-check-input');
|
|
116
|
-
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check
|
|
125
|
+
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
117
126
|
break;
|
|
118
127
|
// Radio controls
|
|
119
128
|
case 'radio':
|
|
@@ -123,8 +132,9 @@ class Bootstrap5FrameworkComponent {
|
|
|
123
132
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
124
133
|
break;
|
|
125
134
|
case 'radios-inline':
|
|
135
|
+
this.widgetOptions.htmlClass = addClasses(this.widgetOptions.htmlClass, 'form-check form-check-inline');
|
|
126
136
|
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'form-check-input');
|
|
127
|
-
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check
|
|
137
|
+
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
128
138
|
break;
|
|
129
139
|
// Button sets - checkboxbuttons and radiobuttons
|
|
130
140
|
case 'checkboxbuttons':
|
|
@@ -132,7 +142,7 @@ class Bootstrap5FrameworkComponent {
|
|
|
132
142
|
this.widgetOptions.htmlClass = addClasses(this.widgetOptions.htmlClass, 'btn-group');
|
|
133
143
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'btn');
|
|
134
144
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, this.options.style || 'btn-outline-primary');
|
|
135
|
-
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, '
|
|
145
|
+
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'btn-check');
|
|
136
146
|
break;
|
|
137
147
|
// Single button controls
|
|
138
148
|
case 'button':
|
|
@@ -206,6 +216,11 @@ class Bootstrap5FrameworkComponent {
|
|
|
206
216
|
this.widgetOptions.expandable = true;
|
|
207
217
|
this.widgetOptions.title = 'Authentication settings';
|
|
208
218
|
return null;
|
|
219
|
+
// An array is a fieldset too: its title belongs to the widget, which
|
|
220
|
+
// renders it as the legend naming the group. Leaving it to the default
|
|
221
|
+
// branch blanked it here and had the widget rebuild one from the raw
|
|
222
|
+
// property name, so the title appeared twice and in two spellings.
|
|
223
|
+
case 'array':
|
|
209
224
|
case 'fieldset':
|
|
210
225
|
this.widgetOptions.title = this.options.title;
|
|
211
226
|
return null;
|
|
@@ -218,11 +233,11 @@ class Bootstrap5FrameworkComponent {
|
|
|
218
233
|
this.jsf.removeItem(this);
|
|
219
234
|
}
|
|
220
235
|
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 }); }
|
|
221
|
-
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 (
|
|
236
|
+
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 <!--\n is-invalid sits on this row rather than on the field inside it, because\n Bootstrap reveals .invalid-feedback only as a following sibling of the\n element carrying .is-invalid, and the message below is this row's sibling.\n The row is a flex container only for a removable array item, which is also\n what stops the button's float taking it out of normal flow.\n -->\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", 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 }); }
|
|
222
237
|
}
|
|
223
238
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkComponent, decorators: [{
|
|
224
239
|
type: Component,
|
|
225
|
-
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 (
|
|
240
|
+
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 <!--\n is-invalid sits on this row rather than on the field inside it, because\n Bootstrap reveals .invalid-feedback only as a following sibling of the\n element carrying .is-invalid, and the message below is this row's sibling.\n The row is a flex container only for a removable array item, which is also\n what stops the button's float taking it out of normal flow.\n -->\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", styles: [":host ::ng-deep .list-group-item .form-control-feedback{top:40px}:host ::ng-deep .ng-invalid.ng-touched{border:1px solid #f44336}\n"] }]
|
|
226
241
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.JsonSchemaFormService }], propDecorators: { layoutNode: [{
|
|
227
242
|
type: Input
|
|
228
243
|
}], layoutIndex: [{
|
|
@@ -231,6 +246,487 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
231
246
|
type: Input
|
|
232
247
|
}] } });
|
|
233
248
|
|
|
249
|
+
/**
|
|
250
|
+
* Bootstrap 5 wants the input and label as siblings inside .form-check, and
|
|
251
|
+
* styles the input's state through sibling selectors. The core widget nests
|
|
252
|
+
* the input inside the label, which is the Bootstrap 3 shape.
|
|
253
|
+
*
|
|
254
|
+
* Template only. No constructor: Angular inherits the base's injection
|
|
255
|
+
* through its generated factory, and adding one would break that.
|
|
256
|
+
*/
|
|
257
|
+
class Bootstrap5CheckboxComponent extends CheckboxComponent {
|
|
258
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
259
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Bootstrap5CheckboxComponent, isStandalone: false, selector: "bootstrap5-checkbox-widget", usesInheritance: true, ngImport: i0, template: `
|
|
260
|
+
<div [class]="options?.htmlClass || ''">
|
|
261
|
+
@if (boundControl) {
|
|
262
|
+
<input
|
|
263
|
+
[formControl]="formControl"
|
|
264
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
265
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
266
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
267
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
268
|
+
[id]="'control' + layoutNode?._id"
|
|
269
|
+
[name]="controlName"
|
|
270
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
271
|
+
type="checkbox">
|
|
272
|
+
}
|
|
273
|
+
@if (!boundControl) {
|
|
274
|
+
<input
|
|
275
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
276
|
+
[checked]="isChecked ? 'checked' : null"
|
|
277
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
278
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
279
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
280
|
+
[disabled]="controlDisabled"
|
|
281
|
+
[id]="'control' + layoutNode?._id"
|
|
282
|
+
[name]="controlName"
|
|
283
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
284
|
+
[value]="controlValue"
|
|
285
|
+
type="checkbox"
|
|
286
|
+
(change)="updateValue($event)">
|
|
287
|
+
}
|
|
288
|
+
<label
|
|
289
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
290
|
+
[class]="options?.itemLabelHtmlClass || ''">
|
|
291
|
+
@if (options?.title) {
|
|
292
|
+
<span
|
|
293
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
294
|
+
[innerHTML]="options?.title"></span>
|
|
295
|
+
}
|
|
296
|
+
</label>
|
|
297
|
+
</div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
298
|
+
}
|
|
299
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxComponent, decorators: [{
|
|
300
|
+
type: Component,
|
|
301
|
+
args: [{
|
|
302
|
+
selector: 'bootstrap5-checkbox-widget',
|
|
303
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
304
|
+
standalone: false,
|
|
305
|
+
template: `
|
|
306
|
+
<div [class]="options?.htmlClass || ''">
|
|
307
|
+
@if (boundControl) {
|
|
308
|
+
<input
|
|
309
|
+
[formControl]="formControl"
|
|
310
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
311
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
312
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
313
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
314
|
+
[id]="'control' + layoutNode?._id"
|
|
315
|
+
[name]="controlName"
|
|
316
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
317
|
+
type="checkbox">
|
|
318
|
+
}
|
|
319
|
+
@if (!boundControl) {
|
|
320
|
+
<input
|
|
321
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
322
|
+
[checked]="isChecked ? 'checked' : null"
|
|
323
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
324
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
325
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
326
|
+
[disabled]="controlDisabled"
|
|
327
|
+
[id]="'control' + layoutNode?._id"
|
|
328
|
+
[name]="controlName"
|
|
329
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
330
|
+
[value]="controlValue"
|
|
331
|
+
type="checkbox"
|
|
332
|
+
(change)="updateValue($event)">
|
|
333
|
+
}
|
|
334
|
+
<label
|
|
335
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
336
|
+
[class]="options?.itemLabelHtmlClass || ''">
|
|
337
|
+
@if (options?.title) {
|
|
338
|
+
<span
|
|
339
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
340
|
+
[innerHTML]="options?.title"></span>
|
|
341
|
+
}
|
|
342
|
+
</label>
|
|
343
|
+
</div>`,
|
|
344
|
+
}]
|
|
345
|
+
}] });
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Sibling input and label per item, for checkboxes, checkboxes-inline and
|
|
349
|
+
* checkboxbuttons alike. The horizontal branch splits on layoutNode.type:
|
|
350
|
+
* checkboxbuttons keeps the one shared wrapper, because btn-group belongs on
|
|
351
|
+
* a single element around the whole set and Bootstrap 5's btn-check idiom is
|
|
352
|
+
* a sibling input there too. checkboxes-inline gives each item its own
|
|
353
|
+
* wrapper, because Bootstrap 5 documents one .form-check.form-check-inline
|
|
354
|
+
* per item, not one around the whole set.
|
|
355
|
+
*
|
|
356
|
+
* activeClass and style.selected stay on the label, where the core widget
|
|
357
|
+
* puts them, so the button idiom keeps working.
|
|
358
|
+
*
|
|
359
|
+
* Template only. No constructor.
|
|
360
|
+
*/
|
|
361
|
+
class Bootstrap5CheckboxesComponent extends CheckboxesComponent {
|
|
362
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
363
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Bootstrap5CheckboxesComponent, isStandalone: false, selector: "bootstrap5-checkboxes-widget", usesInheritance: true, ngImport: i0, template: `
|
|
364
|
+
@if (options?.title) {
|
|
365
|
+
<label
|
|
366
|
+
[class]="options?.labelHtmlClass || ''"
|
|
367
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
368
|
+
[innerHTML]="options?.title"></label>
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
@if (layoutOrientation === 'horizontal') {
|
|
372
|
+
@if (layoutNode?.type === 'checkboxbuttons') {
|
|
373
|
+
<div [class]="options?.htmlClass || ''">
|
|
374
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
375
|
+
<input type="checkbox"
|
|
376
|
+
[attr.required]="options?.required"
|
|
377
|
+
[checked]="checkboxItem.checked"
|
|
378
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
379
|
+
[disabled]="controlDisabled"
|
|
380
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
381
|
+
[name]="checkboxItem?.name"
|
|
382
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
383
|
+
[value]="checkboxItem.value"
|
|
384
|
+
(change)="updateValue($event, checkboxItem)">
|
|
385
|
+
<label
|
|
386
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
387
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
388
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
389
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
390
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
391
|
+
}
|
|
392
|
+
</div>
|
|
393
|
+
} @else {
|
|
394
|
+
<div>
|
|
395
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
396
|
+
<div [class]="options?.htmlClass || ''">
|
|
397
|
+
<input type="checkbox"
|
|
398
|
+
[attr.required]="options?.required"
|
|
399
|
+
[checked]="checkboxItem.checked"
|
|
400
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
401
|
+
[disabled]="controlDisabled"
|
|
402
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
403
|
+
[name]="checkboxItem?.name"
|
|
404
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
405
|
+
[value]="checkboxItem.value"
|
|
406
|
+
(change)="updateValue($event, checkboxItem)">
|
|
407
|
+
<label
|
|
408
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
409
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
410
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
411
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
412
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
413
|
+
</div>
|
|
414
|
+
}
|
|
415
|
+
</div>
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
@if (layoutOrientation === 'vertical') {
|
|
420
|
+
<div>
|
|
421
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
422
|
+
<div [class]="options?.htmlClass || ''">
|
|
423
|
+
<input type="checkbox"
|
|
424
|
+
[attr.required]="options?.required"
|
|
425
|
+
[checked]="checkboxItem.checked"
|
|
426
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
427
|
+
[disabled]="controlDisabled"
|
|
428
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
429
|
+
[name]="checkboxItem?.name"
|
|
430
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
431
|
+
[value]="checkboxItem.value"
|
|
432
|
+
(change)="updateValue($event, checkboxItem)">
|
|
433
|
+
<label
|
|
434
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
435
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
436
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
437
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
438
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
439
|
+
</div>
|
|
440
|
+
}
|
|
441
|
+
</div>
|
|
442
|
+
}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
443
|
+
}
|
|
444
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxesComponent, decorators: [{
|
|
445
|
+
type: Component,
|
|
446
|
+
args: [{
|
|
447
|
+
selector: 'bootstrap5-checkboxes-widget',
|
|
448
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
449
|
+
standalone: false,
|
|
450
|
+
template: `
|
|
451
|
+
@if (options?.title) {
|
|
452
|
+
<label
|
|
453
|
+
[class]="options?.labelHtmlClass || ''"
|
|
454
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
455
|
+
[innerHTML]="options?.title"></label>
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
@if (layoutOrientation === 'horizontal') {
|
|
459
|
+
@if (layoutNode?.type === 'checkboxbuttons') {
|
|
460
|
+
<div [class]="options?.htmlClass || ''">
|
|
461
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
462
|
+
<input type="checkbox"
|
|
463
|
+
[attr.required]="options?.required"
|
|
464
|
+
[checked]="checkboxItem.checked"
|
|
465
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
466
|
+
[disabled]="controlDisabled"
|
|
467
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
468
|
+
[name]="checkboxItem?.name"
|
|
469
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
470
|
+
[value]="checkboxItem.value"
|
|
471
|
+
(change)="updateValue($event, checkboxItem)">
|
|
472
|
+
<label
|
|
473
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
474
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
475
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
476
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
477
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
478
|
+
}
|
|
479
|
+
</div>
|
|
480
|
+
} @else {
|
|
481
|
+
<div>
|
|
482
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
483
|
+
<div [class]="options?.htmlClass || ''">
|
|
484
|
+
<input type="checkbox"
|
|
485
|
+
[attr.required]="options?.required"
|
|
486
|
+
[checked]="checkboxItem.checked"
|
|
487
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
488
|
+
[disabled]="controlDisabled"
|
|
489
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
490
|
+
[name]="checkboxItem?.name"
|
|
491
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
492
|
+
[value]="checkboxItem.value"
|
|
493
|
+
(change)="updateValue($event, checkboxItem)">
|
|
494
|
+
<label
|
|
495
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
496
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
497
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
498
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
499
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
500
|
+
</div>
|
|
501
|
+
}
|
|
502
|
+
</div>
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
@if (layoutOrientation === 'vertical') {
|
|
507
|
+
<div>
|
|
508
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
509
|
+
<div [class]="options?.htmlClass || ''">
|
|
510
|
+
<input type="checkbox"
|
|
511
|
+
[attr.required]="options?.required"
|
|
512
|
+
[checked]="checkboxItem.checked"
|
|
513
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
514
|
+
[disabled]="controlDisabled"
|
|
515
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
516
|
+
[name]="checkboxItem?.name"
|
|
517
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
518
|
+
[value]="checkboxItem.value"
|
|
519
|
+
(change)="updateValue($event, checkboxItem)">
|
|
520
|
+
<label
|
|
521
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
522
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
523
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
524
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
525
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
526
|
+
</div>
|
|
527
|
+
}
|
|
528
|
+
</div>
|
|
529
|
+
}`,
|
|
530
|
+
}]
|
|
531
|
+
}] });
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Sibling input and label per item, for radios, radios-inline and
|
|
535
|
+
* radiobuttons alike. The horizontal branch splits on layoutNode.type:
|
|
536
|
+
* radiobuttons keeps the one shared wrapper, because btn-group belongs on a
|
|
537
|
+
* single element around the whole set and Bootstrap 5's btn-check idiom is a
|
|
538
|
+
* sibling input there too. radios-inline gives each item its own wrapper,
|
|
539
|
+
* because Bootstrap 5 documents one .form-check.form-check-inline per item,
|
|
540
|
+
* not one around the whole set.
|
|
541
|
+
*
|
|
542
|
+
* Template only. No constructor.
|
|
543
|
+
*/
|
|
544
|
+
class Bootstrap5RadiosComponent extends RadiosComponent {
|
|
545
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5RadiosComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
546
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Bootstrap5RadiosComponent, isStandalone: false, selector: "bootstrap5-radios-widget", usesInheritance: true, ngImport: i0, template: `
|
|
547
|
+
@if (options?.title) {
|
|
548
|
+
<label
|
|
549
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
550
|
+
[class]="options?.labelHtmlClass || ''"
|
|
551
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
552
|
+
[innerHTML]="options?.title"></label>
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
@if (layoutOrientation === 'horizontal') {
|
|
556
|
+
@if (layoutNode?.type === 'radiobuttons') {
|
|
557
|
+
<div [class]="options?.htmlClass || ''">
|
|
558
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
559
|
+
<input type="radio"
|
|
560
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
561
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
562
|
+
[attr.required]="options?.required"
|
|
563
|
+
[checked]="radioItem?.value === controlValue"
|
|
564
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
565
|
+
[disabled]="controlDisabled"
|
|
566
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
567
|
+
[name]="controlName"
|
|
568
|
+
[value]="radioItem?.value"
|
|
569
|
+
(change)="updateValue($event)">
|
|
570
|
+
<label
|
|
571
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
572
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
573
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
574
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
575
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
576
|
+
[innerHTML]="radioItem?.name"></label>
|
|
577
|
+
}
|
|
578
|
+
</div>
|
|
579
|
+
} @else {
|
|
580
|
+
<div>
|
|
581
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
582
|
+
<div [class]="options?.htmlClass || ''">
|
|
583
|
+
<input type="radio"
|
|
584
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
585
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
586
|
+
[attr.required]="options?.required"
|
|
587
|
+
[checked]="radioItem?.value === controlValue"
|
|
588
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
589
|
+
[disabled]="controlDisabled"
|
|
590
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
591
|
+
[name]="controlName"
|
|
592
|
+
[value]="radioItem?.value"
|
|
593
|
+
(change)="updateValue($event)">
|
|
594
|
+
<label
|
|
595
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
596
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
597
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
598
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
599
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
600
|
+
[innerHTML]="radioItem?.name"></label>
|
|
601
|
+
</div>
|
|
602
|
+
}
|
|
603
|
+
</div>
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
@if (layoutOrientation !== 'horizontal') {
|
|
608
|
+
<div>
|
|
609
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
610
|
+
<div [class]="options?.htmlClass || ''">
|
|
611
|
+
<input type="radio"
|
|
612
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
613
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
614
|
+
[attr.required]="options?.required"
|
|
615
|
+
[checked]="radioItem?.value === controlValue"
|
|
616
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
617
|
+
[disabled]="controlDisabled"
|
|
618
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
619
|
+
[name]="controlName"
|
|
620
|
+
[value]="radioItem?.value"
|
|
621
|
+
(change)="updateValue($event)">
|
|
622
|
+
<label
|
|
623
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
624
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
625
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
626
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
627
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
628
|
+
[innerHTML]="radioItem?.name"></label>
|
|
629
|
+
</div>
|
|
630
|
+
}
|
|
631
|
+
</div>
|
|
632
|
+
}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
633
|
+
}
|
|
634
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5RadiosComponent, decorators: [{
|
|
635
|
+
type: Component,
|
|
636
|
+
args: [{
|
|
637
|
+
selector: 'bootstrap5-radios-widget',
|
|
638
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
639
|
+
standalone: false,
|
|
640
|
+
template: `
|
|
641
|
+
@if (options?.title) {
|
|
642
|
+
<label
|
|
643
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
644
|
+
[class]="options?.labelHtmlClass || ''"
|
|
645
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
646
|
+
[innerHTML]="options?.title"></label>
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
@if (layoutOrientation === 'horizontal') {
|
|
650
|
+
@if (layoutNode?.type === 'radiobuttons') {
|
|
651
|
+
<div [class]="options?.htmlClass || ''">
|
|
652
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
653
|
+
<input type="radio"
|
|
654
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
655
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
656
|
+
[attr.required]="options?.required"
|
|
657
|
+
[checked]="radioItem?.value === controlValue"
|
|
658
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
659
|
+
[disabled]="controlDisabled"
|
|
660
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
661
|
+
[name]="controlName"
|
|
662
|
+
[value]="radioItem?.value"
|
|
663
|
+
(change)="updateValue($event)">
|
|
664
|
+
<label
|
|
665
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
666
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
667
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
668
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
669
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
670
|
+
[innerHTML]="radioItem?.name"></label>
|
|
671
|
+
}
|
|
672
|
+
</div>
|
|
673
|
+
} @else {
|
|
674
|
+
<div>
|
|
675
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
676
|
+
<div [class]="options?.htmlClass || ''">
|
|
677
|
+
<input type="radio"
|
|
678
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
679
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
680
|
+
[attr.required]="options?.required"
|
|
681
|
+
[checked]="radioItem?.value === controlValue"
|
|
682
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
683
|
+
[disabled]="controlDisabled"
|
|
684
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
685
|
+
[name]="controlName"
|
|
686
|
+
[value]="radioItem?.value"
|
|
687
|
+
(change)="updateValue($event)">
|
|
688
|
+
<label
|
|
689
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
690
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
691
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
692
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
693
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
694
|
+
[innerHTML]="radioItem?.name"></label>
|
|
695
|
+
</div>
|
|
696
|
+
}
|
|
697
|
+
</div>
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
@if (layoutOrientation !== 'horizontal') {
|
|
702
|
+
<div>
|
|
703
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
704
|
+
<div [class]="options?.htmlClass || ''">
|
|
705
|
+
<input type="radio"
|
|
706
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
707
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
708
|
+
[attr.required]="options?.required"
|
|
709
|
+
[checked]="radioItem?.value === controlValue"
|
|
710
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
711
|
+
[disabled]="controlDisabled"
|
|
712
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
713
|
+
[name]="controlName"
|
|
714
|
+
[value]="radioItem?.value"
|
|
715
|
+
(change)="updateValue($event)">
|
|
716
|
+
<label
|
|
717
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
718
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
719
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
720
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
721
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
722
|
+
[innerHTML]="radioItem?.name"></label>
|
|
723
|
+
</div>
|
|
724
|
+
}
|
|
725
|
+
</div>
|
|
726
|
+
}`,
|
|
727
|
+
}]
|
|
728
|
+
}] });
|
|
729
|
+
|
|
234
730
|
// Bootstrap 5 Framework
|
|
235
731
|
// https://github.com/ng-bootstrap/ng-bootstrap
|
|
236
732
|
class Bootstrap5Framework extends Framework {
|
|
@@ -238,6 +734,11 @@ class Bootstrap5Framework extends Framework {
|
|
|
238
734
|
super(...arguments);
|
|
239
735
|
this.name = 'bootstrap-5';
|
|
240
736
|
this.framework = Bootstrap5FrameworkComponent;
|
|
737
|
+
this.widgets = {
|
|
738
|
+
'checkbox': Bootstrap5CheckboxComponent,
|
|
739
|
+
'checkboxes': Bootstrap5CheckboxesComponent,
|
|
740
|
+
'radios': Bootstrap5RadiosComponent,
|
|
741
|
+
};
|
|
241
742
|
this.stylesheets = [
|
|
242
743
|
'//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css'
|
|
243
744
|
];
|
|
@@ -254,12 +755,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
254
755
|
type: Injectable
|
|
255
756
|
}] });
|
|
256
757
|
|
|
758
|
+
const BOOTSTRAP5_FRAMEWORK_COMPONENTS = [
|
|
759
|
+
Bootstrap5CheckboxComponent,
|
|
760
|
+
Bootstrap5CheckboxesComponent,
|
|
761
|
+
Bootstrap5RadiosComponent,
|
|
762
|
+
];
|
|
763
|
+
|
|
257
764
|
class Bootstrap5FrameworkModule {
|
|
258
765
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
259
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, declarations: [Bootstrap5FrameworkComponent], imports: [JsonSchemaFormModule,
|
|
766
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, declarations: [Bootstrap5FrameworkComponent, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5RadiosComponent], imports: [JsonSchemaFormModule,
|
|
260
767
|
CommonModule,
|
|
261
768
|
WidgetLibraryModule], exports: [JsonSchemaFormModule,
|
|
262
|
-
Bootstrap5FrameworkComponent] }); }
|
|
769
|
+
Bootstrap5FrameworkComponent, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5RadiosComponent] }); }
|
|
263
770
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, providers: [
|
|
264
771
|
JsonSchemaFormService,
|
|
265
772
|
FrameworkLibraryService,
|
|
@@ -279,10 +786,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
279
786
|
],
|
|
280
787
|
declarations: [
|
|
281
788
|
Bootstrap5FrameworkComponent,
|
|
789
|
+
...BOOTSTRAP5_FRAMEWORK_COMPONENTS,
|
|
282
790
|
],
|
|
283
791
|
exports: [
|
|
284
792
|
JsonSchemaFormModule,
|
|
285
793
|
Bootstrap5FrameworkComponent,
|
|
794
|
+
...BOOTSTRAP5_FRAMEWORK_COMPONENTS,
|
|
286
795
|
],
|
|
287
796
|
providers: [
|
|
288
797
|
JsonSchemaFormService,
|
|
@@ -301,5 +810,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
301
810
|
* Generated bundle index. Do not edit.
|
|
302
811
|
*/
|
|
303
812
|
|
|
304
|
-
export { Bootstrap5Framework, Bootstrap5FrameworkComponent, Bootstrap5FrameworkModule };
|
|
813
|
+
export { BOOTSTRAP5_FRAMEWORK_COMPONENTS, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5Framework, Bootstrap5FrameworkComponent, Bootstrap5FrameworkModule, Bootstrap5RadiosComponent };
|
|
305
814
|
//# sourceMappingURL=ajsf-bootstrap5.mjs.map
|
|
@@ -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/bootstrap5.framework.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', 'checkboxes-inline', '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 // Add asterisk to titles if required\n if (this.options.title && this.layoutNode.type !== 'tab' &&\n !this.options.notitle && this.options.required &&\n !this.options.title.includes('*')\n ) {\n this.options.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 // CheckboxComponent renders no element carrying htmlClass, so the\n // single checkbox takes .form-check from the framework's own div.\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.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass,\n 'form-check form-check-inline 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.fieldHtmlClass = addClasses(\n this.widgetOptions.fieldHtmlClass, 'form-check-input');\n this.widgetOptions.itemLabelHtmlClass = addClasses(\n this.widgetOptions.itemLabelHtmlClass,\n 'form-check form-check-inline 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, 'visually-hidden');\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 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 (showRemoveButton) {\n <button\n class=\"float-end btn btn-outline-danger btn-sm\"\n type=\"button\"\n (click)=\"removeItem()\">\n <span aria-hidden=\"true\">×</span>\n </button>\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 <div\n [class.h-100]=\"true\"\n [class.mt-1]=\"true\"\n [class.form-check]=\"isSingleCheck\"\n [class.is-invalid]=\"!!options?.errorMessage\"\n [class.input-group]=\"options?.fieldAddonLeft || options?.fieldAddonRight\"\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 (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 {Injectable} from '@angular/core';\nimport {Framework} from '@ajsf/core';\nimport {Bootstrap5FrameworkComponent} from './bootstrap5-framework.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 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 {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';\n\n@NgModule({\n imports: [\n JsonSchemaFormModule,\n CommonModule,\n WidgetLibraryModule,\n ],\n declarations: [\n Bootstrap5FrameworkComponent,\n ],\n exports: [\n JsonSchemaFormModule,\n Bootstrap5FrameworkComponent,\n ],\n providers: [\n JsonSchemaFormService,\n FrameworkLibraryService,\n WidgetLibraryService,\n { provide: Framework, useClass: Bootstrap5Framework, multi: true },\n ]\n})\nexport class Bootstrap5FrameworkModule {\n}\n","/*\n * Public API Surface of @ajsf/bootstrap5\n */\n\nexport * from './lib/bootstrap5-framework.module';\nexport * from './lib/bootstrap5-framework.component';\nexport * from './lib/bootstrap5.framework';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"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,mBAAmB,EAAE,YAAY,EAAE,OAAO;gBAChE,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;;AAGrD,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,KAAK;gBACtD,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAC9C,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EACjC;AACA,gBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,yCAAyC;YACjE;;AAEA,YAAA,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI;;;;AAI1B,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,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,EACrC,+CAA+C,CAAC;oBAClD;;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,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,EACrC,+CAA+C,CAAC;oBAClD;;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,iBAAiB,CAAC;oBACvD;;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;AACb,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;8GApQW,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,q1FAwFA,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;;2FDnEa,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,q1FAAA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA;;sBAYlB;;sBACA;;sBACA;;;AE7BH;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,WAAW,GAAG;YACZ;SACD;;;AAID,QAAA,IAAA,CAAA,OAAO,GAAG;YACR,wEAAwE;SACzE;AACF,IAAA;8GAdY,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;;;MC0BY,yBAAyB,CAAA;8GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAzB,yBAAyB,EAAA,YAAA,EAAA,CAb9B,4BAA4B,CAAA,EAAA,OAAA,EAAA,CAL5B,oBAAoB;YACpB,YAAY;AACZ,YAAA,mBAAmB,aAMnB,oBAAoB;YACpB,4BAA4B,CAAA,EAAA,CAAA,CAAA;AASvB,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,CAhBG,oBAAoB;YACpB,YAAY;AACZ,YAAA,mBAAmB,EAMnB,oBAAoB,CAAA,EAAA,CAAA,CAAA;;2FAUf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBApBrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,oBAAoB;wBACpB,YAAY;wBACZ,mBAAmB;AACtB,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACV,4BAA4B;AAC/B,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL,oBAAoB;wBACpB,4BAA4B;AAC/B,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;;;AChCD;;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 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 // Add asterisk to titles if required. setTitle hands the title to the\n // widget for an array or a fieldset and leaves none here, so the marker\n // follows it. Named types only: setTitle also returns null for submit,\n // whose widget uses the title as an input value rather than as HTML, so\n // markup appended there 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 too: its title belongs to the widget, which\n // renders it as the legend naming the group. Leaving it to the default\n // branch blanked it here and had the widget rebuild one from the raw\n // property name, so the title appeared twice and in two spellings.\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 <!--\n is-invalid sits on this row rather than on the field inside it, because\n Bootstrap reveals .invalid-feedback only as a following sibling of the\n element carrying .is-invalid, and the message below is this row's sibling.\n The row is a flex container only for a removable array item, which is also\n what stops the button's float taking it out of normal flow.\n -->\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, and\n * styles the input's state through sibling selectors. The core widget nests\n * the input inside the label, which is the Bootstrap 3 shape.\n *\n * Template only. No constructor: Angular inherits the base's injection\n * through its generated factory, and adding one would break that.\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 * Sibling input and label per item, for checkboxes, checkboxes-inline and\n * checkboxbuttons alike. The horizontal branch splits on layoutNode.type:\n * checkboxbuttons keeps the one shared wrapper, because btn-group belongs on\n * a single element around the whole set and Bootstrap 5's btn-check idiom is\n * a sibling input there too. checkboxes-inline gives each item its own\n * wrapper, because Bootstrap 5 documents one .form-check.form-check-inline\n * per item, not one around the whole set.\n *\n * activeClass and style.selected stay on the label, where the core widget\n * puts them, so the button idiom keeps working.\n *\n * Template only. No constructor.\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 * Sibling input and label per item, for radios, radios-inline and\n * radiobuttons alike. The horizontal branch splits on layoutNode.type:\n * radiobuttons keeps the one shared wrapper, because btn-group belongs on a\n * single element around the whole set and Bootstrap 5's btn-check idiom is a\n * sibling input there too. radios-inline gives each item its own wrapper,\n * because Bootstrap 5 documents one .form-check.form-check-inline per item,\n * not one around the whole set.\n *\n * Template only. No constructor.\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 * Public API Surface of @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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ajsf/bootstrap5",
|
|
3
|
-
"version": "22.
|
|
3
|
+
"version": "22.2.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": [
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|
|
24
|
-
"url": "git+https://github.com/hamzahamidi/ajsf"
|
|
24
|
+
"url": "git+https://github.com/hamzahamidi/ajsf.git"
|
|
25
25
|
},
|
|
26
26
|
"bugs": {
|
|
27
27
|
"url": "https://github.com/hamzahamidi/ajsf/issues"
|
|
@@ -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.2.0",
|
|
33
33
|
"tslib": "^2.0.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { OnInit, OnChanges, ChangeDetectorRef } from '@angular/core';
|
|
3
|
-
import * as
|
|
4
|
-
import { JsonSchemaFormService, Framework } from '@ajsf/core';
|
|
5
|
-
import * as
|
|
3
|
+
import * as i5 from '@ajsf/core';
|
|
4
|
+
import { JsonSchemaFormService, CheckboxComponent, CheckboxesComponent, RadiosComponent, Framework } from '@ajsf/core';
|
|
5
|
+
import * as i6 from '@angular/common';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Bootstrap 5 framework for Angular JSON Schema Form.
|
|
@@ -36,19 +36,74 @@ declare class Bootstrap5FrameworkComponent implements OnInit, OnChanges {
|
|
|
36
36
|
static ɵcmp: i0.ɵɵComponentDeclaration<Bootstrap5FrameworkComponent, "bootstrap-5-framework", never, { "layoutNode": { "alias": "layoutNode"; "required": false; }; "layoutIndex": { "alias": "layoutIndex"; "required": false; }; "dataIndex": { "alias": "dataIndex"; "required": false; }; }, {}, never, never, false, never>;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Bootstrap 5 wants the input and label as siblings inside .form-check, and
|
|
41
|
+
* styles the input's state through sibling selectors. The core widget nests
|
|
42
|
+
* the input inside the label, which is the Bootstrap 3 shape.
|
|
43
|
+
*
|
|
44
|
+
* Template only. No constructor: Angular inherits the base's injection
|
|
45
|
+
* through its generated factory, and adding one would break that.
|
|
46
|
+
*/
|
|
47
|
+
declare class Bootstrap5CheckboxComponent extends CheckboxComponent {
|
|
48
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<Bootstrap5CheckboxComponent, never>;
|
|
49
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<Bootstrap5CheckboxComponent, "bootstrap5-checkbox-widget", never, {}, {}, never, never, false, never>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sibling input and label per item, for checkboxes, checkboxes-inline and
|
|
54
|
+
* checkboxbuttons alike. The horizontal branch splits on layoutNode.type:
|
|
55
|
+
* checkboxbuttons keeps the one shared wrapper, because btn-group belongs on
|
|
56
|
+
* a single element around the whole set and Bootstrap 5's btn-check idiom is
|
|
57
|
+
* a sibling input there too. checkboxes-inline gives each item its own
|
|
58
|
+
* wrapper, because Bootstrap 5 documents one .form-check.form-check-inline
|
|
59
|
+
* per item, not one around the whole set.
|
|
60
|
+
*
|
|
61
|
+
* activeClass and style.selected stay on the label, where the core widget
|
|
62
|
+
* puts them, so the button idiom keeps working.
|
|
63
|
+
*
|
|
64
|
+
* Template only. No constructor.
|
|
65
|
+
*/
|
|
66
|
+
declare class Bootstrap5CheckboxesComponent extends CheckboxesComponent {
|
|
67
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<Bootstrap5CheckboxesComponent, never>;
|
|
68
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<Bootstrap5CheckboxesComponent, "bootstrap5-checkboxes-widget", never, {}, {}, never, never, false, never>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Sibling input and label per item, for radios, radios-inline and
|
|
73
|
+
* radiobuttons alike. The horizontal branch splits on layoutNode.type:
|
|
74
|
+
* radiobuttons keeps the one shared wrapper, because btn-group belongs on a
|
|
75
|
+
* single element around the whole set and Bootstrap 5's btn-check idiom is a
|
|
76
|
+
* sibling input there too. radios-inline gives each item its own wrapper,
|
|
77
|
+
* because Bootstrap 5 documents one .form-check.form-check-inline per item,
|
|
78
|
+
* not one around the whole set.
|
|
79
|
+
*
|
|
80
|
+
* Template only. No constructor.
|
|
81
|
+
*/
|
|
82
|
+
declare class Bootstrap5RadiosComponent extends RadiosComponent {
|
|
83
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<Bootstrap5RadiosComponent, never>;
|
|
84
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<Bootstrap5RadiosComponent, "bootstrap5-radios-widget", never, {}, {}, never, never, false, never>;
|
|
85
|
+
}
|
|
86
|
+
|
|
39
87
|
declare class Bootstrap5FrameworkModule {
|
|
40
88
|
static ɵfac: i0.ɵɵFactoryDeclaration<Bootstrap5FrameworkModule, never>;
|
|
41
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<Bootstrap5FrameworkModule, [typeof Bootstrap5FrameworkComponent], [typeof
|
|
89
|
+
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]>;
|
|
42
90
|
static ɵinj: i0.ɵɵInjectorDeclaration<Bootstrap5FrameworkModule>;
|
|
43
91
|
}
|
|
44
92
|
|
|
45
93
|
declare class Bootstrap5Framework extends Framework {
|
|
46
94
|
name: string;
|
|
47
95
|
framework: typeof Bootstrap5FrameworkComponent;
|
|
96
|
+
widgets: {
|
|
97
|
+
checkbox: typeof Bootstrap5CheckboxComponent;
|
|
98
|
+
checkboxes: typeof Bootstrap5CheckboxesComponent;
|
|
99
|
+
radios: typeof Bootstrap5RadiosComponent;
|
|
100
|
+
};
|
|
48
101
|
stylesheets: string[];
|
|
49
102
|
scripts: string[];
|
|
50
103
|
static ɵfac: i0.ɵɵFactoryDeclaration<Bootstrap5Framework, never>;
|
|
51
104
|
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
52
105
|
}
|
|
53
106
|
|
|
54
|
-
|
|
107
|
+
declare const BOOTSTRAP5_FRAMEWORK_COMPONENTS: (typeof Bootstrap5CheckboxComponent | typeof Bootstrap5CheckboxesComponent | typeof Bootstrap5RadiosComponent)[];
|
|
108
|
+
|
|
109
|
+
export { BOOTSTRAP5_FRAMEWORK_COMPONENTS, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5Framework, Bootstrap5FrameworkComponent, Bootstrap5FrameworkModule, Bootstrap5RadiosComponent };
|