@ajsf/bootstrap5 21.0.0 → 22.1.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 +20 -0
- package/fesm2022/ajsf-bootstrap5.mjs +517 -20
- package/fesm2022/ajsf-bootstrap5.mjs.map +1 -1
- package/package.json +8 -8
- package/types/ajsf-bootstrap5.d.ts +61 -6
package/README.md
CHANGED
|
@@ -53,6 +53,26 @@ 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
|
+
|
|
56
76
|
## Code scaffolding
|
|
57
77
|
|
|
58
78
|
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`.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Input, Component, Injectable, NgModule } from '@angular/core';
|
|
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.
|
|
@@ -100,8 +100,9 @@ class Bootstrap5FrameworkComponent {
|
|
|
100
100
|
// Set miscelaneous styles and settings for each control type
|
|
101
101
|
switch (this.layoutNode.type) {
|
|
102
102
|
// Checkbox controls
|
|
103
|
-
//
|
|
104
|
-
// single checkbox takes .form-check from
|
|
103
|
+
// The framework template puts [class.form-check]="isSingleCheck" on
|
|
104
|
+
// its own wrapper div, so the single checkbox takes .form-check from
|
|
105
|
+
// there rather than from this switch.
|
|
105
106
|
case 'checkbox':
|
|
106
107
|
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'form-check-input');
|
|
107
108
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
@@ -112,8 +113,9 @@ class Bootstrap5FrameworkComponent {
|
|
|
112
113
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
113
114
|
break;
|
|
114
115
|
case 'checkboxes-inline':
|
|
116
|
+
this.widgetOptions.htmlClass = addClasses(this.widgetOptions.htmlClass, 'form-check form-check-inline');
|
|
115
117
|
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'form-check-input');
|
|
116
|
-
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check
|
|
118
|
+
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
117
119
|
break;
|
|
118
120
|
// Radio controls
|
|
119
121
|
case 'radio':
|
|
@@ -123,8 +125,9 @@ class Bootstrap5FrameworkComponent {
|
|
|
123
125
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
124
126
|
break;
|
|
125
127
|
case 'radios-inline':
|
|
128
|
+
this.widgetOptions.htmlClass = addClasses(this.widgetOptions.htmlClass, 'form-check form-check-inline');
|
|
126
129
|
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'form-check-input');
|
|
127
|
-
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check
|
|
130
|
+
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'form-check-label');
|
|
128
131
|
break;
|
|
129
132
|
// Button sets - checkboxbuttons and radiobuttons
|
|
130
133
|
case 'checkboxbuttons':
|
|
@@ -132,7 +135,7 @@ class Bootstrap5FrameworkComponent {
|
|
|
132
135
|
this.widgetOptions.htmlClass = addClasses(this.widgetOptions.htmlClass, 'btn-group');
|
|
133
136
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, 'btn');
|
|
134
137
|
this.widgetOptions.itemLabelHtmlClass = addClasses(this.widgetOptions.itemLabelHtmlClass, this.options.style || 'btn-outline-primary');
|
|
135
|
-
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, '
|
|
138
|
+
this.widgetOptions.fieldHtmlClass = addClasses(this.widgetOptions.fieldHtmlClass, 'btn-check');
|
|
136
139
|
break;
|
|
137
140
|
// Single button controls
|
|
138
141
|
case 'button':
|
|
@@ -217,12 +220,12 @@ class Bootstrap5FrameworkComponent {
|
|
|
217
220
|
removeItem() {
|
|
218
221
|
this.jsf.removeItem(this);
|
|
219
222
|
}
|
|
220
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
221
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
223
|
+
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 }); }
|
|
224
|
+
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 (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", 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
225
|
}
|
|
223
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkComponent, decorators: [{
|
|
224
227
|
type: Component,
|
|
225
|
-
args: [{ selector: 'bootstrap-5-framework', 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 (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]=\"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]=\"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]=\"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]=\"options?.fieldAddonRight\"></span>\n </div>\n }\n </div>\n\n @if (formControl?.touched && options?.errorMessage) {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"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"] }]
|
|
228
|
+
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 (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", 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
229
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.JsonSchemaFormService }], propDecorators: { layoutNode: [{
|
|
227
230
|
type: Input
|
|
228
231
|
}], layoutIndex: [{
|
|
@@ -231,6 +234,487 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
|
|
|
231
234
|
type: Input
|
|
232
235
|
}] } });
|
|
233
236
|
|
|
237
|
+
/**
|
|
238
|
+
* Bootstrap 5 wants the input and label as siblings inside .form-check, and
|
|
239
|
+
* styles the input's state through sibling selectors. The core widget nests
|
|
240
|
+
* the input inside the label, which is the Bootstrap 3 shape.
|
|
241
|
+
*
|
|
242
|
+
* Template only. No constructor: Angular inherits the base's injection
|
|
243
|
+
* through its generated factory, and adding one would break that.
|
|
244
|
+
*/
|
|
245
|
+
class Bootstrap5CheckboxComponent extends CheckboxComponent {
|
|
246
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
247
|
+
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: `
|
|
248
|
+
<div [class]="options?.htmlClass || ''">
|
|
249
|
+
@if (boundControl) {
|
|
250
|
+
<input
|
|
251
|
+
[formControl]="formControl"
|
|
252
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
253
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
254
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
255
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
256
|
+
[id]="'control' + layoutNode?._id"
|
|
257
|
+
[name]="controlName"
|
|
258
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
259
|
+
type="checkbox">
|
|
260
|
+
}
|
|
261
|
+
@if (!boundControl) {
|
|
262
|
+
<input
|
|
263
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
264
|
+
[checked]="isChecked ? 'checked' : null"
|
|
265
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
266
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
267
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
268
|
+
[disabled]="controlDisabled"
|
|
269
|
+
[id]="'control' + layoutNode?._id"
|
|
270
|
+
[name]="controlName"
|
|
271
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
272
|
+
[value]="controlValue"
|
|
273
|
+
type="checkbox"
|
|
274
|
+
(change)="updateValue($event)">
|
|
275
|
+
}
|
|
276
|
+
<label
|
|
277
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
278
|
+
[class]="options?.itemLabelHtmlClass || ''">
|
|
279
|
+
@if (options?.title) {
|
|
280
|
+
<span
|
|
281
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
282
|
+
[innerHTML]="options?.title"></span>
|
|
283
|
+
}
|
|
284
|
+
</label>
|
|
285
|
+
</div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
286
|
+
}
|
|
287
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxComponent, decorators: [{
|
|
288
|
+
type: Component,
|
|
289
|
+
args: [{
|
|
290
|
+
selector: 'bootstrap5-checkbox-widget',
|
|
291
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
292
|
+
standalone: false,
|
|
293
|
+
template: `
|
|
294
|
+
<div [class]="options?.htmlClass || ''">
|
|
295
|
+
@if (boundControl) {
|
|
296
|
+
<input
|
|
297
|
+
[formControl]="formControl"
|
|
298
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
299
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
300
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
301
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
302
|
+
[id]="'control' + layoutNode?._id"
|
|
303
|
+
[name]="controlName"
|
|
304
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
305
|
+
type="checkbox">
|
|
306
|
+
}
|
|
307
|
+
@if (!boundControl) {
|
|
308
|
+
<input
|
|
309
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
310
|
+
[checked]="isChecked ? 'checked' : null"
|
|
311
|
+
[class]="(options?.fieldHtmlClass || '') + (isChecked ?
|
|
312
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
313
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
314
|
+
[disabled]="controlDisabled"
|
|
315
|
+
[id]="'control' + layoutNode?._id"
|
|
316
|
+
[name]="controlName"
|
|
317
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
318
|
+
[value]="controlValue"
|
|
319
|
+
type="checkbox"
|
|
320
|
+
(change)="updateValue($event)">
|
|
321
|
+
}
|
|
322
|
+
<label
|
|
323
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
324
|
+
[class]="options?.itemLabelHtmlClass || ''">
|
|
325
|
+
@if (options?.title) {
|
|
326
|
+
<span
|
|
327
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
328
|
+
[innerHTML]="options?.title"></span>
|
|
329
|
+
}
|
|
330
|
+
</label>
|
|
331
|
+
</div>`,
|
|
332
|
+
}]
|
|
333
|
+
}] });
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Sibling input and label per item, for checkboxes, checkboxes-inline and
|
|
337
|
+
* checkboxbuttons alike. The horizontal branch splits on layoutNode.type:
|
|
338
|
+
* checkboxbuttons keeps the one shared wrapper, because btn-group belongs on
|
|
339
|
+
* a single element around the whole set and Bootstrap 5's btn-check idiom is
|
|
340
|
+
* a sibling input there too. checkboxes-inline gives each item its own
|
|
341
|
+
* wrapper, because Bootstrap 5 documents one .form-check.form-check-inline
|
|
342
|
+
* per item, not one around the whole set.
|
|
343
|
+
*
|
|
344
|
+
* activeClass and style.selected stay on the label, where the core widget
|
|
345
|
+
* puts them, so the button idiom keeps working.
|
|
346
|
+
*
|
|
347
|
+
* Template only. No constructor.
|
|
348
|
+
*/
|
|
349
|
+
class Bootstrap5CheckboxesComponent extends CheckboxesComponent {
|
|
350
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
351
|
+
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: `
|
|
352
|
+
@if (options?.title) {
|
|
353
|
+
<label
|
|
354
|
+
[class]="options?.labelHtmlClass || ''"
|
|
355
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
356
|
+
[innerHTML]="options?.title"></label>
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
@if (layoutOrientation === 'horizontal') {
|
|
360
|
+
@if (layoutNode?.type === 'checkboxbuttons') {
|
|
361
|
+
<div [class]="options?.htmlClass || ''">
|
|
362
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
363
|
+
<input type="checkbox"
|
|
364
|
+
[attr.required]="options?.required"
|
|
365
|
+
[checked]="checkboxItem.checked"
|
|
366
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
367
|
+
[disabled]="controlDisabled"
|
|
368
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
369
|
+
[name]="checkboxItem?.name"
|
|
370
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
371
|
+
[value]="checkboxItem.value"
|
|
372
|
+
(change)="updateValue($event, checkboxItem)">
|
|
373
|
+
<label
|
|
374
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
375
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
376
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
377
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
378
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
379
|
+
}
|
|
380
|
+
</div>
|
|
381
|
+
} @else {
|
|
382
|
+
<div>
|
|
383
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
384
|
+
<div [class]="options?.htmlClass || ''">
|
|
385
|
+
<input type="checkbox"
|
|
386
|
+
[attr.required]="options?.required"
|
|
387
|
+
[checked]="checkboxItem.checked"
|
|
388
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
389
|
+
[disabled]="controlDisabled"
|
|
390
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
391
|
+
[name]="checkboxItem?.name"
|
|
392
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
393
|
+
[value]="checkboxItem.value"
|
|
394
|
+
(change)="updateValue($event, checkboxItem)">
|
|
395
|
+
<label
|
|
396
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
397
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
398
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
399
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
400
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
401
|
+
</div>
|
|
402
|
+
}
|
|
403
|
+
</div>
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
@if (layoutOrientation === 'vertical') {
|
|
408
|
+
<div>
|
|
409
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
410
|
+
<div [class]="options?.htmlClass || ''">
|
|
411
|
+
<input type="checkbox"
|
|
412
|
+
[attr.required]="options?.required"
|
|
413
|
+
[checked]="checkboxItem.checked"
|
|
414
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
415
|
+
[disabled]="controlDisabled"
|
|
416
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
417
|
+
[name]="checkboxItem?.name"
|
|
418
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
419
|
+
[value]="checkboxItem.value"
|
|
420
|
+
(change)="updateValue($event, checkboxItem)">
|
|
421
|
+
<label
|
|
422
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
423
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
424
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
425
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
426
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
427
|
+
</div>
|
|
428
|
+
}
|
|
429
|
+
</div>
|
|
430
|
+
}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
431
|
+
}
|
|
432
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5CheckboxesComponent, decorators: [{
|
|
433
|
+
type: Component,
|
|
434
|
+
args: [{
|
|
435
|
+
selector: 'bootstrap5-checkboxes-widget',
|
|
436
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
437
|
+
standalone: false,
|
|
438
|
+
template: `
|
|
439
|
+
@if (options?.title) {
|
|
440
|
+
<label
|
|
441
|
+
[class]="options?.labelHtmlClass || ''"
|
|
442
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
443
|
+
[innerHTML]="options?.title"></label>
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
@if (layoutOrientation === 'horizontal') {
|
|
447
|
+
@if (layoutNode?.type === 'checkboxbuttons') {
|
|
448
|
+
<div [class]="options?.htmlClass || ''">
|
|
449
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
450
|
+
<input type="checkbox"
|
|
451
|
+
[attr.required]="options?.required"
|
|
452
|
+
[checked]="checkboxItem.checked"
|
|
453
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
454
|
+
[disabled]="controlDisabled"
|
|
455
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
456
|
+
[name]="checkboxItem?.name"
|
|
457
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
458
|
+
[value]="checkboxItem.value"
|
|
459
|
+
(change)="updateValue($event, checkboxItem)">
|
|
460
|
+
<label
|
|
461
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
462
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
463
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
464
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
465
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
466
|
+
}
|
|
467
|
+
</div>
|
|
468
|
+
} @else {
|
|
469
|
+
<div>
|
|
470
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
471
|
+
<div [class]="options?.htmlClass || ''">
|
|
472
|
+
<input type="checkbox"
|
|
473
|
+
[attr.required]="options?.required"
|
|
474
|
+
[checked]="checkboxItem.checked"
|
|
475
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
476
|
+
[disabled]="controlDisabled"
|
|
477
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
478
|
+
[name]="checkboxItem?.name"
|
|
479
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
480
|
+
[value]="checkboxItem.value"
|
|
481
|
+
(change)="updateValue($event, checkboxItem)">
|
|
482
|
+
<label
|
|
483
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
484
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
485
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
486
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
487
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
488
|
+
</div>
|
|
489
|
+
}
|
|
490
|
+
</div>
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
@if (layoutOrientation === 'vertical') {
|
|
495
|
+
<div>
|
|
496
|
+
@for (checkboxItem of checkboxList; track checkboxItem) {
|
|
497
|
+
<div [class]="options?.htmlClass || ''">
|
|
498
|
+
<input type="checkbox"
|
|
499
|
+
[attr.required]="options?.required"
|
|
500
|
+
[checked]="checkboxItem.checked"
|
|
501
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
502
|
+
[disabled]="controlDisabled"
|
|
503
|
+
[id]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
504
|
+
[name]="checkboxItem?.name"
|
|
505
|
+
[readonly]="options?.readonly ? 'readonly' : null"
|
|
506
|
+
[value]="checkboxItem.value"
|
|
507
|
+
(change)="updateValue($event, checkboxItem)">
|
|
508
|
+
<label
|
|
509
|
+
[attr.for]="'control' + layoutNode?._id + '/' + checkboxItem.value"
|
|
510
|
+
[class]="(options?.itemLabelHtmlClass || '') + (checkboxItem.checked ?
|
|
511
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
512
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
513
|
+
[innerHTML]="checkboxItem.name"></label>
|
|
514
|
+
</div>
|
|
515
|
+
}
|
|
516
|
+
</div>
|
|
517
|
+
}`,
|
|
518
|
+
}]
|
|
519
|
+
}] });
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Sibling input and label per item, for radios, radios-inline and
|
|
523
|
+
* radiobuttons alike. The horizontal branch splits on layoutNode.type:
|
|
524
|
+
* radiobuttons keeps the one shared wrapper, because btn-group belongs on a
|
|
525
|
+
* single element around the whole set and Bootstrap 5's btn-check idiom is a
|
|
526
|
+
* sibling input there too. radios-inline gives each item its own wrapper,
|
|
527
|
+
* because Bootstrap 5 documents one .form-check.form-check-inline per item,
|
|
528
|
+
* not one around the whole set.
|
|
529
|
+
*
|
|
530
|
+
* Template only. No constructor.
|
|
531
|
+
*/
|
|
532
|
+
class Bootstrap5RadiosComponent extends RadiosComponent {
|
|
533
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5RadiosComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
534
|
+
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: `
|
|
535
|
+
@if (options?.title) {
|
|
536
|
+
<label
|
|
537
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
538
|
+
[class]="options?.labelHtmlClass || ''"
|
|
539
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
540
|
+
[innerHTML]="options?.title"></label>
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
@if (layoutOrientation === 'horizontal') {
|
|
544
|
+
@if (layoutNode?.type === 'radiobuttons') {
|
|
545
|
+
<div [class]="options?.htmlClass || ''">
|
|
546
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
547
|
+
<input type="radio"
|
|
548
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
549
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
550
|
+
[attr.required]="options?.required"
|
|
551
|
+
[checked]="radioItem?.value === controlValue"
|
|
552
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
553
|
+
[disabled]="controlDisabled"
|
|
554
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
555
|
+
[name]="controlName"
|
|
556
|
+
[value]="radioItem?.value"
|
|
557
|
+
(change)="updateValue($event)">
|
|
558
|
+
<label
|
|
559
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
560
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
561
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
562
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
563
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
564
|
+
[innerHTML]="radioItem?.name"></label>
|
|
565
|
+
}
|
|
566
|
+
</div>
|
|
567
|
+
} @else {
|
|
568
|
+
<div>
|
|
569
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
570
|
+
<div [class]="options?.htmlClass || ''">
|
|
571
|
+
<input type="radio"
|
|
572
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
573
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
574
|
+
[attr.required]="options?.required"
|
|
575
|
+
[checked]="radioItem?.value === controlValue"
|
|
576
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
577
|
+
[disabled]="controlDisabled"
|
|
578
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
579
|
+
[name]="controlName"
|
|
580
|
+
[value]="radioItem?.value"
|
|
581
|
+
(change)="updateValue($event)">
|
|
582
|
+
<label
|
|
583
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
584
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
585
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
586
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
587
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
588
|
+
[innerHTML]="radioItem?.name"></label>
|
|
589
|
+
</div>
|
|
590
|
+
}
|
|
591
|
+
</div>
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
@if (layoutOrientation !== 'horizontal') {
|
|
596
|
+
<div>
|
|
597
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
598
|
+
<div [class]="options?.htmlClass || ''">
|
|
599
|
+
<input type="radio"
|
|
600
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
601
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
602
|
+
[attr.required]="options?.required"
|
|
603
|
+
[checked]="radioItem?.value === controlValue"
|
|
604
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
605
|
+
[disabled]="controlDisabled"
|
|
606
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
607
|
+
[name]="controlName"
|
|
608
|
+
[value]="radioItem?.value"
|
|
609
|
+
(change)="updateValue($event)">
|
|
610
|
+
<label
|
|
611
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
612
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
613
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
614
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
615
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
616
|
+
[innerHTML]="radioItem?.name"></label>
|
|
617
|
+
</div>
|
|
618
|
+
}
|
|
619
|
+
</div>
|
|
620
|
+
}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
621
|
+
}
|
|
622
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5RadiosComponent, decorators: [{
|
|
623
|
+
type: Component,
|
|
624
|
+
args: [{
|
|
625
|
+
selector: 'bootstrap5-radios-widget',
|
|
626
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
627
|
+
standalone: false,
|
|
628
|
+
template: `
|
|
629
|
+
@if (options?.title) {
|
|
630
|
+
<label
|
|
631
|
+
[attr.for]="'control' + layoutNode?._id"
|
|
632
|
+
[class]="options?.labelHtmlClass || ''"
|
|
633
|
+
[style.display]="options?.notitle ? 'none' : ''"
|
|
634
|
+
[innerHTML]="options?.title"></label>
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
@if (layoutOrientation === 'horizontal') {
|
|
638
|
+
@if (layoutNode?.type === 'radiobuttons') {
|
|
639
|
+
<div [class]="options?.htmlClass || ''">
|
|
640
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
641
|
+
<input type="radio"
|
|
642
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
643
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
644
|
+
[attr.required]="options?.required"
|
|
645
|
+
[checked]="radioItem?.value === controlValue"
|
|
646
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
647
|
+
[disabled]="controlDisabled"
|
|
648
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
649
|
+
[name]="controlName"
|
|
650
|
+
[value]="radioItem?.value"
|
|
651
|
+
(change)="updateValue($event)">
|
|
652
|
+
<label
|
|
653
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
654
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
655
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
656
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
657
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
658
|
+
[innerHTML]="radioItem?.name"></label>
|
|
659
|
+
}
|
|
660
|
+
</div>
|
|
661
|
+
} @else {
|
|
662
|
+
<div>
|
|
663
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
664
|
+
<div [class]="options?.htmlClass || ''">
|
|
665
|
+
<input type="radio"
|
|
666
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
667
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
668
|
+
[attr.required]="options?.required"
|
|
669
|
+
[checked]="radioItem?.value === controlValue"
|
|
670
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
671
|
+
[disabled]="controlDisabled"
|
|
672
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
673
|
+
[name]="controlName"
|
|
674
|
+
[value]="radioItem?.value"
|
|
675
|
+
(change)="updateValue($event)">
|
|
676
|
+
<label
|
|
677
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
678
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
679
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
680
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
681
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
682
|
+
[innerHTML]="radioItem?.name"></label>
|
|
683
|
+
</div>
|
|
684
|
+
}
|
|
685
|
+
</div>
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
@if (layoutOrientation !== 'horizontal') {
|
|
690
|
+
<div>
|
|
691
|
+
@for (radioItem of radiosList; track radioItem) {
|
|
692
|
+
<div [class]="options?.htmlClass || ''">
|
|
693
|
+
<input type="radio"
|
|
694
|
+
[attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
|
|
695
|
+
[attr.readonly]="options?.readonly ? 'readonly' : null"
|
|
696
|
+
[attr.required]="options?.required"
|
|
697
|
+
[checked]="radioItem?.value === controlValue"
|
|
698
|
+
[class]="options?.fieldHtmlClass || ''"
|
|
699
|
+
[disabled]="controlDisabled"
|
|
700
|
+
[id]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
701
|
+
[name]="controlName"
|
|
702
|
+
[value]="radioItem?.value"
|
|
703
|
+
(change)="updateValue($event)">
|
|
704
|
+
<label
|
|
705
|
+
[attr.for]="'control' + layoutNode?._id + '/' + radioItem?.value"
|
|
706
|
+
[class]="(options?.itemLabelHtmlClass || '') +
|
|
707
|
+
((controlValue + '' === radioItem?.value + '') ?
|
|
708
|
+
(' ' + (options?.activeClass || '') + ' ' + (options?.style?.selected || '')) :
|
|
709
|
+
(' ' + (options?.style?.unselected || '')))"
|
|
710
|
+
[innerHTML]="radioItem?.name"></label>
|
|
711
|
+
</div>
|
|
712
|
+
}
|
|
713
|
+
</div>
|
|
714
|
+
}`,
|
|
715
|
+
}]
|
|
716
|
+
}] });
|
|
717
|
+
|
|
234
718
|
// Bootstrap 5 Framework
|
|
235
719
|
// https://github.com/ng-bootstrap/ng-bootstrap
|
|
236
720
|
class Bootstrap5Framework extends Framework {
|
|
@@ -238,6 +722,11 @@ class Bootstrap5Framework extends Framework {
|
|
|
238
722
|
super(...arguments);
|
|
239
723
|
this.name = 'bootstrap-5';
|
|
240
724
|
this.framework = Bootstrap5FrameworkComponent;
|
|
725
|
+
this.widgets = {
|
|
726
|
+
'checkbox': Bootstrap5CheckboxComponent,
|
|
727
|
+
'checkboxes': Bootstrap5CheckboxesComponent,
|
|
728
|
+
'radios': Bootstrap5RadiosComponent,
|
|
729
|
+
};
|
|
241
730
|
this.stylesheets = [
|
|
242
731
|
'//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css'
|
|
243
732
|
];
|
|
@@ -247,20 +736,26 @@ class Bootstrap5Framework extends Framework {
|
|
|
247
736
|
'//cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js',
|
|
248
737
|
];
|
|
249
738
|
}
|
|
250
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
251
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
739
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5Framework, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
740
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5Framework }); }
|
|
252
741
|
}
|
|
253
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
742
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5Framework, decorators: [{
|
|
254
743
|
type: Injectable
|
|
255
744
|
}] });
|
|
256
745
|
|
|
746
|
+
const BOOTSTRAP5_FRAMEWORK_COMPONENTS = [
|
|
747
|
+
Bootstrap5CheckboxComponent,
|
|
748
|
+
Bootstrap5CheckboxesComponent,
|
|
749
|
+
Bootstrap5RadiosComponent,
|
|
750
|
+
];
|
|
751
|
+
|
|
257
752
|
class Bootstrap5FrameworkModule {
|
|
258
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
259
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
753
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
754
|
+
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
755
|
CommonModule,
|
|
261
756
|
WidgetLibraryModule], exports: [JsonSchemaFormModule,
|
|
262
|
-
Bootstrap5FrameworkComponent] }); }
|
|
263
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
757
|
+
Bootstrap5FrameworkComponent, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5RadiosComponent] }); }
|
|
758
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, providers: [
|
|
264
759
|
JsonSchemaFormService,
|
|
265
760
|
FrameworkLibraryService,
|
|
266
761
|
WidgetLibraryService,
|
|
@@ -269,7 +764,7 @@ class Bootstrap5FrameworkModule {
|
|
|
269
764
|
CommonModule,
|
|
270
765
|
WidgetLibraryModule, JsonSchemaFormModule] }); }
|
|
271
766
|
}
|
|
272
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
767
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Bootstrap5FrameworkModule, decorators: [{
|
|
273
768
|
type: NgModule,
|
|
274
769
|
args: [{
|
|
275
770
|
imports: [
|
|
@@ -279,10 +774,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
|
|
|
279
774
|
],
|
|
280
775
|
declarations: [
|
|
281
776
|
Bootstrap5FrameworkComponent,
|
|
777
|
+
...BOOTSTRAP5_FRAMEWORK_COMPONENTS,
|
|
282
778
|
],
|
|
283
779
|
exports: [
|
|
284
780
|
JsonSchemaFormModule,
|
|
285
781
|
Bootstrap5FrameworkComponent,
|
|
782
|
+
...BOOTSTRAP5_FRAMEWORK_COMPONENTS,
|
|
286
783
|
],
|
|
287
784
|
providers: [
|
|
288
785
|
JsonSchemaFormService,
|
|
@@ -301,5 +798,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
|
|
|
301
798
|
* Generated bundle index. Do not edit.
|
|
302
799
|
*/
|
|
303
800
|
|
|
304
|
-
export { Bootstrap5Framework, Bootstrap5FrameworkComponent, Bootstrap5FrameworkModule };
|
|
801
|
+
export { BOOTSTRAP5_FRAMEWORK_COMPONENTS, Bootstrap5CheckboxComponent, Bootstrap5CheckboxesComponent, Bootstrap5Framework, Bootstrap5FrameworkComponent, Bootstrap5FrameworkModule, Bootstrap5RadiosComponent };
|
|
305
802
|
//# 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} 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 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]=\"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]=\"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]=\"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]=\"options?.fieldAddonRight\"></span>\n </div>\n }\n </div>\n\n @if (formControl?.touched && options?.errorMessage) {\n <div\n class=\"invalid-feedback\"\n [innerHTML]=\"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":"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"}
|
|
1
|
+
{"version":3,"file":"ajsf-bootstrap5.mjs","sources":["../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.component.html","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-checkbox.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-checkboxes.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/bootstrap5-radios.component.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5.framework.ts","../../../../projects/ajsf-bootstrap5/src/lib/widgets/public_api.ts","../../../../projects/ajsf-bootstrap5/src/lib/bootstrap5-framework.module.ts","../../../../projects/ajsf-bootstrap5/src/public_api.ts","../../../../projects/ajsf-bootstrap5/src/ajsf-bootstrap5.ts"],"sourcesContent":["import {\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n OnInit,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {JsonSchemaFormService, addClasses, cloneDeep, inArray} from '@ajsf/core';\n\n/**\n * Bootstrap 5 framework for Angular JSON Schema Form.\n *\n */\n@Component({\n selector: 'bootstrap-5-framework',\n templateUrl: './bootstrap5-framework.component.html',\n styleUrls: ['./bootstrap5-framework.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: false\n})\nexport class Bootstrap5FrameworkComponent implements OnInit, OnChanges {\n frameworkInitialized = false;\n widgetOptions: any; // Options passed to child widget\n widgetLayoutNode: any; // layoutNode passed to child widget\n options: any; // Options used in this framework\n 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 // 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 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 { 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,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ajsf/bootstrap5",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "22.1.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": [
|
|
7
7
|
"Angular",
|
|
8
8
|
"ng",
|
|
9
|
-
"
|
|
10
|
-
"Angular
|
|
11
|
-
"
|
|
9
|
+
"Angular22",
|
|
10
|
+
"Angular 22",
|
|
11
|
+
"ng22",
|
|
12
12
|
"JSON Schema",
|
|
13
13
|
"form",
|
|
14
14
|
"forms",
|
|
@@ -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,12 +29,12 @@
|
|
|
29
29
|
"funding": "https://github.com/sponsors/hamzahamidi",
|
|
30
30
|
"private": false,
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ajsf/core": "^
|
|
32
|
+
"@ajsf/core": "^22.1.0",
|
|
33
33
|
"tslib": "^2.0.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@angular/common": "^
|
|
37
|
-
"@angular/core": "^
|
|
36
|
+
"@angular/common": "^22.0.0",
|
|
37
|
+
"@angular/core": "^22.0.0"
|
|
38
38
|
},
|
|
39
39
|
"module": "fesm2022/ajsf-bootstrap5.mjs",
|
|
40
40
|
"typings": "types/ajsf-bootstrap5.d.ts",
|
|
@@ -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
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<
|
|
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 };
|