@ng-formworks/core 18.6.2 → 18.6.5

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.
@@ -1,7 +1,7 @@
1
1
  import * as i1 from '@angular/common';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { Injectable, inject, input, viewChild, ViewContainerRef, Component, Directive, Input, ChangeDetectionStrategy, ViewChild, signal, ElementRef, NgZone, NgModule, Inject, forwardRef, ChangeDetectorRef, output } from '@angular/core';
4
+ import { Injectable, inject, input, viewChild, ViewContainerRef, Component, Directive, Input, ChangeDetectionStrategy, ViewChild, signal, ElementRef, NgZone, Inject, NgModule, forwardRef, ChangeDetectorRef, output } from '@angular/core';
5
5
  import * as i2 from '@angular/forms';
6
6
  import { UntypedFormControl, UntypedFormArray, UntypedFormGroup, FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  import addFormats from 'ajv-formats';
@@ -2488,6 +2488,10 @@ const jsonSchemaFormatTests = {
2488
2488
  // Modified to allow incomplete entries, such as
2489
2489
  // "2000-03-14T01:59:26.535" (needs "Z") or "2000-03-14T01:59" (needs ":00Z")
2490
2490
  'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d(?::[0-5]\d)?(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i,
2491
+ // "2000-03-14T01:59:26.535" (doesn't need "Z") or "2000-03-14T01:59" (needs ":00Z")
2492
+ //'iso-date-time':^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|([+-]\d{2}:\d{2}))?$
2493
+ //for now same as 'date-time' until better tested
2494
+ 'iso-date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d(?::[0-5]\d)?(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i,
2491
2495
  // email (sources from jsen validator):
2492
2496
  // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
2493
2497
  // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')
@@ -2856,7 +2860,7 @@ class JsonValidators {
2856
2860
  }
2857
2861
  else {
2858
2862
  // Allow JavaScript Date objects
2859
- isValid = ['date', 'time', 'date-time'].includes(requiredFormat) &&
2863
+ isValid = ['date', 'time', 'iso-date-time'].includes(requiredFormat) &&
2860
2864
  Object.prototype.toString.call(currentValue) === '[object Date]';
2861
2865
  }
2862
2866
  return xor(isValid, invert) ?
@@ -4072,7 +4076,10 @@ function getInputType(schema, layoutNode = null) {
4072
4076
  return {
4073
4077
  'color': 'color',
4074
4078
  'date': 'date',
4075
- 'date-time': 'datetime-local',
4079
+ //as per ajv date-time requires a timezone but input
4080
+ //datetime-local doesn't
4081
+ //'date-time': 'datetime-local',
4082
+ 'iso-date-time': 'datetime-local',
4076
4083
  'email': 'email',
4077
4084
  'uri': 'url',
4078
4085
  }[schema.format] || 'text';
@@ -4586,8 +4593,32 @@ function fixRequiredArrayProperties(schema) {
4586
4593
  * @param schema:any
4587
4594
  * @param negate:boolean=false
4588
4595
  * @returns
4589
-
4590
4596
  */
4597
+ //TODO also handle ifs with mixed conditional such as allOf/oneOf etc
4598
+ /*
4599
+
4600
+ "if": {
4601
+ "allOf": [
4602
+ {
4603
+ "properties": {
4604
+ "animalType": {
4605
+ "enum": ["Cat", "Fish"]
4606
+ }
4607
+ }
4608
+ },
4609
+ {
4610
+ "properties": {
4611
+ "color": {
4612
+ "const": "orange"
4613
+ }
4614
+ }
4615
+ }
4616
+ ]
4617
+ }
4618
+
4619
+
4620
+
4621
+ */
4591
4622
  function convertJSONSchemaIfToCondition(schema, layoutNode, negate = false) {
4592
4623
  let conditionFun = "";
4593
4624
  let condition = {};
@@ -4612,17 +4643,26 @@ function convertJSONSchemaIfToCondition(schema, layoutNode, negate = false) {
4612
4643
  .join("")
4613
4644
  : "";
4614
4645
  let modelPath = parentPath ? `model.${parentPath}` : "model";
4615
- let checkPath = modelPath.split(".")
4616
- .reduce((accumulator, currentPart, index) => {
4617
- const currentExpression = index === 0 ? currentPart : `${accumulator}.${currentPart}`;
4618
- return index === 0 ? currentExpression : `${accumulator} && ${currentExpression}`;
4619
- }, '');
4646
+ let checkPath = modelPath.split('.')
4647
+ .map((_, index, array) => {
4648
+ return array.slice(0, index + 1).join('.'); // Build each part of the path dynamically
4649
+ }).join(' && '); // Join the parts with '&&'
4650
+ // .reduce((accumulator, currentPart, index) => {
4651
+ // const currentExpression = index === 0 ? currentPart : `${accumulator}.${currentPart}`;
4652
+ // return index === 0 ? currentExpression : `${accumulator} && ${currentExpression}`;
4653
+ // }, '');
4620
4654
  if (schema.if) {
4621
4655
  Object.keys(schema.if.properties).forEach((ifProp, ind) => {
4622
4656
  let amper = ind > 0 ? "&" : "";
4623
4657
  //Note the model value is first converted to string and so is the condition
4624
4658
  //so that booleans and numbers can also be compared
4625
- conditionFun += `${amper} ${checkPath} && ${modelPath}.${ifProp}+""=='${schema.if.properties[ifProp].const}'`;
4659
+ //changed to an includesList to handle cases such as
4660
+ const includesList = hasOwn(schema.if.properties[ifProp], "const") ? [schema.if.properties[ifProp].const]
4661
+ : hasOwn(schema.if.properties[ifProp], "enum") ? schema.if.properties[ifProp].enum
4662
+ : [];
4663
+ const includesListAsStr = includesList.map(val => { return `"${val}"`; });
4664
+ conditionFun += `${amper} ${checkPath} && [${includesListAsStr}].includes(${modelPath}.${ifProp}+"")`;
4665
+ //conditionFun+=`${amper} ${checkPath} && ${modelPath}.${ifProp}+""=='${schema.if.properties[ifProp].const}'`
4626
4666
  });
4627
4667
  }
4628
4668
  condition["functionBody"] = `return ${notOp}(${conditionFun})`;
@@ -5052,7 +5092,7 @@ function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true, schemaP
5052
5092
  ["then", "else"].forEach(con => {
5053
5093
  if (hasOwn(schema, con)) {
5054
5094
  const keySchemaPointer = `/${con}`;
5055
- let thenFGTemplate = buildFormGroupTemplate(jsf, nodeValue, false, //JsonPointer.get(nodeValue, keySchemaPointer), setValues,
5095
+ let thenFGTemplate = buildFormGroupTemplate(jsf, nodeValue, setValues, //false,//JsonPointer.get(nodeValue, keySchemaPointer), setValues,
5056
5096
  schemaPointer + keySchemaPointer, dataPointer, templatePointer + `/controls/${con}`);
5057
5097
  Object.assign(controls, thenFGTemplate.controls);
5058
5098
  }
@@ -5113,7 +5153,8 @@ function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true, schemaP
5113
5153
  if (foundKeys && foundKeys.length > 0) {
5114
5154
  const keySchemaPointer = `/${ofType}/${ind}`;
5115
5155
  //console.log(`found:${keySchemaPointer}`);
5116
- let newNodeValue = JsonPointer.get(nodeValue, dataPointer);
5156
+ let newNodeValue = nodeValue;
5157
+ //JsonPointer.get(nodeValue, dataPointer);
5117
5158
  //JsonPointer.get(nodeValue, keySchemaPointer);
5118
5159
  if (ofType == "oneOf") {
5119
5160
  newNodeValue = nodeValue;
@@ -5144,9 +5185,16 @@ function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true, schemaP
5144
5185
  let oneOfItemSchema = JsonPointer.get(jsf.schema, controlItem.schemaPointer);
5145
5186
  //JsonPointer.get(schema,pointerPath);
5146
5187
  let dPointer = controlItem.schemaPointer.replace(/(anyOf|allOf|oneOf|none)\/[\d]+\//g, '')
5147
- .replace(/(if|then|else|properties)\//g, '');
5188
+ .replace(/(if|then|else|properties)\//g, '').replace(/\/items\//g, '/-/');
5189
+ dPointer = dPointer.indexOf(dataPointer) == 0
5190
+ ? dPointer.substring(dataPointer.length) : dPointer;
5191
+ //dataPointer+"/"+controlItem.schemaPointer.split("/").slice(-1)[0];
5192
+ ////controlItem.schemaPointer.replace(/(anyOf|allOf|oneOf|none)\/[\d]+\//g, '')
5193
+ ////.replace(/(if|then|else|properties)\//g, '').replace(/\/items\//g,'/-/');
5148
5194
  //JsonPointer.toDataPointer(controlItem.schemaPointer,jsf.schema);
5149
- let dVal = JsonPointer.get(nodeValue, dPointer);
5195
+ //console.log(`dataPointer:${dataPointer}\ndPointer:${dPointer}`)
5196
+ let dVal = //JsonPointer.get(jsf.formValues,dPointer);
5197
+ JsonPointer.get(nodeValue, dPointer);
5150
5198
  let fkey = key;
5151
5199
  let oneOfItemValue = dVal;
5152
5200
  /*
@@ -5289,43 +5337,22 @@ function buildFormGroupTemplate(jsf, nodeValue = null, setValues = true, schemaP
5289
5337
  ["then", "else"].forEach(con => {
5290
5338
  if (hasOwn(schema, con)) {
5291
5339
  const keySchemaPointer = `/${con}`;
5292
- let thenTFGTemplate = buildFormGroupTemplate(jsf, nodeValue, false, schemaPointer + keySchemaPointer, dataPointer, templatePointer + `/controls/${con}`);
5340
+ let thenTFGTemplate = buildFormGroupTemplate(jsf, nodeValue, setValues, //false,
5341
+ schemaPointer + keySchemaPointer, dataPointer, templatePointer + `/controls/${con}`);
5293
5342
  //NB same property can be in both then and else
5294
5343
  //so key must be the unique path to control
5295
5344
  //let ifItemSchema=JsonPointer.get(schema,keySchemaPointer);
5296
5345
  //let ifItemValue;
5297
- Object.keys(thenTFGTemplate.controls).forEach(key => {
5298
- let controlKey = thenTFGTemplate.controls[key].schemaPointer;
5299
- ////let controlItem=cloneDeep(thenTFGTemplate.controls[key]);
5300
- ////thenTFGTemplate.controls[key].schemaPointer || `${schemaPointer}${keySchemaPointer}/${key}`;
5301
- controlKey = path2ControlKey(controlKey);
5302
- let cItem = Object.assign({}, thenTFGTemplate.controls[key]);
5303
- ////cItem.schemaPointer = `${schemaPointer}${keySchemaPointer}/${key}`;
5304
- /*
5305
- if(ifItemSchema.properties && jsf.formValues===undefined){
5306
- //check if no form data values were supplied
5307
- //then set it to default otherwise to its nodevalue
5308
- ifItemValue=ifItemSchema.default
5309
- ifItemValue[key]=ifItemSchema.properties[key]?.default;
5310
- }
5311
- if(ifItemSchema.properties && jsf.formValues!=undefined){
5312
- ifItemValue ={};
5313
- //nodeValue||{};
5314
- ifItemValue[key]=nodeValue&&nodeValue[key];
5315
- }
5316
- if(!ifItemSchema.properties && jsf.formValues==undefined){
5317
- ifItemValue=ifItemSchema.default;
5318
- }
5319
- if(hasOwn(cItem,"value")){
5320
- if(!jsf.ajv.validate(ifItemSchema,ifItemValue)){
5321
- cItem.value.value=null;
5322
- }else{
5323
- cItem.value.value=ifItemValue[key];
5324
- }
5325
- }
5326
- */
5327
- controls[controlKey] = cItem;
5328
- });
5346
+ if (hasOwn(thenTFGTemplate, 'controls')) {
5347
+ Object.keys(thenTFGTemplate.controls).forEach(key => {
5348
+ let controlKey = thenTFGTemplate.controls[key].schemaPointer;
5349
+ if (controlKey) {
5350
+ controlKey = path2ControlKey(controlKey);
5351
+ let cItem = Object.assign({}, thenTFGTemplate.controls[key]);
5352
+ controls[controlKey] = cItem;
5353
+ }
5354
+ });
5355
+ }
5329
5356
  }
5330
5357
  });
5331
5358
  }
@@ -5562,7 +5589,8 @@ function getControl(formGroup, dataPointer, returnGroup = false, schemaPointer)
5562
5589
  // If dataPointer input is not a valid JSON pointer, check to
5563
5590
  // see if it is instead a valid object path, using dot notaion
5564
5591
  if (typeof dataPointer === 'string') {
5565
- const formControl = formGroup.get(path2ControlKey(schemaPointer || "")) || formGroup.get(dataPointer);
5592
+ const controlPath = !!schemaPointer ? path2ControlKey(schemaPointer) : dataPointer;
5593
+ const formControl = formGroup.get(controlPath);
5566
5594
  if (formControl) {
5567
5595
  return formControl;
5568
5596
  }
@@ -5582,7 +5610,8 @@ function getControl(formGroup, dataPointer, returnGroup = false, schemaPointer)
5582
5610
  // try using formGroup.get() to return the control
5583
5611
  if (typeof formGroup.get === 'function' &&
5584
5612
  dataPointerArray.every(key => key.indexOf('.') === -1)) {
5585
- const formControl = formGroup.get(path2ControlKey(schemaPointer || "")) || formGroup.get(dataPointerArray.join('.'));
5613
+ const controlPath = !!schemaPointer ? path2ControlKey(schemaPointer) : dataPointerArray.join('.');
5614
+ const formControl = formGroup.get(controlPath);
5586
5615
  if (formControl) {
5587
5616
  return formControl;
5588
5617
  }
@@ -5595,15 +5624,16 @@ function getControl(formGroup, dataPointer, returnGroup = false, schemaPointer)
5595
5624
  if (hasOwn(subGroup, 'controls')) {
5596
5625
  subGroup = subGroup.controls;
5597
5626
  }
5598
- if (isArray(subGroup) && (key === '-')) {
5627
+ if (schemaPointer && hasOwn(subGroup, path2ControlKey(schemaPointer))) {
5628
+ subGroup = subGroup[path2ControlKey(schemaPointer)];
5629
+ return subGroup;
5630
+ }
5631
+ else if (isArray(subGroup) && (key === '-')) {
5599
5632
  subGroup = subGroup[subGroup.length - 1];
5600
5633
  }
5601
5634
  else if (hasOwn(subGroup, key)) {
5602
5635
  subGroup = subGroup[key];
5603
5636
  }
5604
- else if (schemaPointer && hasOwn(subGroup, path2ControlKey(schemaPointer))) {
5605
- subGroup = subGroup[path2ControlKey(schemaPointer)];
5606
- }
5607
5637
  else {
5608
5638
  console.error(`getControl error: Unable to find "${key}" item in FormGroup.`);
5609
5639
  console.error(dataPointer);
@@ -6481,7 +6511,7 @@ function buildLayoutFromSchema(jsf, widgetLibrary, nodeValue = null, schemaPoint
6481
6511
  if (hasOwn(schema, con)) {
6482
6512
  const keySchemaPointer = `/${con}`;
6483
6513
  const negateClause = con == "else";
6484
- const innerItem = buildLayoutFromSchema(jsf, widgetLibrary, nodeValue.then, schemaPointer + keySchemaPointer, dataPointer, false, null, null, forRefLibrary, dataPointerPrefix);
6514
+ const innerItem = buildLayoutFromSchema(jsf, widgetLibrary, nodeValue[con], schemaPointer + keySchemaPointer, dataPointer, false, null, null, forRefLibrary, dataPointerPrefix);
6485
6515
  if (innerItem) {
6486
6516
  applyITEConditions(innerItem, schemaPointer, keySchemaPointer, negateClause);
6487
6517
  if (isArray(innerItem)) {
@@ -6708,7 +6738,7 @@ function buildLayoutFromSchema(jsf, widgetLibrary, nodeValue = null, schemaPoint
6708
6738
  if (hasOwn(schema, con)) {
6709
6739
  const keySchemaPointer = `/${con}`;
6710
6740
  const negateClause = con == "else";
6711
- const innerItem = buildLayoutFromSchema(jsf, widgetLibrary, nodeValue.then, schemaPointer + keySchemaPointer, dataPointer, false, null, null, forRefLibrary, dataPointerPrefix);
6741
+ const innerItem = buildLayoutFromSchema(jsf, widgetLibrary, nodeValue[con], schemaPointer + keySchemaPointer, dataPointer, false, null, null, forRefLibrary, dataPointerPrefix);
6712
6742
  if (innerItem) {
6713
6743
  applyITEConditions(innerItem, schemaPointer, keySchemaPointer, negateClause);
6714
6744
  if (isArray(innerItem)) {
@@ -6716,17 +6746,19 @@ function buildLayoutFromSchema(jsf, widgetLibrary, nodeValue = null, schemaPoint
6716
6746
  //item.schemaPointer = schemaPointer + keySchemaPointer + item.dataPointer;
6717
6747
  //item.options.condition = convertJSONSchemaIfToCondition(schema, negateClause);
6718
6748
  newSection.push(item);
6719
- newNode = newSection;
6749
+ /////// newNode = newSection
6720
6750
  });
6721
6751
  }
6722
6752
  else {
6723
6753
  //innerItem.schemaPointer = schemaPointer + keySchemaPointer + innerItem.dataPointer;
6724
6754
  //innerItem.options.condition = convertJSONSchemaIfToCondition(schema, negateClause);
6725
- newNode = innerItem;
6755
+ ///////newNode = innerItem
6756
+ newSection.push(innerItem);
6726
6757
  }
6727
6758
  }
6728
6759
  }
6729
6760
  });
6761
+ newNode = newSection;
6730
6762
  }
6731
6763
  return newNode;
6732
6764
  }
@@ -8911,7 +8943,7 @@ class OneOfComponent {
8911
8943
  let controlSchema = JsonPointer.get(this.jsf.schema, parts.join("/"));
8912
8944
  let schemaPointer = parts.join("/");
8913
8945
  let dPointer = schemaPointer.replace(/(anyOf|allOf|oneOf|none)\/[\d]+\//g, '')
8914
- .replace(/(if|then|else|properties)\//g, '');
8946
+ .replace(/(if|then|else|properties)\//g, '').replace(/\/items\//g, '/-/');
8915
8947
  //JsonPointer.toDataPointer(parts.join("/"),this.jsf.schema);
8916
8948
  let dVal = JsonPointer.get(this.jsf.formValues, dPointer);
8917
8949
  let compareVal = dVal; //formValue;
@@ -9284,6 +9316,7 @@ class RootComponent {
9284
9316
  }
9285
9317
  sortableInit(sortable) {
9286
9318
  this.sortableObj = sortable;
9319
+ //Sortable.utils.on(this.sortableObj.el,"nulling",(s)=>{console.log("event nulling sortablejs")})
9287
9320
  ///NB issue caused by sortablejs when it its destroyed
9288
9321
  //this mainly affects checkboxes coupled with conditions
9289
9322
  //-the value is rechecked
@@ -9714,13 +9747,13 @@ class SelectComponent {
9714
9747
  [name]="controlName">
9715
9748
  <ng-template ngFor let-selectItem [ngForOf]="selectList">
9716
9749
  <option *ngIf="!isArray(selectItem?.items)"
9717
- [value]="selectItem?.value">
9750
+ [ngValue]="selectItem?.value">
9718
9751
  <span [innerHTML]="selectItem?.name"></span>
9719
9752
  </option>
9720
9753
  <optgroup *ngIf="isArray(selectItem?.items)"
9721
9754
  [label]="selectItem?.group">
9722
9755
  <option *ngFor="let subItem of selectItem.items"
9723
- [value]="subItem?.value">
9756
+ [ngValue]="subItem?.value">
9724
9757
  <span [innerHTML]="subItem?.name"></span>
9725
9758
  </option>
9726
9759
  </optgroup>
@@ -9738,14 +9771,14 @@ class SelectComponent {
9738
9771
  <ng-template ngFor let-selectItem [ngForOf]="selectList">
9739
9772
  <option *ngIf="!isArray(selectItem?.items)"
9740
9773
  [selected]="selectItem?.value === controlValue"
9741
- [value]="selectItem?.value">
9774
+ [ngValue]="selectItem?.value">
9742
9775
  <span [innerHTML]="selectItem?.name"></span>
9743
9776
  </option>
9744
9777
  <optgroup *ngIf="isArray(selectItem?.items)"
9745
9778
  [label]="selectItem?.group">
9746
9779
  <option *ngFor="let subItem of selectItem.items"
9747
9780
  [attr.selected]="subItem?.value === controlValue"
9748
- [value]="subItem?.value">
9781
+ [ngValue]="subItem?.value">
9749
9782
  <span [innerHTML]="subItem?.name"></span>
9750
9783
  </option>
9751
9784
  </optgroup>
@@ -9765,14 +9798,14 @@ class SelectComponent {
9765
9798
  <ng-template ngFor let-selectItem [ngForOf]="selectList">
9766
9799
  <option *ngIf="!isArray(selectItem?.items)"
9767
9800
  [selected]="selectItem?.value === controlValue"
9768
- [value]="selectItem?.value">
9801
+ [ngValue]="selectItem?.value">
9769
9802
  <span [innerHTML]="selectItem?.name"></span>
9770
9803
  </option>
9771
9804
  <optgroup *ngIf="isArray(selectItem?.items)"
9772
9805
  [label]="selectItem?.group">
9773
9806
  <option *ngFor="let subItem of selectItem.items"
9774
9807
  [attr.selected]="subItem?.value === controlValue"
9775
- [value]="subItem?.value">
9808
+ [ngValue]="subItem?.value">
9776
9809
  <span [innerHTML]="subItem?.name"></span>
9777
9810
  </option>
9778
9811
  </optgroup>
@@ -9803,13 +9836,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
9803
9836
  [name]="controlName">
9804
9837
  <ng-template ngFor let-selectItem [ngForOf]="selectList">
9805
9838
  <option *ngIf="!isArray(selectItem?.items)"
9806
- [value]="selectItem?.value">
9839
+ [ngValue]="selectItem?.value">
9807
9840
  <span [innerHTML]="selectItem?.name"></span>
9808
9841
  </option>
9809
9842
  <optgroup *ngIf="isArray(selectItem?.items)"
9810
9843
  [label]="selectItem?.group">
9811
9844
  <option *ngFor="let subItem of selectItem.items"
9812
- [value]="subItem?.value">
9845
+ [ngValue]="subItem?.value">
9813
9846
  <span [innerHTML]="subItem?.name"></span>
9814
9847
  </option>
9815
9848
  </optgroup>
@@ -9827,14 +9860,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
9827
9860
  <ng-template ngFor let-selectItem [ngForOf]="selectList">
9828
9861
  <option *ngIf="!isArray(selectItem?.items)"
9829
9862
  [selected]="selectItem?.value === controlValue"
9830
- [value]="selectItem?.value">
9863
+ [ngValue]="selectItem?.value">
9831
9864
  <span [innerHTML]="selectItem?.name"></span>
9832
9865
  </option>
9833
9866
  <optgroup *ngIf="isArray(selectItem?.items)"
9834
9867
  [label]="selectItem?.group">
9835
9868
  <option *ngFor="let subItem of selectItem.items"
9836
9869
  [attr.selected]="subItem?.value === controlValue"
9837
- [value]="subItem?.value">
9870
+ [ngValue]="subItem?.value">
9838
9871
  <span [innerHTML]="subItem?.name"></span>
9839
9872
  </option>
9840
9873
  </optgroup>
@@ -9854,14 +9887,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
9854
9887
  <ng-template ngFor let-selectItem [ngForOf]="selectList">
9855
9888
  <option *ngIf="!isArray(selectItem?.items)"
9856
9889
  [selected]="selectItem?.value === controlValue"
9857
- [value]="selectItem?.value">
9890
+ [ngValue]="selectItem?.value">
9858
9891
  <span [innerHTML]="selectItem?.name"></span>
9859
9892
  </option>
9860
9893
  <optgroup *ngIf="isArray(selectItem?.items)"
9861
9894
  [label]="selectItem?.group">
9862
9895
  <option *ngFor="let subItem of selectItem.items"
9863
9896
  [attr.selected]="subItem?.value === controlValue"
9864
- [value]="subItem?.value">
9897
+ [ngValue]="subItem?.value">
9865
9898
  <span [innerHTML]="subItem?.name"></span>
9866
9899
  </option>
9867
9900
  </optgroup>
@@ -9947,40 +9980,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
9947
9980
  }]
9948
9981
  }] });
9949
9982
 
9950
- class TabComponent {
9951
- constructor() {
9952
- this.jsf = inject(JsonSchemaFormService);
9953
- this.layoutNode = input(undefined);
9954
- this.layoutIndex = input(undefined);
9955
- this.dataIndex = input(undefined);
9956
- }
9957
- ngOnInit() {
9958
- this.options = this.layoutNode().options || {};
9959
- }
9960
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9961
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: TabComponent, selector: "tab-widget", inputs: { layoutNode: { classPropertyName: "layoutNode", publicName: "layoutNode", isSignal: true, isRequired: false, transformFunction: null }, layoutIndex: { classPropertyName: "layoutIndex", publicName: "layoutIndex", isSignal: true, isRequired: false, transformFunction: null }, dataIndex: { classPropertyName: "dataIndex", publicName: "dataIndex", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
9962
- <div [class]="options?.htmlClass || ''">
9963
- <root-widget
9964
- [dataIndex]="dataIndex()"
9965
- [layoutIndex]="layoutIndex()"
9966
- [layout]="layoutNode().items"></root-widget>
9967
- </div>`, isInline: true, dependencies: [{ kind: "component", type: RootComponent, selector: "root-widget", inputs: ["dataIndex", "layoutIndex", "layout", "isOrderable", "isFlexItem"] }] }); }
9968
- }
9969
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabComponent, decorators: [{
9970
- type: Component,
9971
- args: [{
9972
- // tslint:disable-next-line:component-selector
9973
- selector: 'tab-widget',
9974
- template: `
9975
- <div [class]="options?.htmlClass || ''">
9976
- <root-widget
9977
- [dataIndex]="dataIndex()"
9978
- [layoutIndex]="layoutIndex()"
9979
- [layout]="layoutNode().items"></root-widget>
9980
- </div>`,
9981
- }]
9982
- }] });
9983
-
9984
9983
  class TemplateComponent {
9985
9984
  constructor() {
9986
9985
  this.jsf = inject(JsonSchemaFormService);
@@ -10199,13 +10198,17 @@ class WidgetLibraryService {
10199
10198
  // See: http://ulion.github.io/jsonform/playground/?example=fields-checkboxbuttons
10200
10199
  // Widgets included for compatibility with React JSON Schema Form API
10201
10200
  'updown': 'number',
10202
- 'date-time': 'datetime-local',
10201
+ //'date-time': 'datetime-local',
10202
+ //as per ajv date-time requires a timezone but input
10203
+ //datetime-local doesn't
10204
+ 'iso-date-time': 'datetime-local',
10203
10205
  'alt-datetime': 'datetime-local',
10204
10206
  'alt-date': 'date',
10205
10207
  // Widgets included for compatibility with Angular Schema Form API
10206
10208
  'wizard': 'section', // TODO: Sequential panels with "Next" and "Previous" buttons
10207
10209
  // Widgets included for compatibility with other libraries
10208
10210
  'textline': 'text',
10211
+ 'selectcheckbox': SelectCheckboxComponent,
10209
10212
  // Recommended 3rd-party add-on widgets (TODO: create wrappers for these...)
10210
10213
  // 'ng2-select': Select control replacement - http://valor-software.com/ng2-select/
10211
10214
  // 'flatpickr': Flatpickr date picker - https://github.com/chmln/flatpickr
@@ -10322,73 +10325,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10322
10325
  }]
10323
10326
  }], ctorParameters: () => [] });
10324
10327
 
10325
- const BASIC_WIDGETS = [
10326
- AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent,
10327
- CheckboxesComponent, FileComponent, HiddenComponent, InputComponent,
10328
- MessageComponent, NoneComponent, NumberComponent, RadiosComponent,
10329
- RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent,
10330
- SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent,
10331
- TemplateComponent, TextareaComponent
10332
- ];
10333
-
10334
- class WidgetLibraryModule {
10335
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10336
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, declarations: [AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent, CheckboxesComponent, FileComponent, HiddenComponent, InputComponent, MessageComponent, NoneComponent, NumberComponent, RadiosComponent, RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent, SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, TemplateComponent, TextareaComponent, OrderableDirective, ElementAttributeDirective], imports: [CommonModule, FormsModule, ReactiveFormsModule, i2$1.SortablejsModule], exports: [AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent, CheckboxesComponent, FileComponent, HiddenComponent, InputComponent, MessageComponent, NoneComponent, NumberComponent, RadiosComponent, RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent, SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, TemplateComponent, TextareaComponent, OrderableDirective, ElementAttributeDirective] }); }
10337
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, imports: [CommonModule, FormsModule, ReactiveFormsModule,
10338
- SortablejsModule.forRoot({
10339
- //disabled:false,
10340
- //draggable:".draggableitem",//">:not(.nonsort)",//">.draggable-item",//":not(.nonsort)",//">*",//":not(.nonsort)",//":not(.non-draggable)",
10341
- filter: ".sortable-filter", //needed to disable dragging on input range elements, class needs to be added to the element or its parent
10342
- preventOnFilter: false, //needed for input range elements slider do still work
10343
- onMove: function (/**Event*/ evt, /**Event*/ originalEvent) {
10344
- if (evt.related.classList.contains("sortable-fixed")) {
10345
- //console.log(evt.related);
10346
- return false;
10347
- }
10348
- }
10349
- })] }); }
10350
- }
10351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, decorators: [{
10352
- type: NgModule,
10353
- args: [{
10354
- imports: [CommonModule, FormsModule, ReactiveFormsModule,
10355
- SortablejsModule.forRoot({
10356
- //disabled:false,
10357
- //draggable:".draggableitem",//">:not(.nonsort)",//">.draggable-item",//":not(.nonsort)",//">*",//":not(.nonsort)",//":not(.non-draggable)",
10358
- filter: ".sortable-filter", //needed to disable dragging on input range elements, class needs to be added to the element or its parent
10359
- preventOnFilter: false, //needed for input range elements slider do still work
10360
- onMove: function (/**Event*/ evt, /**Event*/ originalEvent) {
10361
- if (evt.related.classList.contains("sortable-fixed")) {
10362
- //console.log(evt.related);
10363
- return false;
10364
- }
10365
- }
10366
- })],
10367
- declarations: [...BASIC_WIDGETS, OrderableDirective, ElementAttributeDirective],
10368
- exports: [...BASIC_WIDGETS, OrderableDirective, ElementAttributeDirective]
10369
- }]
10370
- }] });
10371
-
10372
- // No framework - plain HTML controls (styles from form layout only)
10373
- class NoFrameworkModule {
10374
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10375
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, declarations: [NoFrameworkComponent], imports: [CommonModule, WidgetLibraryModule], exports: [NoFrameworkComponent] }); }
10376
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, providers: [
10377
- { provide: Framework, useClass: NoFramework, multi: true }
10378
- ], imports: [CommonModule, WidgetLibraryModule] }); }
10379
- }
10380
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, decorators: [{
10381
- type: NgModule,
10382
- args: [{
10383
- imports: [CommonModule, WidgetLibraryModule],
10384
- declarations: [NoFrameworkComponent],
10385
- exports: [NoFrameworkComponent],
10386
- providers: [
10387
- { provide: Framework, useClass: NoFramework, multi: true }
10388
- ]
10389
- }]
10390
- }] });
10391
-
10392
10328
  // Possible future frameworks:
10393
10329
  // - Foundation 6:
10394
10330
  // http://justindavis.co/2017/06/15/using-foundation-6-in-angular-4/
@@ -10554,6 +10490,283 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10554
10490
  args: [Framework]
10555
10491
  }] }] });
10556
10492
 
10493
+ //component created as a fallback for the checkbox/sortabljs issue
10494
+ //its meant to display a select as a checkbox
10495
+ class SelectCheckboxComponent {
10496
+ constructor() {
10497
+ this.jsf = inject(JsonSchemaFormService);
10498
+ this.jsfFLService = inject(FrameworkLibraryService);
10499
+ this.controlDisabled = false;
10500
+ this.boundControl = false;
10501
+ this.selectList = [];
10502
+ this.selectListFlatGroup = [];
10503
+ this.isArray = isArray;
10504
+ this.layoutNode = input(undefined);
10505
+ this.layoutIndex = input(undefined);
10506
+ this.dataIndex = input(undefined);
10507
+ this.frameworkStyles = {
10508
+ daisyui: { selectClass: "select-box", optionClass: "checkbox tw:dui-checkbox", optionChecked: "active", optionUnchecked: "" },
10509
+ "bootstrap-3": { selectClass: "select-box", optionClass: "bs3-option checkbox display-inline-block", optionChecked: "active", optionUnchecked: "" },
10510
+ "bootstrap-4": { selectClass: "select-box", optionClass: "bs4-option checkbox display-inline-block", optionChecked: "active", optionUnchecked: "" },
10511
+ "bootstrap-5": { selectClass: " select-box", optionClass: "form-check-input display-inline-block", optionChecked: "active", optionUnchecked: "" },
10512
+ //"material-design":{selectClass:" ",optionClass:" "}
10513
+ };
10514
+ }
10515
+ ngOnInit() {
10516
+ this.options = this.layoutNode().options || {};
10517
+ this.activeFramework = this.jsfFLService.activeFramework.name;
10518
+ this.selectList = buildTitleMap(
10519
+ //this.options.titleMap || this.options.enumNames,
10520
+ //TODO review-title is set to null in the setTitle() method of CssFrameworkComponent
10521
+ this.options.enumNames || (this.options?.title && [this.options?.title])
10522
+ || [this.layoutNode().name],
10523
+ //this.options.enum,
10524
+ [true],
10525
+ //make required true to avoid creating 'none' select option
10526
+ true, !!this.options.flatList);
10527
+ //the selectListFlatGroup array will be used to update the formArray values
10528
+ //while the selectList array will be bound to the form select
10529
+ //as either a grouped select or a flat select
10530
+ /*
10531
+ this.selectListFlatGroup = buildTitleMap(
10532
+ this.options.titleMap || this.options.enumNames,
10533
+ this.options.enum, !!this.options.required, true
10534
+ )
10535
+ */
10536
+ this.jsf.initializeControl(this);
10537
+ this.selectValue = [this.controlValue];
10538
+ }
10539
+ deselectAll() {
10540
+ this.selectListFlatGroup.forEach(selItem => {
10541
+ selItem.checked = false;
10542
+ });
10543
+ }
10544
+ updateValue(event) {
10545
+ this.options.showErrors = true;
10546
+ this.controlValue = this.selectValue[0];
10547
+ this.jsf.updateValue(this, this.controlValue);
10548
+ }
10549
+ onSelectClicked($event) {
10550
+ this.selectValue = this.selectValue && this.selectValue[0] ? [false] : [true];
10551
+ this.controlValue = this.selectValue[0];
10552
+ this.jsf.updateValue(this, this.controlValue);
10553
+ }
10554
+ ngOnDestroy() {
10555
+ let nullVal = this.options.multiple ? [null] : null;
10556
+ this.formControl.reset(nullVal);
10557
+ this.controlValue = null;
10558
+ }
10559
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SelectCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10560
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: SelectCheckboxComponent, selector: "selectcheckbox-widget", inputs: { layoutNode: { classPropertyName: "layoutNode", publicName: "layoutNode", isSignal: true, isRequired: false, transformFunction: null }, layoutIndex: { classPropertyName: "layoutIndex", publicName: "layoutIndex", isSignal: true, isRequired: false, transformFunction: null }, dataIndex: { classPropertyName: "dataIndex", publicName: "dataIndex", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
10561
+ <div
10562
+ [class]="options?.htmlClass || ''">
10563
+ <select *ngIf="boundControl"
10564
+ [attr.aria-describedby]="'control' + layoutNode()?._id + 'Status'"
10565
+ [attr.readonly]="options?.readonly ? 'readonly' : null"
10566
+ [attr.required]="options?.required"
10567
+ [class]=" frameworkStyles[activeFramework].selectClass"
10568
+ [multiple]="true"
10569
+ [id]="'control' + layoutNode()?._id"
10570
+ [name]="controlName"
10571
+ [ngModel]="selectValue"
10572
+ >
10573
+ <ng-template ngFor let-selectItem [ngForOf]="selectList">
10574
+ <option *ngIf="!isArray(selectItem?.items)"
10575
+ [class]="frameworkStyles[activeFramework].optionClass"
10576
+ [class.active]="selectItem?.value === controlValue"
10577
+ [class.unchecked-notusing]="selectItem?.value != controlValue"
10578
+ [value]="selectItem?.value"
10579
+ (click)="onSelectClicked($event)"
10580
+ type="checkbox"
10581
+ >
10582
+ </option>
10583
+ <!--NB the text is out of the option element to display besides the checkbox-->
10584
+ <span [innerHTML]="selectItem?.name"></span>
10585
+ </ng-template>
10586
+ </select>
10587
+ <select *ngIf="!boundControl"
10588
+ [attr.aria-describedby]="'control' + layoutNode()?._id + 'Status'"
10589
+ [attr.readonly]="options?.readonly ? 'readonly' : null"
10590
+ [attr.required]="options?.required"
10591
+ [class]="frameworkStyles[activeFramework].selectClass +' select-box'"
10592
+ [multiple]="true"
10593
+ [disabled]="controlDisabled"
10594
+ [id]="'control' + layoutNode()?._id"
10595
+ [name]="controlName"
10596
+ (change)="updateValue($event)">
10597
+ <ng-template ngFor let-selectItem [ngForOf]="selectList">
10598
+ <option *ngIf="!isArray(selectItem?.items)"
10599
+ [selected]="selectItem?.value === controlValue"
10600
+ [class]="frameworkStyles[activeFramework].optionClass"
10601
+ [class.checked-notusing]="selectItem?.value === controlValue"
10602
+ [class.unchecked-notusing]]="selectItem?.value != controlValue"
10603
+ [value]="selectItem?.value"
10604
+ type="checkbox">
10605
+ </option>
10606
+ <!--NB the text is out of the option element to display besides the checkbox-->
10607
+ <span [innerHTML]="selectItem?.name"></span>
10608
+ </ng-template>
10609
+ </select>
10610
+
10611
+ </div>`, isInline: true, styles: [".select-box{font-size:16px;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none;height:25px;overflow:hidden;text-overflow:ellipsis;background-color:#fff;color:#000;background-color:transparent}.select-box:focus{outline:none}.select-option{font-size:20px;color:#000;background-color:#fff;display:inline-block}.unchecked:before{content:\"\\2610\";left:5px;top:50%;transform:translateY(-50%);font-size:30px}.checked:before{content:\"\\2611\";left:5px;top:50%;transform:translateY(-50%);font-size:30px}.select-option:checked{background-image:linear-gradient(0deg,#fff 0% 100%);color:#000}.select-box[multiple]:focus{background-color:transparent;color:#00f;-webkit-text-fill-color:black}.display-inline-block{display:inline-block}.bs4-option,.bs3-option{width:14px;height:14px;border:solid 1px;color:#a9a9a9;min-block-size:auto;border-radius:3px}.bs4-option:checked[type=checkbox],.bs3-option:checked[type=checkbox]{background-image:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!--%20License%3A%20MIT.%20Made%20by%20jaynewey%3A%20https%3A%2F%2Fgithub.com%2Fjaynewey%2Fcharm-icons%20--%3E%3Csvg%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222.5%22%3E%3Cpolyline%20points%3D%224%208.75%2C6.25%2012.25%2C13.25%203.5%22%2F%3E%3C%2Fsvg%3E);background-color:#00ced1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
10612
+ }
10613
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SelectCheckboxComponent, decorators: [{
10614
+ type: Component,
10615
+ args: [{ selector: 'selectcheckbox-widget', template: `
10616
+ <div
10617
+ [class]="options?.htmlClass || ''">
10618
+ <select *ngIf="boundControl"
10619
+ [attr.aria-describedby]="'control' + layoutNode()?._id + 'Status'"
10620
+ [attr.readonly]="options?.readonly ? 'readonly' : null"
10621
+ [attr.required]="options?.required"
10622
+ [class]=" frameworkStyles[activeFramework].selectClass"
10623
+ [multiple]="true"
10624
+ [id]="'control' + layoutNode()?._id"
10625
+ [name]="controlName"
10626
+ [ngModel]="selectValue"
10627
+ >
10628
+ <ng-template ngFor let-selectItem [ngForOf]="selectList">
10629
+ <option *ngIf="!isArray(selectItem?.items)"
10630
+ [class]="frameworkStyles[activeFramework].optionClass"
10631
+ [class.active]="selectItem?.value === controlValue"
10632
+ [class.unchecked-notusing]="selectItem?.value != controlValue"
10633
+ [value]="selectItem?.value"
10634
+ (click)="onSelectClicked($event)"
10635
+ type="checkbox"
10636
+ >
10637
+ </option>
10638
+ <!--NB the text is out of the option element to display besides the checkbox-->
10639
+ <span [innerHTML]="selectItem?.name"></span>
10640
+ </ng-template>
10641
+ </select>
10642
+ <select *ngIf="!boundControl"
10643
+ [attr.aria-describedby]="'control' + layoutNode()?._id + 'Status'"
10644
+ [attr.readonly]="options?.readonly ? 'readonly' : null"
10645
+ [attr.required]="options?.required"
10646
+ [class]="frameworkStyles[activeFramework].selectClass +' select-box'"
10647
+ [multiple]="true"
10648
+ [disabled]="controlDisabled"
10649
+ [id]="'control' + layoutNode()?._id"
10650
+ [name]="controlName"
10651
+ (change)="updateValue($event)">
10652
+ <ng-template ngFor let-selectItem [ngForOf]="selectList">
10653
+ <option *ngIf="!isArray(selectItem?.items)"
10654
+ [selected]="selectItem?.value === controlValue"
10655
+ [class]="frameworkStyles[activeFramework].optionClass"
10656
+ [class.checked-notusing]="selectItem?.value === controlValue"
10657
+ [class.unchecked-notusing]]="selectItem?.value != controlValue"
10658
+ [value]="selectItem?.value"
10659
+ type="checkbox">
10660
+ </option>
10661
+ <!--NB the text is out of the option element to display besides the checkbox-->
10662
+ <span [innerHTML]="selectItem?.name"></span>
10663
+ </ng-template>
10664
+ </select>
10665
+
10666
+ </div>`, standalone: false, styles: [".select-box{font-size:16px;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none;height:25px;overflow:hidden;text-overflow:ellipsis;background-color:#fff;color:#000;background-color:transparent}.select-box:focus{outline:none}.select-option{font-size:20px;color:#000;background-color:#fff;display:inline-block}.unchecked:before{content:\"\\2610\";left:5px;top:50%;transform:translateY(-50%);font-size:30px}.checked:before{content:\"\\2611\";left:5px;top:50%;transform:translateY(-50%);font-size:30px}.select-option:checked{background-image:linear-gradient(0deg,#fff 0% 100%);color:#000}.select-box[multiple]:focus{background-color:transparent;color:#00f;-webkit-text-fill-color:black}.display-inline-block{display:inline-block}.bs4-option,.bs3-option{width:14px;height:14px;border:solid 1px;color:#a9a9a9;min-block-size:auto;border-radius:3px}.bs4-option:checked[type=checkbox],.bs3-option:checked[type=checkbox]{background-image:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%3C!--%20License%3A%20MIT.%20Made%20by%20jaynewey%3A%20https%3A%2F%2Fgithub.com%2Fjaynewey%2Fcharm-icons%20--%3E%3Csvg%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222.5%22%3E%3Cpolyline%20points%3D%224%208.75%2C6.25%2012.25%2C13.25%203.5%22%2F%3E%3C%2Fsvg%3E);background-color:#00ced1}\n"] }]
10667
+ }] });
10668
+
10669
+ class TabComponent {
10670
+ constructor() {
10671
+ this.jsf = inject(JsonSchemaFormService);
10672
+ this.layoutNode = input(undefined);
10673
+ this.layoutIndex = input(undefined);
10674
+ this.dataIndex = input(undefined);
10675
+ }
10676
+ ngOnInit() {
10677
+ this.options = this.layoutNode().options || {};
10678
+ }
10679
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10680
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: TabComponent, selector: "tab-widget", inputs: { layoutNode: { classPropertyName: "layoutNode", publicName: "layoutNode", isSignal: true, isRequired: false, transformFunction: null }, layoutIndex: { classPropertyName: "layoutIndex", publicName: "layoutIndex", isSignal: true, isRequired: false, transformFunction: null }, dataIndex: { classPropertyName: "dataIndex", publicName: "dataIndex", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
10681
+ <div [class]="options?.htmlClass || ''">
10682
+ <root-widget
10683
+ [dataIndex]="dataIndex()"
10684
+ [layoutIndex]="layoutIndex()"
10685
+ [layout]="layoutNode().items"></root-widget>
10686
+ </div>`, isInline: true, dependencies: [{ kind: "component", type: RootComponent, selector: "root-widget", inputs: ["dataIndex", "layoutIndex", "layout", "isOrderable", "isFlexItem"] }] }); }
10687
+ }
10688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabComponent, decorators: [{
10689
+ type: Component,
10690
+ args: [{
10691
+ // tslint:disable-next-line:component-selector
10692
+ selector: 'tab-widget',
10693
+ template: `
10694
+ <div [class]="options?.htmlClass || ''">
10695
+ <root-widget
10696
+ [dataIndex]="dataIndex()"
10697
+ [layoutIndex]="layoutIndex()"
10698
+ [layout]="layoutNode().items"></root-widget>
10699
+ </div>`,
10700
+ }]
10701
+ }] });
10702
+
10703
+ const BASIC_WIDGETS = [
10704
+ AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent,
10705
+ CheckboxesComponent, FileComponent, HiddenComponent, InputComponent,
10706
+ MessageComponent, NoneComponent, NumberComponent, RadiosComponent,
10707
+ RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent,
10708
+ SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent,
10709
+ TemplateComponent, TextareaComponent, SelectCheckboxComponent
10710
+ ];
10711
+
10712
+ class WidgetLibraryModule {
10713
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10714
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, declarations: [AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent, CheckboxesComponent, FileComponent, HiddenComponent, InputComponent, MessageComponent, NoneComponent, NumberComponent, RadiosComponent, RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent, SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, TemplateComponent, TextareaComponent, SelectCheckboxComponent, OrderableDirective, ElementAttributeDirective], imports: [CommonModule, FormsModule, ReactiveFormsModule, i2$1.SortablejsModule], exports: [AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent, CheckboxesComponent, FileComponent, HiddenComponent, InputComponent, MessageComponent, NoneComponent, NumberComponent, RadiosComponent, RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent, SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, TemplateComponent, TextareaComponent, SelectCheckboxComponent, OrderableDirective, ElementAttributeDirective] }); }
10715
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, imports: [CommonModule, FormsModule, ReactiveFormsModule,
10716
+ SortablejsModule.forRoot({
10717
+ //disabled:false,
10718
+ //draggable:".draggableitem",//">:not(.nonsort)",//">.draggable-item",//":not(.nonsort)",//">*",//":not(.nonsort)",//":not(.non-draggable)",
10719
+ filter: ".sortable-filter", //needed to disable dragging on input range elements, class needs to be added to the element or its parent
10720
+ preventOnFilter: false, //needed for input range elements slider do still work
10721
+ onMove: function (/**Event*/ evt, /**Event*/ originalEvent) {
10722
+ if (evt.related.classList.contains("sortable-fixed")) {
10723
+ //console.log(evt.related);
10724
+ return false;
10725
+ }
10726
+ }
10727
+ })] }); }
10728
+ }
10729
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetLibraryModule, decorators: [{
10730
+ type: NgModule,
10731
+ args: [{
10732
+ imports: [CommonModule, FormsModule, ReactiveFormsModule,
10733
+ SortablejsModule.forRoot({
10734
+ //disabled:false,
10735
+ //draggable:".draggableitem",//">:not(.nonsort)",//">.draggable-item",//":not(.nonsort)",//">*",//":not(.nonsort)",//":not(.non-draggable)",
10736
+ filter: ".sortable-filter", //needed to disable dragging on input range elements, class needs to be added to the element or its parent
10737
+ preventOnFilter: false, //needed for input range elements slider do still work
10738
+ onMove: function (/**Event*/ evt, /**Event*/ originalEvent) {
10739
+ if (evt.related.classList.contains("sortable-fixed")) {
10740
+ //console.log(evt.related);
10741
+ return false;
10742
+ }
10743
+ }
10744
+ })],
10745
+ declarations: [...BASIC_WIDGETS, OrderableDirective, ElementAttributeDirective],
10746
+ exports: [...BASIC_WIDGETS, OrderableDirective, ElementAttributeDirective]
10747
+ }]
10748
+ }] });
10749
+
10750
+ // No framework - plain HTML controls (styles from form layout only)
10751
+ class NoFrameworkModule {
10752
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10753
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, declarations: [NoFrameworkComponent], imports: [CommonModule, WidgetLibraryModule], exports: [NoFrameworkComponent] }); }
10754
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, providers: [
10755
+ { provide: Framework, useClass: NoFramework, multi: true }
10756
+ ], imports: [CommonModule, WidgetLibraryModule] }); }
10757
+ }
10758
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NoFrameworkModule, decorators: [{
10759
+ type: NgModule,
10760
+ args: [{
10761
+ imports: [CommonModule, WidgetLibraryModule],
10762
+ declarations: [NoFrameworkComponent],
10763
+ exports: [NoFrameworkComponent],
10764
+ providers: [
10765
+ { provide: Framework, useClass: NoFramework, multi: true }
10766
+ ]
10767
+ }]
10768
+ }] });
10769
+
10557
10770
  const JSON_SCHEMA_FORM_VALUE_ACCESSOR = {
10558
10771
  provide: NG_VALUE_ACCESSOR,
10559
10772
  useExisting: forwardRef(() => JsonSchemaFormComponent),
@@ -11341,5 +11554,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
11341
11554
  * Generated bundle index. Do not edit.
11342
11555
  */
11343
11556
 
11344
- export { AddReferenceComponent, BASIC_WIDGETS, ButtonComponent, CheckboxComponent, CheckboxesComponent, ElementAttributeDirective, FileComponent, Framework, FrameworkLibraryService, HiddenComponent, InputComponent, JsonPointer, JsonSchemaFormComponent, JsonSchemaFormModule, JsonSchemaFormService, JsonValidators, MessageComponent, NoneComponent, NumberComponent, OneOfComponent, OrderableDirective, RadiosComponent, RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent, SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, TemplateComponent, TextareaComponent, WidgetLibraryModule, WidgetLibraryService, _executeAsyncValidators, _executeValidators, _mergeErrors, _mergeObjects, _toPromise, addClasses, buildFormGroup, buildFormGroupTemplate, buildLayout, buildLayoutFromSchema, buildSchemaFromData, buildSchemaFromLayout, buildTitleMap, checkInlineType, combineAllOf, commonItems, convertSchemaToDraft6, copy, deValidationMessages, enValidationMessages, esValidationMessages, fixRequiredArrayProperties, fixTitle, forEach, forEachCopy, formatFormData, frValidationMessages, getControl, getControlValidators, getFromSchema, getInputType, getLayoutNode, getSubSchema, getTitleMapFromOneOf, getType, hasNonNullValue, hasOwn, hasValue, inArray, isArray, isBoolean, isDate, isDefined, isEmpty, isFunction, isInputRequired, isInteger, isMap, isNumber, isObject, isObservable, isPrimitive, isPromise, isSet, isString, isType, itValidationMessages, mapLayout, mergeFilteredObject, mergeSchemas, path2ControlKey, ptValidationMessages, removeRecursiveReferences, resolveSchemaReferences, setControl, setRequiredFields, toJavaScriptType, toObservable, toSchemaType, toTitleCase, uniqueItems, updateInputOptions, xor, zhValidationMessages };
11557
+ export { AddReferenceComponent, BASIC_WIDGETS, ButtonComponent, CheckboxComponent, CheckboxesComponent, ElementAttributeDirective, FileComponent, Framework, FrameworkLibraryService, HiddenComponent, InputComponent, JsonPointer, JsonSchemaFormComponent, JsonSchemaFormModule, JsonSchemaFormService, JsonValidators, MessageComponent, NoneComponent, NumberComponent, OneOfComponent, OrderableDirective, RadiosComponent, RootComponent, SectionComponent, SelectCheckboxComponent, SelectComponent, SelectFrameworkComponent, SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, TemplateComponent, TextareaComponent, WidgetLibraryModule, WidgetLibraryService, _executeAsyncValidators, _executeValidators, _mergeErrors, _mergeObjects, _toPromise, addClasses, buildFormGroup, buildFormGroupTemplate, buildLayout, buildLayoutFromSchema, buildSchemaFromData, buildSchemaFromLayout, buildTitleMap, checkInlineType, combineAllOf, commonItems, convertSchemaToDraft6, copy, deValidationMessages, enValidationMessages, esValidationMessages, fixRequiredArrayProperties, fixTitle, forEach, forEachCopy, formatFormData, frValidationMessages, getControl, getControlValidators, getFromSchema, getInputType, getLayoutNode, getSubSchema, getTitleMapFromOneOf, getType, hasNonNullValue, hasOwn, hasValue, inArray, isArray, isBoolean, isDate, isDefined, isEmpty, isFunction, isInputRequired, isInteger, isMap, isNumber, isObject, isObservable, isPrimitive, isPromise, isSet, isString, isType, itValidationMessages, mapLayout, mergeFilteredObject, mergeSchemas, path2ControlKey, ptValidationMessages, removeRecursiveReferences, resolveSchemaReferences, setControl, setRequiredFields, toJavaScriptType, toObservable, toSchemaType, toTitleCase, uniqueItems, updateInputOptions, xor, zhValidationMessages };
11345
11558
  //# sourceMappingURL=ng-formworks-core.mjs.map