@tft/crispr-forms 21.0.3 → 21.0.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.
Files changed (64) hide show
  1. package/fesm2022/tft-crispr-forms-autocomplete-field.component-IB92ztLj.mjs +95 -0
  2. package/fesm2022/tft-crispr-forms-autocomplete-field.component-IB92ztLj.mjs.map +1 -0
  3. package/fesm2022/tft-crispr-forms-index-2ggYh_Ev.mjs +40 -0
  4. package/fesm2022/tft-crispr-forms-index-2ggYh_Ev.mjs.map +1 -0
  5. package/fesm2022/{tft-crispr-forms-index-UAYeTe3L.mjs → tft-crispr-forms-index-BIPapWdD.mjs} +2 -2
  6. package/fesm2022/{tft-crispr-forms-index-UAYeTe3L.mjs.map → tft-crispr-forms-index-BIPapWdD.mjs.map} +1 -1
  7. package/fesm2022/{tft-crispr-forms-index-kjMTlZoq.mjs → tft-crispr-forms-index-BJb-E_LR.mjs} +2 -2
  8. package/fesm2022/{tft-crispr-forms-index-kjMTlZoq.mjs.map → tft-crispr-forms-index-BJb-E_LR.mjs.map} +1 -1
  9. package/fesm2022/{tft-crispr-forms-index-joNvlmny.mjs → tft-crispr-forms-index-BN-qHciF.mjs} +2 -2
  10. package/fesm2022/{tft-crispr-forms-index-joNvlmny.mjs.map → tft-crispr-forms-index-BN-qHciF.mjs.map} +1 -1
  11. package/fesm2022/tft-crispr-forms-index-BQWfppWN.mjs +73 -0
  12. package/fesm2022/tft-crispr-forms-index-BQWfppWN.mjs.map +1 -0
  13. package/fesm2022/tft-crispr-forms-index-Bau6o4JD.mjs +68 -0
  14. package/fesm2022/tft-crispr-forms-index-Bau6o4JD.mjs.map +1 -0
  15. package/fesm2022/tft-crispr-forms-index-C6I8JpR5.mjs +39 -0
  16. package/fesm2022/tft-crispr-forms-index-C6I8JpR5.mjs.map +1 -0
  17. package/fesm2022/tft-crispr-forms-index-CXR7Jz3T.mjs +39 -0
  18. package/fesm2022/tft-crispr-forms-index-CXR7Jz3T.mjs.map +1 -0
  19. package/fesm2022/tft-crispr-forms-index-CZ8se247.mjs +179 -0
  20. package/fesm2022/tft-crispr-forms-index-CZ8se247.mjs.map +1 -0
  21. package/fesm2022/tft-crispr-forms-index-CjxxE8O4.mjs +2 -0
  22. package/fesm2022/tft-crispr-forms-index-CjxxE8O4.mjs.map +1 -0
  23. package/fesm2022/tft-crispr-forms-index-D699lPdT.mjs +40 -0
  24. package/fesm2022/tft-crispr-forms-index-D699lPdT.mjs.map +1 -0
  25. package/fesm2022/tft-crispr-forms-index-DOaGEZK0.mjs +36 -0
  26. package/fesm2022/tft-crispr-forms-index-DOaGEZK0.mjs.map +1 -0
  27. package/fesm2022/tft-crispr-forms-index-D_9DqcSv.mjs +88 -0
  28. package/fesm2022/tft-crispr-forms-index-D_9DqcSv.mjs.map +1 -0
  29. package/fesm2022/tft-crispr-forms-index-HP6w4mnV.mjs +181 -0
  30. package/fesm2022/tft-crispr-forms-index-HP6w4mnV.mjs.map +1 -0
  31. package/fesm2022/tft-crispr-forms-index-XA--BwG_.mjs +190 -0
  32. package/fesm2022/tft-crispr-forms-index-XA--BwG_.mjs.map +1 -0
  33. package/fesm2022/tft-crispr-forms-tft-crispr-forms-BFiZ8Nhn.mjs +982 -0
  34. package/fesm2022/tft-crispr-forms-tft-crispr-forms-BFiZ8Nhn.mjs.map +1 -0
  35. package/fesm2022/tft-crispr-forms.mjs +1 -973
  36. package/fesm2022/tft-crispr-forms.mjs.map +1 -1
  37. package/package.json +1 -1
  38. package/types/tft-crispr-forms.d.ts +38 -16
  39. package/fesm2022/tft-crispr-forms-autocomplete-field.component-ChocHy3F.mjs +0 -95
  40. package/fesm2022/tft-crispr-forms-autocomplete-field.component-ChocHy3F.mjs.map +0 -1
  41. package/fesm2022/tft-crispr-forms-index-BQFuEW6x.mjs +0 -40
  42. package/fesm2022/tft-crispr-forms-index-BQFuEW6x.mjs.map +0 -1
  43. package/fesm2022/tft-crispr-forms-index-BZ9V1Ec-.mjs +0 -39
  44. package/fesm2022/tft-crispr-forms-index-BZ9V1Ec-.mjs.map +0 -1
  45. package/fesm2022/tft-crispr-forms-index-BkCdLt5V.mjs +0 -40
  46. package/fesm2022/tft-crispr-forms-index-BkCdLt5V.mjs.map +0 -1
  47. package/fesm2022/tft-crispr-forms-index-Bypm5YtY.mjs +0 -137
  48. package/fesm2022/tft-crispr-forms-index-Bypm5YtY.mjs.map +0 -1
  49. package/fesm2022/tft-crispr-forms-index-CFwkbxFk.mjs +0 -88
  50. package/fesm2022/tft-crispr-forms-index-CFwkbxFk.mjs.map +0 -1
  51. package/fesm2022/tft-crispr-forms-index-DEctfeGr.mjs +0 -2
  52. package/fesm2022/tft-crispr-forms-index-DEctfeGr.mjs.map +0 -1
  53. package/fesm2022/tft-crispr-forms-index-DcrZSpdk.mjs +0 -73
  54. package/fesm2022/tft-crispr-forms-index-DcrZSpdk.mjs.map +0 -1
  55. package/fesm2022/tft-crispr-forms-index-DmaDlaNf.mjs +0 -68
  56. package/fesm2022/tft-crispr-forms-index-DmaDlaNf.mjs.map +0 -1
  57. package/fesm2022/tft-crispr-forms-index-Hsgr_WHO.mjs +0 -190
  58. package/fesm2022/tft-crispr-forms-index-Hsgr_WHO.mjs.map +0 -1
  59. package/fesm2022/tft-crispr-forms-index-gORcx6V1.mjs +0 -36
  60. package/fesm2022/tft-crispr-forms-index-gORcx6V1.mjs.map +0 -1
  61. package/fesm2022/tft-crispr-forms-index-lrhnilye.mjs +0 -39
  62. package/fesm2022/tft-crispr-forms-index-lrhnilye.mjs.map +0 -1
  63. package/fesm2022/tft-crispr-forms-index-uu4CyAEP.mjs +0 -182
  64. package/fesm2022/tft-crispr-forms-index-uu4CyAEP.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tft-crispr-forms.mjs","sources":["../../../../libs/crispr-forms/src/lib/utils/operators/form.operators.ts","../../../../libs/crispr-forms/src/lib/utils/models/select-field.config.ts","../../../../libs/crispr-forms/src/lib/utils/models/crispr-field.config.ts","../../../../libs/crispr-forms/src/lib/utils/functions/createControlForType.ts","../../../../libs/crispr-forms/src/lib/utils/functions/isControlConfig.ts","../../../../libs/crispr-forms/src/lib/utils/functions/buildFormGroupFromConfig.ts","../../../../libs/crispr-forms/src/lib/utils/functions/callOptionsIfFunction.ts","../../../../libs/crispr-forms/src/lib/utils/functions/filterOptionsByLabel.ts","../../../../libs/crispr-forms/src/lib/utils/functions/observablifyOptions.ts","../../../../libs/crispr-forms/src/lib/utils/functions/image-compression.helpers.ts","../../../../libs/crispr-forms/src/lib/utils/abstracts/crispr-field.abstract.ts","../../../../libs/crispr-forms/src/lib/utils/abstracts/crispr-control.abstract.ts","../../../../libs/crispr-forms/src/lib/utils/abstracts/autocomplete-field.abstract.ts","../../../../libs/crispr-forms/src/lib/utils/abstracts/crispr-display-field.abstract.ts","../../../../libs/crispr-forms/src/lib/field-component-map.const.ts","../../../../libs/crispr-forms/src/lib/field.directive.ts","../../../../libs/crispr-forms/src/lib/pipes/initial-control-value.pipe.ts","../../../../libs/crispr-forms/src/lib/pipes/crispr-pipes.module.ts","../../../../libs/crispr-forms/src/lib/form/form.component.ts","../../../../libs/crispr-forms/src/lib/form/form.component.html","../../../../libs/crispr-forms/src/lib/ui/file-dropzone/file-dropzone.directive.ts","../../../../libs/crispr-forms/src/lib/ui/info/info.component.ts","../../../../libs/crispr-forms/src/lib/ui/info/info.component.html","../../../../libs/crispr-forms/src/lib/ui/heading/heading.component.ts","../../../../libs/crispr-forms/src/lib/ui/heading/heading.component.html","../../../../libs/crispr-forms/src/lib/ui/field-container/field-container.component.ts","../../../../libs/crispr-forms/src/lib/ui/field-container/field-container.component.html","../../../../libs/crispr-forms/src/lib/ui/selected-file/selected-file.component.ts","../../../../libs/crispr-forms/src/lib/ui/selected-file/selected-file.component.html","../../../../libs/crispr-forms/src/lib/ui/file-upload-field/file-upload-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/file-upload-field/file-upload-field.component.html","../../../../libs/crispr-forms/src/lib/display-field.directive.ts","../../../../libs/crispr-forms/src/lib/form-group-list/form-group-list.component.ts","../../../../libs/crispr-forms/src/lib/form-group-list/form-group-list.component.html","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.component.ts","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.component.html","../../../../libs/crispr-forms/src/lib/sub-group/sub-group.module.ts","../../../../libs/crispr-forms/src/lib/crispr-forms.module.ts","../../../../libs/crispr-forms/tft-crispr-forms.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nexport function valueIn (values: string[]) {\n return map( (value: string) => {\n if (value) {\n return values.some(v => {\n if (isRegex(v)) {\n const trimmedStringForRegex = v.substr(1, v.length - 2);\n const regex = new RegExp(trimmedStringForRegex);\n return regex.test(value);\n } else {\n return v === value;\n }\n });\n } else {\n return false;\n }\n });\n}\n\nfunction isRegex(string: string) {\n return string.startsWith('/') && string.endsWith('/');\n}\n","import { Observable } from 'rxjs';\nimport { FormGroup } from '@angular/forms';\nimport { ControlType, FieldDescriptors, Info, MatFieldProperties, CrisprControlConfig } from './crispr-field.config';\n\nexport interface SelectFieldConfig extends Omit<CrisprControlConfig, 'placeholder'>,\n FieldDescriptors,\n MatFieldProperties {\n controlType: ControlType.SELECT,\n emptyOptionsMessage?: string;\n multiple?: boolean;\n enableToggleAll?: boolean;\n options: OptionsType;\n}\n\nexport type OptionsType = SelectOption[] | Observable<SelectOption[]> | OptionsCallback | Promise<SelectOption[]>;\n\nexport type OptionsCallback = (group?: FormGroup) => OptionsType;\nexport type ReactiveOptionsCallback = (group?: FormGroup) => Observable<SelectOption[]>;\n// tslint:disable-next-line: max-line-length\nexport type AutocompleteOptionsCallback = (group?: FormGroup, searchTerm?: string) => OptionsType;\nexport interface SelectOption {\n label: string;\n value: any;\n imageUrl?: string;\n info?: Info;\n}\n\nexport const DEFAULT_EMPTY_OPTIONS_MESSAGE = 'No Items';\n","import { FormGroup, ValidatorFn } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { TooltipPosition } from '@angular/material/tooltip';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\n\nimport { ErrorDictionary } from '@tft/form-validation-handler';\n\nimport type {\n SelectFieldConfig,\n HeadingConfig,\n ButtonConfig,\n DatepickerFieldConfig,\n InputFieldConfig,\n CheckboxFieldConfig,\n TextareaFieldConfig,\n AutocompleteFieldConfig,\n FormGroupListConfig,\n AutocompleteChiplistFieldConfig,\n SliderFieldConfig,\n DividerConfig,\n SelectOption,\n RadioFieldConfig,\n ImageUploadFieldConfig,\n FileUploadFieldConfig,\n UnitConversionFieldConfig,\n MapFieldConfig\n} from '../models';\n\nimport { ThemePalette } from '@angular/material/core';\n\n// export type ControlType = keyof typeof FIELD_COMPONENTS;\nexport enum ControlType {\n AUTOCOMPLETE = 'autocomplete',\n AUTOCOMPLETE_CHIPLIST = 'autocompleteChiplist',\n BUTTON = 'button',\n CHECKBOX = 'checkbox',\n CUSTOM = 'custom',\n DATEPICKER = 'datepicker',\n DIVIDER = 'divider',\n FILE_UPLOAD = 'fileUpload',\n GROUP_LIST = 'groupList',\n HEADING = 'heading',\n IMAGE_UPLOAD = 'imageUpload',\n INPUT = 'input',\n MAP = 'map',\n RADIO = 'radio',\n SELECT = 'select',\n SLIDER = 'slider',\n SUB_GROUP = 'subGroup',\n TEXTAREA = 'textarea',\n UNIT_CONVERSION = 'unitConversion',\n}\n\n/**\n * The base interface for all the fields in the form's config\n */\nexport interface CrisprFieldConfig {\n controlType?: ControlType;\n classes?: string[];\n component?: any; // TODO: Define this better\n}\n\n/**\n * A utility type that returns the keys of a type if one is passed otherwise return string type\n */\ntype RestrictedControlName<M> = M extends null ? string : keyof M;\n/**\n * The base interface for all control configs\n */\nexport interface CrisprControlConfig<M = null> extends CrisprFieldConfig {\n controlName: RestrictedControlName<M>\n controlType: ControlType;\n validators?: ValidatorFn[];\n computeValue?: (group: FormGroup) => Observable<unknown>;\n disabledCallback?: (group: FormGroup) => Observable<boolean>;\n /**\n * Hide the control when disabled\n * @default false\n */\n hideDisabled?: boolean;\n heading?: HeadingConfig;\n hint?: string;\n}\n\n/**\n * Holds properties for control fields that describe field behavior to users\n */\nexport interface FieldDescriptors {\n label: string;\n info?: Info;\n fieldSuffix?: string;\n placeholder?: string;\n}\n\nexport interface MatFieldProperties {\n appearance?: MatFormFieldAppearance;\n color?: ThemePalette;\n}\n\nexport interface Info {\n content: string;\n tooltipPosition?: TooltipPosition;\n iconName?: string;\n}\n\n// TODO: having AnyFieldConfig as the default for C seems redundant and silly\nexport interface AbstractGroupConfig<C extends CrisprFieldConfig = AnyFieldConfig> {\n // this union is needed, it joins any custom config provided by users to our default config options\n fields?: (AnyFieldConfig | C)[];\n}\nexport interface FormConfig<C = AnyFieldConfig> extends AbstractGroupConfig<C> {\n classes?: string[];\n errorDictionary?: ErrorDictionary;\n autoComplete?: string;\n /** @deprecated use autoComplete */\n autocomplete?: string;\n validators?: ValidatorFn[];\n}\n/**\n * Configuration for SubGroup components\n */\nexport interface SubGroupConfig extends CrisprControlConfig, AbstractGroupConfig<any> {\n controlType: ControlType.SUB_GROUP;\n}\n\nexport type AnyFieldConfig = InputFieldConfig\n | SelectFieldConfig\n | RadioFieldConfig\n | FormGroupListConfig\n | SubGroupConfig\n | AutocompleteFieldConfig\n | AutocompleteChiplistFieldConfig\n | TextareaFieldConfig\n | CheckboxFieldConfig\n | DatepickerFieldConfig\n | MapFieldConfig\n | SliderFieldConfig\n | FileUploadFieldConfig\n | ImageUploadFieldConfig\n | HeadingConfig\n | ButtonConfig\n | DividerConfig\n | UnitConversionFieldConfig;\n // | CustomFieldConfig;\n\n\nexport type ControlValue<T = any> = boolean | string | number | Date | SelectOption | SelectOption[] | ControlGroupValue | T;\n\nexport type ControlGroupValue = {[key: string]: ControlValue};\n","import { FormArray, FormControl } from \"@angular/forms\";\nimport { AnyFieldConfig, ControlType, ControlValue, CrisprControlConfig, FormConfig, FormGroupListConfig } from \"../models\";\nimport { buildFormGroupFromConfig } from \"./\";\n\n/**\n * Analyze the config and build a form control to spec. Notice we don't use FormBuilder here\n * as we want to keep this function pure.\n * @param controlConfig the configuration object for the control to build\n * @param value an initial value to use if passed in\n */\n export function createControlForType(controlConfig: AnyFieldConfig, value: ControlValue = null) {\n // build form control out based on the control type\n const control = controlConfig.controlType === ControlType.SUB_GROUP\n ? buildFormGroupFromConfig(controlConfig as FormConfig, value)\n : controlConfig.controlType === ControlType.GROUP_LIST\n ? new FormArray([], (controlConfig as FormGroupListConfig).validators)\n : new FormControl(\n value || null,\n (controlConfig as CrisprControlConfig).validators\n );\n\n return control;\n}\n","import { CrisprControlConfig, CrisprFieldConfig } from \"../models\";\n\n/**\n * Determines if the field config is for a form control (not a divider, heading or other non-control field)\n */\n export function isControlConfig(fieldConfig: CrisprFieldConfig): fieldConfig is CrisprControlConfig {\n return 'controlName' in fieldConfig;\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { AnyFieldConfig, FormConfig } from \"../models\";\nimport { createControlForType } from \"./createControlForType\";\nimport { isControlConfig } from \"./isControlConfig\";\n\n/**\n * builds out form group based on config\n * @param config a configuration for a form group\n * @param value an object of initial values to pass in\n * @param group the form group to modify and build out\n */\n export function buildFormGroupFromConfig(config: FormConfig, value = null, group: FormGroup = new FormGroup({}) ) {\n config.fields.forEach( (controlConfig: AnyFieldConfig) => {\n if (isControlConfig(controlConfig)) {\n // then add a control to the group using the controlName from configuration\n const {controlName} = controlConfig;\n if (group.get(controlName)) {\n group.removeControl(controlName);\n }\n // if there's a value object and it has a non-null/undefined value for this field use it.\n // Otherwise, default to null\n const controlValue = (value && value[controlName]) ?? null;\n const control = createControlForType(controlConfig, controlValue)\n group.addControl(controlName, control);\n }\n });\n group.setValidators(config.validators);\n return group;\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { AutocompleteOptionsCallback, OptionsType } from \"../models\";\n\nexport function callOptionsIfFunction(\n options: OptionsType | AutocompleteOptionsCallback,\n parentGroup?: FormGroup,\n searchString?: string\n): OptionsType {\n return options instanceof Function ? options(parentGroup, searchString) : options;\n}\n","import { SelectOption } from \"../models\";\n\n/**\n * A basic filter function that filters the search string against the label of the options object\n * @param options the array of options to filter\n * @param searchString the string from the input\n */\n export function filterOptionsByLabel(options: SelectOption[], searchString: string) {\n return options.filter(option => {\n return option.label && option.label.toLowerCase().includes(searchString.toLowerCase());\n });\n}\n","import { FormGroup } from \"@angular/forms\";\nimport { from, isObservable, Observable, of } from \"rxjs\";\nimport { OptionsType, SelectOption } from \"../models\";\nimport { callOptionsIfFunction } from \"./callOptionsIfFunction\";\n\n/**\n * The user can give us select options as an array, a function that resolves to a promise,\n * or an observable. This functions consumes any of those and returns an observable that\n * resolves an array of options\n *\n * @param options the options passed in from the config\n * @param emptyMessageOption the message to display when the array is empty\n */\n export function observablifyOptions(\n options: OptionsType,\n parentGroup: FormGroup,\n searchString?: string,\n): Observable<SelectOption[]> {\n const calledOptions = callOptionsIfFunction(options, parentGroup, searchString);\n // if options are a promise\n const observableOptions = calledOptions instanceof Promise\n // convert to observable\n ? from(calledOptions)\n // if array that isn't empty\n : Array.isArray(calledOptions) && calledOptions.length\n // convert to observable\n ? of(calledOptions)\n // if observable\n : isObservable(calledOptions)\n // return it\n ? calledOptions\n // else an empty array\n : of([]);\n return observableOptions;\n}\n","import { FormControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nexport function convertBytesToMb( bytes: number): number {\n return bytes/1048576;\n}\n\nexport function maxFileSizeValidator(maxFileSize: number): ValidatorFn {\n return (control: FormControl): ValidationErrors | null => {\n const controlValue = control.value;\n if (!(controlValue instanceof File)) {\n return null;\n }\n const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);\n if (maxFileSize > actualFileSize) return null;\n return {maxFileSize: { maxFileSize, actualFileSize }};\n }\n}\n\nexport function allowedFileExtValidator(allowedFileExtensions: string[], onlyAllowFiles = true): ValidatorFn {\n return (control: FormControl): ValidationErrors | null => {\n const controlValue = control.value;\n const isFile = controlValue instanceof File;\n if (!onlyAllowFiles && !isFile) return null;\n const actualExtension = isFile ? controlValue.name.split('.').pop().toLocaleLowerCase() : 'Not a file';\n const isAllowedExtension = allowedFileExtensions.includes(actualExtension);\n if(isAllowedExtension) {\n return null;\n }\n return {allowedExtension: { allowedFileExtensions, actualExtension }};\n }\n}\n\nexport function allowedFileType(matchExp: string | RegExp): ValidatorFn {\n return (formControl) => {\n const value = (formControl as FormControl).value;\n if (!(value instanceof File)) return null\n const type = value.type;\n const matches = type.match(matchExp)\n if (!type || !matches?.length) {\n return {\n allowedFileType: {\n actualType: type,\n allowedTypeExp: matchExp\n }\n }\n } else {\n return null\n }\n };\n}\n","import type {\n CrisprFieldConfig,\n} from '../models';\nimport { Directive, signal, Input} from '@angular/core';\n\n@Directive({\n standalone: true\n})\nexport abstract class CrisprFieldComponent<C extends CrisprFieldConfig> {\n\n defaultConfig?: Partial<C>;\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input({alias: 'config'})\n set inputConfig(config: C) {\n this.updateConfig(config);\n }\n\n private updateConfig(inputConfig: C) {\n const mergedConfig = this.defaultConfig ? {...this.defaultConfig, ...inputConfig} : inputConfig;\n this.config.set(mergedConfig);\n }\n\n config = signal<C | null>(null);\n}\n\n\n","\nimport { FormGroup, AbstractControl } from '@angular/forms';\nimport { CrisprControlConfig, ControlValue, ControlType } from '../models/crispr-field.config';\nimport { computed, DestroyRef, Directive, effect, EventEmitter, inject, Input, OnInit, Output, signal } from '@angular/core';\nimport { CrisprFieldComponent } from './crispr-field.abstract';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Directive({\n standalone: true\n})\nexport class CrisprControlComponent<C extends CrisprControlConfig> extends CrisprFieldComponent<C> implements OnInit {\n destroyRef = inject(DestroyRef);\n group = signal<FormGroup>(null);\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input({alias: 'group'})\n set inputGroup(group: ControlValue) {\n this.group.set(group);\n }\n\n control = computed<AbstractControl>(() => this.group()?.get(this.config().controlName))\n\n @Output() valueChanges: EventEmitter<ControlValue> = new EventEmitter<ControlValue>();\n\n value = signal<ControlValue>(null); \n /*\n * Having the input alias allows us to consume these components in the traditional Angular way as well as progammatically in the form builder\n */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input({alias: 'value'}) \n set inputValue(value: ControlValue) {\n this.value.set(value);\n }\n\n constructor() {\n super();\n effect(() => {\n this.setControlValue(this.value())\n })\n }\n \n ngOnInit() {\n this.control().valueChanges.pipe(\n takeUntilDestroyed(this.destroyRef),\n ).subscribe((value: ControlValue) => {\n this.valueChanges.emit(value);\n });\n // setTimeouts are ugly but this seems to be the only way to get the computed field to compute initial values\n setTimeout(()=> {\n this.control().updateValueAndValidity();\n })\n }\n\n setControlValue(value: ControlValue) {\n if(value && this.control() && this.config().controlType !== ControlType.SUB_GROUP) {\n this.control().setValue(value)\n }\n }\n}\n\n","import { OnInit, Directive, signal } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, shareReplay, startWith, switchMap } from 'rxjs/operators';\n\nimport type { AutocompleteFieldConfig, AutocompleteChiplistFieldConfig, SelectOption } from '../models';\nimport { observablifyOptions } from '../functions';\nimport { CrisprControlComponent } from './crispr-control.abstract';\n\ntype AutocompleteConfigTypes = AutocompleteFieldConfig | AutocompleteChiplistFieldConfig;\n\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class AbstractAutocompleteComponent<C>\n extends CrisprControlComponent<AutocompleteConfigTypes> implements OnInit {\n // we need a separate control for the UI because of the way the material autocomplete chiplist works\n autocompleteInputControl = new FormControl('');\n options$: Observable<SelectOption[]>\n config = signal<AutocompleteConfigTypes & C>(null);\n ngOnInit() {\n super.ngOnInit();\n\n this.group().addControl(this.config().controlName, new FormControl());\n // filter options by the search string using either the default filter function or one passed in through config()\n this.options$ = this.autocompleteInputControl.valueChanges.pipe(\n // this is needed to have the options panel to open on focus\n startWith(''),\n debounceTime(this.config().typeDebounceTime),\n map((searchText: string) => typeof searchText === 'string' ? searchText?.trim() : ''),\n distinctUntilChanged(),\n switchMap((searchText: string) => observablifyOptions(this.config().options, this.group(), searchText)),\n shareReplay(1),\n );\n }\n}\n","import type {\n CrisprControlConfig,\n} from '../models';\nimport { OnInit, Directive } from '@angular/core';\nimport { CrisprControlComponent } from './crispr-control.abstract';\n\n\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class CrisprDisplayFieldComponent extends CrisprControlComponent<CrisprControlConfig> implements OnInit {\n index?: number;\n}\n\n\n","import type { FormGroupListComponent } from './form-group-list/form-group-list.component';\nimport type { SubGroupComponent } from './sub-group/sub-group.component';\nimport type { HeadingComponent } from './ui';\nimport type { ImageUploadFieldComponent } from './ui/image-upload-field';\nimport type { DatepickerFieldComponent } from './ui/datepicker-field';\nimport type { CheckboxFieldComponent } from './ui/checkbox-field';\nimport type { TextareaFieldComponent } from './ui/textarea-field';\nimport type { AutocompleteFieldComponent } from './ui/autocomplete-field';\nimport type { SelectFieldComponent } from './ui/select-field';\nimport type { InputFieldComponent } from './ui/input-field';\nimport type { RadioFieldComponent } from './ui/radio-field';\nimport type { FileUploadFieldComponent } from './ui/file-upload-field';\nimport type { SliderFieldComponent } from './ui/slider-field';\nimport type { DividerComponent } from './ui/divider';\nimport type { ButtonComponent } from './ui/button';\nimport type { UnitConversionFieldComponent } from './ui/unit-conversion-field';\n\nimport type { AutocompleteChiplistFieldComponent } from './ui/autocomplete-chiplist-field';\n\nimport { isControlConfig, ControlType } from './utils';\nimport { MapFieldComponent } from './ui/map';\n\nexport const FIELD_COMPONENTS = {\n groupList: () =>\n import('./form-group-list').then(\n ({ FormGroupListComponent }) => FormGroupListComponent\n ),\n subGroup: () =>\n import('./sub-group').then(({ SubGroupComponent }) => SubGroupComponent),\n button: () =>\n import('./ui/button').then(\n ({ ButtonComponent }) => ButtonComponent\n ),\n input: () =>\n import('./ui/input-field').then(\n ({ InputFieldComponent }) => InputFieldComponent\n ),\n select: () =>\n import('./ui/select-field').then(\n ({ SelectFieldComponent }) => SelectFieldComponent\n ),\n radio: () =>\n import('./ui/radio-field').then(\n ({ RadioFieldComponent }) => RadioFieldComponent\n ),\n autocomplete: () =>\n import('./ui/autocomplete-field').then(\n ({ AutocompleteFieldComponent }) => AutocompleteFieldComponent\n ),\n autocompleteChiplist: () =>\n import('./ui/autocomplete-chiplist-field').then(\n ({ AutocompleteChiplistFieldComponent }) => AutocompleteChiplistFieldComponent\n ),\n map: () =>\n import('./ui/map').then(\n ({ MapFieldComponent }) => MapFieldComponent\n ),\n textarea: () =>\n import('./ui/textarea-field').then(\n ({ TextareaFieldComponent }) => TextareaFieldComponent\n ),\n checkbox: () =>\n import('./ui/checkbox-field').then(\n ({ CheckboxFieldComponent }) => CheckboxFieldComponent\n ),\n slider: () =>\n import('./ui/slider-field').then(\n ({ SliderFieldComponent }) => SliderFieldComponent\n ),\n datepicker: () =>\n import('./ui/datepicker-field').then(\n ({ DatepickerFieldComponent }) => DatepickerFieldComponent\n ),\n fileUpload: () =>\n import('./ui/file-upload-field').then(\n ({ FileUploadFieldComponent }) => FileUploadFieldComponent\n ),\n imageUpload: () =>\n import('./ui/image-upload-field').then(\n ({ ImageUploadFieldComponent }) => ImageUploadFieldComponent\n ),\n heading: () =>\n import('./ui').then(\n ({ HeadingComponent }) => HeadingComponent\n ),\n divider: () =>\n import('./ui/divider').then(\n ({ DividerComponent }) => DividerComponent\n ),\n unitConversion: () =>\n import('./ui/unit-conversion-field').then(\n ({ UnitConversionFieldComponent }) => UnitConversionFieldComponent\n ),\n};\n\nexport function isControlComponent(\n component: CrisprFieldComponentType\n): component is CrisprControlComponentType {\n return component && isControlConfig(component.config()) && 'value' in component;\n}\n\nexport function isControlOrButtonComponent(\n component: CrisprFieldComponentType\n): component is CrisprControlOrButton {\n return (\n isControlComponent(component) ||\n component.config().controlType === ControlType.BUTTON\n );\n}\n\nexport type CrisprControlOrButton =\n | CrisprControlComponentType\n | ButtonComponent;\n\nexport type CrisprControlComponentType =\n | InputFieldComponent\n | SelectFieldComponent\n | RadioFieldComponent\n | SubGroupComponent\n | FormGroupListComponent\n | AutocompleteFieldComponent\n | AutocompleteChiplistFieldComponent\n | TextareaFieldComponent\n | CheckboxFieldComponent\n | SliderFieldComponent\n | FileUploadFieldComponent\n | ImageUploadFieldComponent\n | DatepickerFieldComponent\n | UnitConversionFieldComponent\n | MapFieldComponent;\n\nexport type ComponentKeys = keyof typeof FIELD_COMPONENTS;\n// export type CrisprFieldComponent = FIELD_COMPONENTS[ComponentKeys];\n\nexport type CrisprFieldComponentType =\n | CrisprControlComponentType\n | HeadingComponent\n | DividerComponent\n | ButtonComponent;\n","import {\n Directive,\n Input,\n ViewContainerRef,\n Renderer2,\n OnInit,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport {\n CrisprFieldComponentType,\n FIELD_COMPONENTS,\n isControlComponent,\n isControlOrButtonComponent,\n} from './field-component-map.const';\nimport { AnyFieldConfig, ControlValue } from './utils';\n\n@Directive({\n selector: '[crisprField]',\n standalone: true,\n})\nexport class CrisprFieldDirective implements OnInit {\n\n @Input() config: AnyFieldConfig;\n @Input() group: FormGroup;\n /**\n * value setter updates the control's value as well\n */\n _value: ControlValue | any[];\n @Input() set value(value: ControlValue | any[]) {\n this._value = value;\n // This is needed to keep the group list from resetting control values to the initial input value\n this.updateComponentValue(value);\n }\n get value() {\n return this._value;\n }\n\n component: CrisprFieldComponentType;\n\n constructor(\n private container: ViewContainerRef,\n private renderer: Renderer2,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n /**\n * create component and set values from config on its instance\n */\n const component =\n this.config.component ||\n (await FIELD_COMPONENTS[this.config.controlType]());\n const componentRef =\n this.container.createComponent<CrisprFieldComponentType>(component);\n\n this.component = componentRef.instance;\n componentRef.setInput('config', this.config);\n if (isControlOrButtonComponent(this.component)) {\n componentRef.setInput('group', this.group);\n }\n this.updateComponentValue(this.value);\n // adds any config classes to the dynamically generated component\n // doing this here keeps us from having to extend a base component into each field component individually\n if (!this.config.classes) return;\n this.config.classes.forEach((klass) => {\n // check for passing multiple classes in one array element\n if (klass.includes(' ')) {\n throw Error(\n `Improperly formatted class. '${klass}' cannot contain spaces.`\n );\n } else {\n this.renderer.addClass(componentRef.location.nativeElement, klass);\n }\n });\n }\n\n updateComponentValue(value: ControlValue) {\n if (isControlComponent(this.component)) {\n this.component.value.set(value);\n // SubGroups won't populate without this detectChanges\n this.cdr.detectChanges();\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport {\n ControlValue,\n AnyFieldConfig,\n isControlConfig,\n} from '../utils';\n\n@Pipe({\n name: 'initialControlValue',\n standalone: false\n})\nexport class InitialControlValuePipe implements PipeTransform {\n // TODO: does changing any to unknown break anything?\n transform(\n initialFormValue: { [key: string]: ControlValue | any },\n fieldConfig: AnyFieldConfig\n ): unknown {\n return initialFormValue && isControlConfig(fieldConfig)\n ? initialFormValue[fieldConfig.controlName] || null\n : null;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { InitialControlValuePipe } from \"./initial-control-value.pipe\";\n\n@NgModule({\n imports: [\n CommonModule\n ],\n exports: [\n InitialControlValuePipe\n ],\n declarations: [\n InitialControlValuePipe\n ]\n})\n\nexport class CrisprPipesModule {\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport {\n ControlGroupValue,\n FormConfig,\n buildFormGroupFromConfig,\n} from '../utils';\n\n@Component({\n selector: 'crispr-form',\n styleUrls: ['form.component.scss'],\n templateUrl: 'form.component.html',\n imports: [\n CommonModule,\n CrisprFieldDirective,\n ReactiveFormsModule,\n FormValidationHandlerModule,\n CrisprPipesModule,\n ]\n})\nexport class CrisprFormComponent implements OnInit {\n // if no form has been passed in by consuming component, we create an empty group to build out\n @Input() config: FormConfig;\n @Input() form: FormGroup = new FormGroup({});\n @Input() value: ControlGroupValue = null;\n\n @Output() submitted = new EventEmitter<FormGroup>();\n // proxy value and status change events through to consuming component\n @Output() valueChanges: Observable<any> = this.form.valueChanges;\n @Output() statusChanges: Observable<string> = this.form.statusChanges;\n\n @ViewChild('submitTrigger') submitTrigger: ElementRef<HTMLButtonElement>;\n\n ngOnInit() {\n // build out the form, note that we pass in the form as the third argument and the function modifies it\n buildFormGroupFromConfig(this.config, this.value, this.form);\n }\n\n handleSubmit() {\n this.form.markAllAsTouched();\n this.submitted.emit(this.form);\n }\n\n triggerSubmit() {\n this.submitTrigger.nativeElement.click();\n }\n}\n","<form\n class=\"crispr-form\"\n [ngClass]=\"config.classes\"\n [formGroup]=\"form\"\n (ngSubmit)=\"handleSubmit()\"\n [autocomplete]=\"config.autocomplete || 'off'\"\n [errorDictionary]=\"config.errorDictionary\"\n #ngFormElement=\"ngForm\">\n\n @for (field of config.fields; track field) {\n <ng-container\n crisprField\n [value]=\"value | initialControlValue : field\"\n [config]=\"field\"\n [group]=\"form\">\n </ng-container>\n }\n <!-- Hidden button, programmatically clicked when crispr form triggerSubmit function called.\n Uses a hidden button with type=\"submit\" because it will trigger both native form submit event\n (which the error handler has to listen for) and ngSubmit event -->\n <button #submitTrigger class=\"submit-trigger\" data-testid=\"submit-trigger\" type=\"submit\">\n </button>\n</form>\n","import { Directive, HostListener, Output, EventEmitter, Input } from '@angular/core';\n\n@Directive({\n selector: '[crisprFileDropzone]',\n standalone: true,\n})\nexport class FileDropzoneDirective {\n\n @Output() fileDrop = new EventEmitter<FileList>();\n\n @Input() crisprFileDropzone = true;\n\n @HostListener('drop', ['$event'])\n onDrop($event: DragEvent) {\n if(this.crisprFileDropzone) {\n $event.preventDefault();\n this.fileDrop.emit($event.dataTransfer.files);\n }\n }\n\n // Prevents DOM from trying to open file in browser\n @HostListener('dragover', ['$event'])\n onDragOver($event: DragEvent) {\n if(this.crisprFileDropzone) {\n $event.preventDefault();\n }\n }\n}\n","\nimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport type { Info } from '../../utils';\n\n@Component({\n selector: 'crispr-info',\n templateUrl: './info.component.html',\n styleUrls: ['./info.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatIconModule,\n MatTooltipModule\n ]\n})\nexport class InfoComponent {\n\n @Input() info: Info;\n\n}\n","@if (info) {\n <mat-icon\n [matTooltip]=\"info.content\"\n [matTooltipPosition]=\"info.tooltipPosition || 'below'\">\n {{info.iconName || 'info'}}\n </mat-icon>\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\n// eslint-disable-next-line @nx/enforce-module-boundaries\nimport { CrisprFieldComponent, HeadingConfig } from '../../utils';\nimport { CommonModule } from '@angular/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { InfoComponent } from '../info';\n\nconst defaultConfig: Partial<HeadingConfig> = {\n typographyClass: 'mat-h3',\n};\n@Component({\n selector: 'crispr-heading',\n templateUrl: './heading.component.html',\n styleUrls: ['./heading.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, MatFormFieldModule, InfoComponent],\n standalone: true\n})\nexport class HeadingComponent extends CrisprFieldComponent<HeadingConfig> {\n defaultConfig = defaultConfig;\n}\n","@if (!!config()?.label) {\n <label\n [ngClass]=\"config().typographyClass\">\n {{ config().label }}\n @if (config().info) {\n <crispr-info\n matSuffix\n [info]=\"config().info\">\n </crispr-info>\n }\n </label>\n}\n","import {\n Component,\n OnInit,\n Input,\n ChangeDetectionStrategy,\n OnDestroy,\n} from '@angular/core';\nimport { Observable, of, Subscription } from 'rxjs';\nimport { FormGroup } from '@angular/forms';\nimport { tap, distinctUntilChanged } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { HeadingComponent } from '../heading';\n// eslint-disable-next-line @nx/enforce-module-boundaries\nimport type { CrisprControlConfig } from '../../utils';\n\n@Component({\n selector: 'crispr-field-container',\n templateUrl: './field-container.component.html',\n styleUrls: ['./field-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, HeadingComponent]\n})\nexport class FieldContainerComponent implements OnInit, OnDestroy {\n // the configuration object for the field\n @Input() config: CrisprControlConfig;\n // the parent formGroup\n @Input() group: FormGroup;\n // boolean whether field-container is inline\n @Input() inlineField = false;\n // used to determine whether or not field should be shown\n disabled$: Observable<boolean>;\n\n subs: Subscription[] = [];\n\n ngOnInit() {\n this.disabled$ = this.connectDisabledCallback(this.group, this.config);\n // we tried moving this into afterViewChecked and afterContentChecked lifecycle hooks without any luck\n if (this.config.computeValue) {\n this.subs.push(\n this.config\n .computeValue(this.group)\n .pipe(\n distinctUntilChanged(),\n tap((computedValue) =>\n this.group.get(this.config.controlName).setValue(computedValue)\n )\n )\n .subscribe()\n );\n }\n }\n\n ngOnDestroy(): void {\n this.subs.forEach((sub) => sub.unsubscribe);\n }\n /**\n * Connects user defined disabledCallback function to the the view, so that the control is enabled/disabled\n * appropriately. It also will hide disabled fields in the UI unless `hideDisabled` is set to\n * false in the controls config\n * @param group used to get valueChanges from control\n * @param config configuration object used to\n */\n connectDisabledCallback(\n group: FormGroup,\n config: CrisprControlConfig = null\n ) {\n const control = group.get(config.controlName);\n // If the disabled$ function exists on the field config then call it with the disabledCallbackConfig\n // as a parameter otherwise return an observable of true.\n return config?.disabledCallback &&\n config.disabledCallback instanceof Function\n ? config.disabledCallback(group).pipe(\n // This enables/disables when callback conditions are met\n tap((shouldDisable) =>\n shouldDisable ? control.disable() : control.enable()\n )\n )\n : of(false);\n }\n}\n","@if ((disabled$ | async) ? !config.hideDisabled : true) {\n <div\n [ngClass]=\"config.classes\"\n [class.inline-field]=\"inlineField\"\n class=\"field-container\">\n @if (config.heading) {\n <crispr-heading\n [config]=\"config.heading\">\n </crispr-heading>\n }\n <ng-content>\n </ng-content>\n </div>\n}\n","\nimport { Component, Input } from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n@Component({\n selector: 'crispr-selected-file',\n templateUrl: './selected-file.component.html',\n styleUrls: ['./selected-file.component.scss'],\n imports: [\n MatProgressBarModule\n ]\n})\nexport class SelectedFileComponent {\n\n @Input() fileName: string;\n @Input() progress: number;\n @Input() showProgress: boolean;\n @Input() color: ThemePalette;\n\n}\n","<h3 class=\"mat-h3\">{{ fileName }}</h3>\n@if (showProgress) {\n <mat-progress-bar\n mode=\"determinate\"\n [color]=\"color\"\n [value]=\"progress\">\n </mat-progress-bar>\n}\n","/* eslint-disable @nx/enforce-module-boundaries */\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n ViewChild,\n OnInit,\n ChangeDetectionStrategy,\n Optional,\n Self,\n signal,\n computed,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NgControl,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { Observable, of } from 'rxjs';\nimport { FileDropzoneDirective } from '../file-dropzone';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n\nimport {\n CrisprFieldComponent,\n FileUploadFieldConfig,\n} from '../../utils';\nimport { FieldContainerComponent } from '../field-container';\nimport { SelectedFileComponent } from '../selected-file';\nimport { CrisprControlComponent } from '../../utils/abstracts/crispr-control.abstract';\n\n@Component({\n selector: 'crispr-file-upload-field',\n templateUrl: './file-upload-field.component.html',\n styleUrls: ['./file-upload-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FieldContainerComponent,\n ReactiveFormsModule,\n MatIconModule,\n MatButtonModule,\n MatFormFieldModule,\n MatInputModule,\n SelectedFileComponent,\n FormValidationHandlerModule,\n FileDropzoneDirective,\n ],\n standalone: true\n})\nexport class FileUploadFieldComponent\n extends CrisprControlComponent<FileUploadFieldConfig>\n implements OnInit, ControlValueAccessor\n{\n onChange: () => void;\n\n defaultConfig: Partial<FileUploadFieldConfig> = {\n allowMultipleFiles: false,\n acceptedTypes: '*.*',\n dropZoneText: 'DROP FILE HERE',\n selectFilesButtonType: 'button',\n selectButtonText: 'SELECT',\n showClearFilesButton: true,\n clearFilesButtonText: 'CLEAR',\n uploadButtonText: 'UPLOAD',\n uploadButtonType: 'button',\n showUploadProgress: false,\n disableOnUpload: true,\n };\n\n @ViewChild('fileInput') fileInputRef: ElementRef;\n\n selectedFiles = signal<FileList | null>(null);\n selectedFilesArray = computed(() => this.selectedFiles() ? Array.from(this.selectedFiles()) : []);\n\n isUploaded = false;\n\n fileProgress: Observable<number>[] = [];\n disabled$: Observable<boolean>;\n\n // ngControl: NgControl = null;\n constructor(@Optional() @Self() public ngControl: NgControl) {\n super();\n if (this.ngControl != null) {\n // Setting the value accessor directly (instead of using\n // the providers) to avoid running into a circular import.\n ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.disabled$ = this.config().disabledCallback\n ? this.config().disabledCallback(this.group())\n : of(false);\n }\n\n filesChanged(files: FileList): void {\n if (files && files.length > 0) {\n this.selectedFiles.set(files);\n this.control().patchValue(files);\n }\n }\n\n uploadFiles() {\n if (this.selectedFiles() && this.config().uploadFiles) {\n this.isUploaded = true;\n this.config().uploadFiles(this.group(), this.selectedFiles(), this);\n }\n }\n\n resetFileInput(): void {\n this.fileInputRef.nativeElement.value = '';\n this.control().patchValue(null);\n this.isUploaded = false;\n }\n\n writeValue(value: null) {\n // clear file input\n // this.host.nativeElement.value = '';\n // this.file = null;\n }\n\n registerOnChange(fn: () => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {}\n}\n","<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n <mat-form-field floatLabel=\"always\"\n [attr.data-testid]=\"config().controlName\"\n [color]=\"config().color\"\n appearance=\"outline\"\n [crisprFileDropzone]=\"!(disabled$ | async) && !(config().disableOnUpload && isUploaded)\"\n [formGroup]=\"group()\"\n (fileDrop)=\"filesChanged($event)\">\n\n <input [formControlName]=\"config().controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n style=\"display: none\"\n [accept]=\"config().acceptedTypes\"\n [multiple]=\"config().allowMultipleFiles\"\n (change)=\"filesChanged($event.target.files)\"/>\n <mat-label>{{config().label}}</mat-label>\n\n @if (!selectedFiles() || selectedFiles().length === 0) {\n <div class=\"drop-info\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config().dropZoneText}}</h2>\n or\n <button\n mat-raised-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async) || config().disableOnUpload && isUploaded\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config().controlName\">\n {{config().selectButtonText}}\n </button>\n </div>\n } @else {\n <div class=\"selected-files-container\">\n <div class=\"selected-files-list\">\n @for (file of selectedFilesArray(); track file; let i = $index) {\n <crispr-selected-file\n [color]=\"config().color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"file.name\"\n [showProgress]=\"config().showUploadProgress\"\n [progress]=\"fileProgress && (fileProgress[i] | async)\">\n </crispr-selected-file>\n }\n </div>\n </div>\n }\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n </mat-form-field>\n @if ((selectedFiles())?.length > 0) {\n <div class=\"button-container\">\n <button\n mat-button\n (click)=\"resetFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async) || (config().disableOnUpload && isUploaded)\"\n aria-label=\"Remove Selected File(s)\">\n {{config().clearFilesButtonText}}\n <mat-icon>delete</mat-icon>\n </button>\n @if (!!config().uploadFiles) {\n <button\n mat-raised-button\n type=\"button\"\n color=\"accent\"\n class=\"file-input-button\"\n [disabled]=\"(disabled$ | async) || (config().disableOnUpload && isUploaded)\"\n (click)=\"uploadFiles()\"\n [attr.aria-label]=\"config().uploadButtonText\">\n {{ config().uploadButtonText }}\n </button>\n }\n </div>\n }\n</crispr-field-container>\n","import {\n Directive,\n Input,\n ViewContainerRef,\n OnInit,\n ChangeDetectorRef,\n Type,\n} from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport {\n ControlValue,\n CrisprDisplayFieldComponent,\n} from './utils';\n\n@Directive({\n selector: '[crisprDisplayField]',\n standalone: true,\n})\nexport class CrisprDisplayFieldDirective implements OnInit {\n @Input() group: FormGroup;\n /**\n * value setter updates the control's value as well\n */\n _value: ControlValue | any[];\n @Input() set value(value: ControlValue | any[]) {\n this._value = value;\n // This is needed to keep the group list from resetting control values to the initial input value\n this.updateComponentValue(value);\n }\n get value() {\n return this._value;\n }\n\n @Input() private component: Type<CrisprDisplayFieldComponent>;\n\n @Input() index?: number;\n\n private componentInstance: CrisprDisplayFieldComponent;\n\n constructor(\n private container: ViewContainerRef,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n if (this.component) {\n /**\n * create component and set values from config on its instance\n */\n const componentRef = this.container.createComponent(this.component);\n\n this.componentInstance = componentRef.instance;\n this.componentInstance.index = this.index;\n this.updateComponentValue(this.value);\n }\n }\n\n updateComponentValue(value: ControlValue | any[]) {\n if (!this.componentInstance) return;\n this.componentInstance.value = value;\n this.cdr.detectChanges();\n }\n}\n","import {\n Component,\n OnInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n WritableSignal,\n Signal,\n} from '@angular/core';\nimport { FormGroup, FormArray } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport {\n createControlForType,\n FormGroupListConfig,\n} from '../utils';\nimport { FieldContainerComponent } from '../ui';\nimport { CrisprDisplayFieldDirective } from '../display-field.directive';\nimport { CrisprControlComponent } from '../utils/abstracts/crispr-control.abstract';\n\nconst defaultConfig: Partial<FormGroupListConfig> = {\n addButtonLabel: 'ADD ITEM',\n minListLength: 1,\n};\n\n@Component({\n selector: 'crispr-form-group-list',\n templateUrl: './form-group-list.component.html',\n styleUrls: ['./form-group-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatButtonModule,\n MatIconModule,\n FieldContainerComponent,\n ReactiveFormsModule,\n CrisprFieldDirective,\n CrisprDisplayFieldDirective,\n CrisprPipesModule,\n FormValidationHandlerModule\n ],\n standalone: true\n})\nexport class FormGroupListComponent\n extends CrisprControlComponent<FormGroupListConfig>\n implements OnInit\n{\n defaultConfig = defaultConfig;\n group: WritableSignal<FormGroup>;\n control: Signal<FormArray>;\n /**\n * By setting this to true when adding/removing items from array,\n * we can block original values from overwriting form values\n * */\n blockValue = false;\n\n selectedIndex: number = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n super.ngOnInit();\n // TODO: this is required to ngFor of controls in template, must be a better way\n }\n\n setControlValue(values: any[]) {\n if (this.control()) {\n if (values?.length > 0) {\n // clear any existing values so that new values don't concatenate onto the old\n const currentValues: [] = this.control().value;\n if (currentValues.length) {\n this.control().clear();\n }\n values.forEach((value) => this.addGroup(value));\n } else if (this.config().displayInitialItem) {\n this.addGroup();\n }\n // needed to ensure new array items render\n setTimeout(() => {\n this.cdr.detectChanges();\n });\n }\n }\n\n clickDelete(index: number) {\n this.blockValue = true;\n this.deleteGroup(index);\n }\n\n clickAdd() {\n this.blockValue = true;\n this.addGroup();\n }\n\n addGroup(value = null) {\n this.control().push(createControlForType(this.config().itemConfig, value));\n // needed to ensure new array items render\n setTimeout(() => {\n this.cdr.detectChanges();\n });\n }\n\n deleteGroup(index: number) {\n this.control().removeAt(index);\n }\n\n clickEditItem(index: number) {\n this.selectedIndex = index;\n }\n}\n","<crispr-field-container [config]=\"config()\" [group]=\"group()\" [formGroup]=\"group()\">\n\n <div [formArrayName]=\"config().controlName\">\n\n <!-- Don't add trackBy function, it confuses the state of the array -->\n @for (itemControl of control()?.controls; track itemControl; let i = $index; let last = $last) {\n @if (!config().displayItemComponent || i === selectedIndex || (last && selectedIndex ?? true)) {\n <!-- TODO: use content projection to allow custom item label component -->\n <div class=\"item-header\">\n <span class=\"mat-h2\"> {{ config().itemLabelBuilder ? config().itemLabelBuilder(i) : 'Item ' + (i + 1) }} </span>\n @if (i + 1 > config().minListLength) {\n <button mat-icon-button type=\"button\">\n <mat-icon (click)=\"clickDelete(i)\">delete</mat-icon>\n </button>\n }\n </div>\n <div [formGroup]=\"itemControl\">\n <!-- TODO: if chiplists didn't need to have labels mixed in with their values we could use [value]=\"control.value\" below -->\n @for (field of config().itemConfig.fields; track field) {\n <ng-container crisprField [value]=\"blockValue ? null : value && value[i] | initialControlValue : field\"\n [config]=\"field\" [group]=\"itemControl\">\n </ng-container>\n }\n </div>\n } @else {\n <div class=\"display-field-container\" crisprDisplayField [component]=\"config().displayItemComponent\"\n [value]=\"itemControl.value\" [index]=\"i\">\n <button mat-icon-button (click)=\"clickEditItem(i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n }\n <ng-template #display>\n <div class=\"display-field-container\" crisprDisplayField [component]=\"config().displayItemComponent\"\n [value]=\"itemControl.value\" [index]=\"i\">\n <button mat-icon-button (click)=\"clickEditItem(i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </ng-template>\n }\n </div>\n <div class=\"group-footer\">\n <button type=\"button\" class=\"add\" mat-raised-button [color]=\"config().addButtonColor\" (click)=\"clickAdd()\">\n {{config().addItemLabel || config().addButtonLabel}}\n </button>\n </div>\n\n</crispr-field-container>","import { Component, OnInit } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\nimport {\n SubGroupConfig,\n} from '../utils';\nimport { CrisprControlComponent } from '../utils/abstracts/crispr-control.abstract';\n\n\n@Component({\n selector: 'crispr-sub-group',\n templateUrl: './sub-group.component.html',\n styleUrls: ['./sub-group.component.scss'],\n standalone: false\n})\nexport class SubGroupComponent extends CrisprControlComponent<SubGroupConfig> implements OnInit {\n \n ngOnInit() {\n super.ngOnInit();\n }\n}\n","<crispr-field-container [config]=\"config()\" [group]=\"group()\">\n @for (fieldConfig of config().fields; track fieldConfig) {\n <ng-container crisprField [value]=\"value | initialControlValue : fieldConfig\" [config]=\"fieldConfig\"\n [group]=\"control()\">\n </ng-container>\n }\n</crispr-field-container>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CrisprFieldDirective } from '../field.directive';\nimport { CrisprPipesModule } from '../pipes/crispr-pipes.module';\nimport { SubGroupComponent } from './sub-group.component';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FieldContainerComponent } from '../../lib/ui';\n@NgModule({\n imports: [\n CommonModule,\n CrisprFieldDirective,\n FieldContainerComponent,\n CrisprPipesModule,\n // TODO: Does this need to be here?\n FormValidationHandlerModule\n ],\n exports: [\n SubGroupComponent\n ],\n declarations: [\n SubGroupComponent\n ]\n})\n\nexport class SubGroupModule {\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n// custom modules\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n\n// components\nimport { CrisprFormComponent } from './form/form.component';\nimport { FormGroupListComponent } from './form-group-list';\n// directives\nimport { CrisprFieldDirective } from './field.directive';\nimport { SubGroupModule } from './sub-group';\nimport { CrisprPipesModule } from './pipes/crispr-pipes.module';\nimport { FieldContainerComponent } from './ui';\nimport { CrisprDisplayFieldDirective } from './display-field.directive';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormValidationHandlerModule,\n FormGroupListComponent,\n FieldContainerComponent,\n CrisprFieldDirective,\n CrisprDisplayFieldDirective,\n SubGroupModule,\n CrisprPipesModule,\n CrisprFormComponent,\n ],\n exports: [CrisprFormComponent, FieldContainerComponent],\n})\nexport class CrisprFormsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i4.InitialControlValuePipe","defaultConfig","i1","i4","i7","i5.InitialControlValuePipe","i1.CrisprFieldDirective","i2.FieldContainerComponent","i3.InitialControlValuePipe"],"mappings":"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"}
1
+ {"version":3,"file":"tft-crispr-forms.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tft/crispr-forms",
3
- "version": "21.0.3",
3
+ "version": "21.0.5",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.0.0",
6
6
  "@angular/forms": "^18.0.0",
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, DestroyRef, EventEmitter, WritableSignal, Signal, ChangeDetectorRef, OnDestroy, ElementRef, AfterContentInit, AfterViewInit, Renderer2, ViewContainerRef, PipeTransform } from '@angular/core';
2
+ import { OnInit, DestroyRef, EventEmitter, WritableSignal, Signal, OnDestroy, ElementRef, AfterContentInit, AfterViewInit, Renderer2, ViewContainerRef, ChangeDetectorRef, PipeTransform } from '@angular/core';
3
3
  import * as i2 from '@angular/common';
4
4
  import * as _angular_forms from '@angular/forms';
5
5
  import { ValidatorFn, FormGroup, AbstractControl, FormControl, FormArray, ControlValueAccessor, NgControl } from '@angular/forms';
@@ -13,11 +13,11 @@ import { MatFormFieldAppearance } from '@angular/material/form-field';
13
13
  import { MatCalendarCellClassFunction } from '@angular/material/datepicker';
14
14
  import { ComponentType, Portal } from '@angular/cdk/portal';
15
15
  import { GoogleMap, MapGeocoder, MapInfoWindow, MapMarker } from '@angular/google-maps';
16
- import { DomSanitizer } from '@angular/platform-browser';
17
16
  import { MatAutocompleteTrigger, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
18
17
  import { MatSelect } from '@angular/material/select';
18
+ import { CdkOverlayOrigin, ConnectionPositionPair } from '@angular/cdk/overlay';
19
19
  import { MatChipInputEvent } from '@angular/material/chips';
20
- import { ConnectionPositionPair } from '@angular/cdk/overlay';
20
+ import { DomSanitizer } from '@angular/platform-browser';
21
21
 
22
22
  declare function valueIn(values: string[]): rxjs.OperatorFunction<string, boolean>;
23
23
 
@@ -164,6 +164,17 @@ interface AutocompleteFieldConfig extends AbstractAutocompleteFieldConfig {
164
164
  controlType: ControlType.AUTOCOMPLETE;
165
165
  }
166
166
 
167
+ interface CreateChipConfig {
168
+ /** Label for the "Create New" option in the autocomplete dropdown. Defaults to '+ Create New' */
169
+ createLabel?: string;
170
+ /** Field configs rendered inside the create form overlay */
171
+ fields: AnyFieldConfig[];
172
+ /** Called when the user submits the create form. Should return the new chip as a SelectOption. */
173
+ submitChip: (group: FormGroup) => Observable<SelectOption>;
174
+ /** Label for the submit button. Defaults to 'Add' */
175
+ submitLabel?: string;
176
+ }
177
+
167
178
  interface AutocompleteChiplistFieldConfig extends AbstractAutocompleteFieldConfig, FieldDescriptors, MatFieldProperties {
168
179
  controlType: ControlType.AUTOCOMPLETE_CHIPLIST;
169
180
  autoActiveFirstOption?: boolean;
@@ -180,6 +191,8 @@ interface AutocompleteChiplistFieldConfig extends AbstractAutocompleteFieldConfi
180
191
  * @deprecated replaced with tabToSelect as it is more accurate
181
192
  */
182
193
  addChipOnBlur?: boolean;
194
+ /** Config for creating new chips with complex values via an inline sub-form */
195
+ createChip?: CreateChipConfig;
183
196
  }
184
197
 
185
198
  interface CheckboxFieldConfig extends CrisprControlConfig, Pick<FieldDescriptors, 'label' | 'info'>, Pick<MatFieldProperties, 'color'> {
@@ -393,8 +406,10 @@ declare abstract class CrisprFieldComponent<C extends CrisprFieldConfig> {
393
406
  set inputConfig(config: C);
394
407
  private updateConfig;
395
408
  config: i0.WritableSignal<C>;
409
+ testIdPrefix: i0.InputSignal<string>;
410
+ testId: i0.Signal<string>;
396
411
  static ɵfac: i0.ɵɵFactoryDeclaration<CrisprFieldComponent<any>, never>;
397
- static ɵdir: i0.ɵɵDirectiveDeclaration<CrisprFieldComponent<any>, never, never, { "inputConfig": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
412
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CrisprFieldComponent<any>, never, never, { "inputConfig": { "alias": "config"; "required": false; }; "testIdPrefix": { "alias": "testIdPrefix"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
398
413
  }
399
414
 
400
415
  declare class CrisprControlComponent<C extends CrisprControlConfig> extends CrisprFieldComponent<C> implements OnInit {
@@ -484,7 +499,6 @@ declare class FormGroupListComponent extends CrisprControlComponent<FormGroupLis
484
499
  * */
485
500
  blockValue: boolean;
486
501
  selectedIndex: number;
487
- constructor(cdr: ChangeDetectorRef);
488
502
  ngOnInit(): void;
489
503
  setControlValue(values: any[]): void;
490
504
  clickDelete(index: number): void;
@@ -541,7 +555,7 @@ declare class FileUploadFieldComponent extends CrisprControlComponent<FileUpload
541
555
  isUploaded: boolean;
542
556
  fileProgress: Observable<number>[];
543
557
  disabled$: Observable<boolean>;
544
- constructor(ngControl: NgControl);
558
+ constructor();
545
559
  ngOnInit(): void;
546
560
  filesChanged(files: FileList): void;
547
561
  uploadFiles(): void;
@@ -549,7 +563,7 @@ declare class FileUploadFieldComponent extends CrisprControlComponent<FileUpload
549
563
  writeValue(value: null): void;
550
564
  registerOnChange(fn: () => void): void;
551
565
  registerOnTouched(fn: () => void): void;
552
- static ɵfac: i0.ɵɵFactoryDeclaration<FileUploadFieldComponent, [{ optional: true; self: true; }]>;
566
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileUploadFieldComponent, never>;
553
567
  static ɵcmp: i0.ɵɵComponentDeclaration<FileUploadFieldComponent, "crispr-file-upload-field", never, {}, {}, never, never, true, never>;
554
568
  }
555
569
 
@@ -593,7 +607,7 @@ declare class ImageUploadFieldComponent extends CrisprControlComponent<ImageUplo
593
607
  selectedFiles: FileList;
594
608
  isUploaded: boolean;
595
609
  disabled$: Observable<boolean>;
596
- constructor(ngControl: NgControl, domSanitizer: DomSanitizer, cdr: ChangeDetectorRef);
610
+ constructor();
597
611
  ngOnInit(): void;
598
612
  filesChanged(files: FileList): void;
599
613
  clearFileInput(): void;
@@ -601,7 +615,7 @@ declare class ImageUploadFieldComponent extends CrisprControlComponent<ImageUplo
601
615
  writeValue(value: null): void;
602
616
  registerOnChange(fn: () => void): void;
603
617
  registerOnTouched(fn: () => void): void;
604
- static ɵfac: i0.ɵɵFactoryDeclaration<ImageUploadFieldComponent, [{ optional: true; self: true; }, null, null]>;
618
+ static ɵfac: i0.ɵɵFactoryDeclaration<ImageUploadFieldComponent, never>;
605
619
  static ɵcmp: i0.ɵɵComponentDeclaration<ImageUploadFieldComponent, "crispr-image-upload-field", never, {}, {}, never, never, true, never>;
606
620
  }
607
621
 
@@ -738,9 +752,18 @@ declare class AutocompleteChiplistFieldComponent extends AbstractAutocompleteCom
738
752
  controlValue$: Observable<SelectOption[]>;
739
753
  chipInput: MatAutocompleteTrigger;
740
754
  chipInputRef: ElementRef<HTMLInputElement>;
755
+ overlayOrigin: CdkOverlayOrigin;
756
+ readonly createNewSentinel: symbol;
757
+ showCreateForm: i0.WritableSignal<boolean>;
758
+ createFormGroup: FormGroup<{}>;
759
+ readonly createFormPositions: ConnectionPositionPair[];
760
+ get overlayWidth(): number;
741
761
  ngOnInit(): void;
742
762
  setControlValue(value: SelectOption[]): void;
743
763
  handleSelect(event: MatAutocompleteSelectedEvent): void;
764
+ openCreateForm(): void;
765
+ submitNewChip(): void;
766
+ closeCreateForm(): void;
744
767
  /**
745
768
  * To follow ARIA standards we want to select the active option on blur.
746
769
  * matChipInputAddOnBlur should do this but it causes buggy behaviour
@@ -803,11 +826,9 @@ type CrisprControlComponentType = InputFieldComponent | SelectFieldComponent | R
803
826
  type CrisprFieldComponentType = CrisprControlComponentType | HeadingComponent | DividerComponent | ButtonComponent;
804
827
 
805
828
  declare class CrisprFieldDirective implements OnInit {
806
- private container;
807
- private renderer;
808
- private cdr;
809
829
  config: AnyFieldConfig;
810
830
  group: FormGroup;
831
+ testIdPrefix?: string;
811
832
  /**
812
833
  * value setter updates the control's value as well
813
834
  */
@@ -815,11 +836,13 @@ declare class CrisprFieldDirective implements OnInit {
815
836
  set value(value: ControlValue | any[]);
816
837
  get value(): ControlValue | any[];
817
838
  component: CrisprFieldComponentType;
818
- constructor(container: ViewContainerRef, renderer: Renderer2, cdr: ChangeDetectorRef);
839
+ container: ViewContainerRef;
840
+ renderer: Renderer2;
841
+ cdr: ChangeDetectorRef;
819
842
  ngOnInit(): Promise<void>;
820
843
  updateComponentValue(value: ControlValue): void;
821
844
  static ɵfac: i0.ɵɵFactoryDeclaration<CrisprFieldDirective, never>;
822
- static ɵdir: i0.ɵɵDirectiveDeclaration<CrisprFieldDirective, "[crisprField]", never, { "config": { "alias": "config"; "required": false; }; "group": { "alias": "group"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, true, never>;
845
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CrisprFieldDirective, "[crisprField]", never, { "config": { "alias": "config"; "required": false; }; "group": { "alias": "group"; "required": false; }; "testIdPrefix": { "alias": "testIdPrefix"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, true, never>;
823
846
  }
824
847
 
825
848
  declare class CrisprDisplayFieldDirective implements OnInit {
@@ -835,7 +858,6 @@ declare class CrisprDisplayFieldDirective implements OnInit {
835
858
  private component;
836
859
  index?: number;
837
860
  private componentInstance;
838
- constructor(container: ViewContainerRef, cdr: ChangeDetectorRef);
839
861
  ngOnInit(): Promise<void>;
840
862
  updateComponentValue(value: ControlValue | any[]): void;
841
863
  static ɵfac: i0.ɵɵFactoryDeclaration<CrisprDisplayFieldDirective, never>;
@@ -884,4 +906,4 @@ declare class CrisprFormsModule {
884
906
  }
885
907
 
886
908
  export { AbstractAutocompleteComponent, ControlType, CrisprControlComponent, CrisprDisplayFieldComponent, CrisprFieldComponent, CrisprFormComponent, CrisprFormsModule, DEFAULT_EMPTY_OPTIONS_MESSAGE, FieldContainerComponent, FileDropzoneDirective, FileUploadFieldComponent, HeadingComponent, InfoComponent, SelectedFileComponent, allowedFileExtValidator, allowedFileType, buildFormGroupFromConfig, callOptionsIfFunction, convertBytesToMb, createControlForType, filterOptionsByLabel, isControlConfig, maxFileSizeValidator, observablifyOptions, valueIn };
887
- export type { AbstractAutocompleteFieldConfig, AbstractGroupConfig, AbstractUploadComponent, AnyFieldConfig, AutocompleteChiplistFieldConfig, AutocompleteFieldConfig, AutocompleteOptionsCallback, ButtonConfig, ButtonType, CheckboxFieldConfig, ControlGroupValue, ControlValue, CrisprControlConfig, CrisprFieldConfig, DatepickerFieldConfig, DividerConfig, EnabledUploadButtonConfig, FieldDescriptors, FileUploadFieldConfig, FormConfig, FormGroupListConfig, HeadingConfig, ImageUploadFieldConfig, Info, InputFieldConfig, MapFieldConfig, MatFieldProperties, OptionsCallback, OptionsType, RadioFieldConfig, ReactiveOptionsCallback, SelectFieldConfig, SelectOption, SliderFieldConfig, SubGroupConfig, TemplateBuilder, TextareaFieldConfig, TftMapMarker, UnitConversionFieldConfig };
909
+ export type { AbstractAutocompleteFieldConfig, AbstractGroupConfig, AbstractUploadComponent, AnyFieldConfig, AutocompleteChiplistFieldConfig, AutocompleteFieldConfig, AutocompleteOptionsCallback, ButtonConfig, ButtonType, CheckboxFieldConfig, ControlGroupValue, ControlValue, CreateChipConfig, CrisprControlConfig, CrisprFieldConfig, DatepickerFieldConfig, DividerConfig, EnabledUploadButtonConfig, FieldDescriptors, FileUploadFieldConfig, FormConfig, FormGroupListConfig, HeadingConfig, ImageUploadFieldConfig, Info, InputFieldConfig, MapFieldConfig, MatFieldProperties, OptionsCallback, OptionsType, RadioFieldConfig, ReactiveOptionsCallback, SelectFieldConfig, SelectOption, SliderFieldConfig, SubGroupConfig, TemplateBuilder, TextareaFieldConfig, TftMapMarker, UnitConversionFieldConfig };
@@ -1,95 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import * as i2 from '@angular/material/autocomplete';
4
- import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
5
- import * as i1$1 from '@angular/common';
6
- import { CommonModule } from '@angular/common';
7
- import * as i1 from '@angular/forms';
8
- import { ReactiveFormsModule } from '@angular/forms';
9
- import * as i3 from '@angular/material/input';
10
- import { MatInputModule } from '@angular/material/input';
11
- import { MatOptionModule } from '@angular/material/core';
12
- import { O as OptionComponent } from './tft-crispr-forms-index-UAYeTe3L.mjs';
13
- import * as i6 from '@tft/form-validation-handler';
14
- import { FormValidationHandlerModule } from '@tft/form-validation-handler';
15
- import { DEFAULT_EMPTY_OPTIONS_MESSAGE, AbstractAutocompleteComponent, InfoComponent, FieldContainerComponent } from './tft-crispr-forms.mjs';
16
- import * as i2$1 from '@angular/material/form-field';
17
-
18
- /* eslint-disable @nx/enforce-module-boundaries */
19
- const defaultConfig = {
20
- autoActiveFirstOption: true,
21
- typeDebounceTime: 500,
22
- emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,
23
- };
24
- class AutocompleteFieldComponent extends AbstractAutocompleteComponent {
25
- constructor() {
26
- super(...arguments);
27
- this.defaultConfig = defaultConfig;
28
- }
29
- ngOnInit() {
30
- super.ngOnInit();
31
- this.clearFieldSubscription =
32
- this.autocompleteInputControl.valueChanges.subscribe((text) => {
33
- if (typeof text === 'string' && text?.trim() === '') {
34
- this.control().setValue(null);
35
- }
36
- });
37
- }
38
- ngOnDestroy() {
39
- this.clearFieldSubscription.unsubscribe();
40
- }
41
- setControlValue(value) {
42
- if (this.control() && value) {
43
- // sets the initial value on the control if one is passed
44
- this.control().setValue(value.value || '');
45
- this.autocompleteInputControl.setValue(value.label || '');
46
- }
47
- }
48
- /**
49
- * The material autocomplete defaults to displaying the options value instead of its label.
50
- * We only have the value from the selected option to work with, so we have to pass the options
51
- * through a function called in the template and return the function that the material displayWith
52
- * input is expecting.
53
- * @param options the array of options to search for option with corresponding value
54
- */
55
- displayLabel(options) {
56
- if (this.config().displayWith) {
57
- return this.config().displayWith(options);
58
- }
59
- return (value) => {
60
- const label = !!options && Array.isArray(options)
61
- ? options.find((option) => JSON.stringify(option.value) === JSON.stringify(value))?.label
62
- : value;
63
- return label;
64
- };
65
- }
66
- handleSelect(event) {
67
- this.control().setValue(event.option.value);
68
- this.autoInputRef.nativeElement.blur();
69
- }
70
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: AutocompleteFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: AutocompleteFieldComponent, isStandalone: true, selector: "crispr-autocomplete-field", viewQueries: [{ propertyName: "autoInput", first: true, predicate: ["autoInput"], descendants: true, read: MatAutocompleteTrigger }, { propertyName: "autoInputRef", first: true, predicate: ["autoInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-form-field\n [attr.data-testid]=\"config().controlName\"\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n <input class=\"hidden-error-directive-anchor\" [formControlName]=\"config().controlName\" type=\"text\"/>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config().placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config().autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n @if (options$ | async; as options) {\n @if (options.length > 0) {\n @for (option of options; track option.value) {\n <mat-option\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n", styles: [".hidden-error-directive-anchor{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: InfoComponent, selector: "crispr-info", inputs: ["info"] }, { kind: "component", type: OptionComponent, selector: "crispr-option", inputs: ["option"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: FormValidationHandlerModule }, { kind: "directive", type: i6.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { kind: "directive", type: i6.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
72
- }
73
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: AutocompleteFieldComponent, decorators: [{
74
- type: Component,
75
- args: [{ selector: 'crispr-autocomplete-field', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
76
- CommonModule,
77
- InfoComponent,
78
- OptionComponent,
79
- ReactiveFormsModule,
80
- FieldContainerComponent,
81
- MatAutocompleteModule,
82
- MatInputModule,
83
- MatOptionModule,
84
- FormValidationHandlerModule,
85
- ], standalone: true, template: "\n<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-form-field\n [attr.data-testid]=\"config().controlName\"\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n <input class=\"hidden-error-directive-anchor\" [formControlName]=\"config().controlName\" type=\"text\"/>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config().placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config().autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n @if (options$ | async; as options) {\n @if (options.length > 0) {\n @for (option of options; track option.value) {\n <mat-option\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n", styles: [".hidden-error-directive-anchor{display:none}\n"] }]
86
- }], propDecorators: { autoInput: [{
87
- type: ViewChild,
88
- args: ['autoInput', { read: MatAutocompleteTrigger }]
89
- }], autoInputRef: [{
90
- type: ViewChild,
91
- args: ['autoInput']
92
- }] } });
93
-
94
- export { AutocompleteFieldComponent as A };
95
- //# sourceMappingURL=tft-crispr-forms-autocomplete-field.component-ChocHy3F.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tft-crispr-forms-autocomplete-field.component-ChocHy3F.mjs","sources":["../../../../libs/crispr-forms/src/lib/ui/autocomplete-field/autocomplete-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/autocomplete-field/autocomplete-field.component.html"],"sourcesContent":["/* eslint-disable @nx/enforce-module-boundaries */\nimport {\n Component,\n OnInit,\n ViewChild,\n ChangeDetectionStrategy,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport {\n MatAutocompleteTrigger,\n MatAutocompleteSelectedEvent,\n MatAutocompleteModule,\n} from '@angular/material/autocomplete';\n\nimport { Subscription } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatOptionModule } from '@angular/material/core';\nimport { OptionComponent } from '../option';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\n\nimport { FieldContainerComponent } from '../field-container';\nimport {\n SelectOption,\n AbstractAutocompleteComponent,\n AutocompleteFieldConfig,\n DEFAULT_EMPTY_OPTIONS_MESSAGE,\n} from '../../utils';\nimport { InfoComponent } from '../info';\n\nconst defaultConfig: Partial<AutocompleteFieldConfig> = {\n autoActiveFirstOption: true,\n typeDebounceTime: 500,\n emptyOptionsMessage: DEFAULT_EMPTY_OPTIONS_MESSAGE,\n};\n\n@Component({\n selector: 'crispr-autocomplete-field',\n templateUrl: './autocomplete-field.component.html',\n styleUrls: ['./autocomplete-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n InfoComponent,\n OptionComponent,\n ReactiveFormsModule,\n FieldContainerComponent,\n MatAutocompleteModule,\n MatInputModule,\n MatOptionModule,\n FormValidationHandlerModule,\n ],\n standalone: true\n})\nexport class AutocompleteFieldComponent\n extends AbstractAutocompleteComponent<AutocompleteFieldConfig>\n implements OnInit, OnDestroy\n{\n defaultConfig = defaultConfig;\n @ViewChild('autoInput', { read: MatAutocompleteTrigger })\n autoInput: MatAutocompleteTrigger;\n @ViewChild('autoInput') autoInputRef: ElementRef<HTMLInputElement>;\n\n clearFieldSubscription: Subscription;\n\n ngOnInit() {\n super.ngOnInit();\n this.clearFieldSubscription =\n this.autocompleteInputControl.valueChanges.subscribe((text: string) => {\n if (typeof text === 'string' && text?.trim() === '') {\n this.control().setValue(null);\n }\n });\n }\n\n ngOnDestroy() {\n this.clearFieldSubscription.unsubscribe();\n }\n\n setControlValue(value: SelectOption) {\n if (this.control() && value) {\n // sets the initial value on the control if one is passed\n this.control().setValue(value.value || '');\n this.autocompleteInputControl.setValue(value.label || '');\n }\n }\n\n /**\n * The material autocomplete defaults to displaying the options value instead of its label.\n * We only have the value from the selected option to work with, so we have to pass the options\n * through a function called in the template and return the function that the material displayWith\n * input is expecting.\n * @param options the array of options to search for option with corresponding value\n */\n displayLabel(options: SelectOption[]) {\n if (this.config().displayWith) {\n return this.config().displayWith(options);\n }\n return (value: any) => {\n const label: string =\n !!options && Array.isArray(options)\n ? options.find(\n (option) => JSON.stringify(option.value) === JSON.stringify(value)\n )?.label\n : value;\n return label;\n };\n }\n\n handleSelect(event: MatAutocompleteSelectedEvent) {\n this.control().setValue(event.option.value);\n this.autoInputRef.nativeElement.blur();\n }\n}\n","\n<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-form-field\n [attr.data-testid]=\"config().controlName\"\n [color]=\"config().color\"\n [appearance]=\"config().appearance\"\n [formGroup]=\"group()\">\n @if (config().label) {<mat-label>{{config().label}}</mat-label>}\n\n <input class=\"hidden-error-directive-anchor\" [formControlName]=\"config().controlName\" type=\"text\"/>\n\n <input\n matInput\n [formControl]=\"autocompleteInputControl\"\n [placeholder]=\"config().placeholder\"\n [matAutocomplete]=\"auto\"\n role=\"textbox\"\n type=\"textbox\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n spellcheck=\"false\"\n #autoInput>\n\n @if (config().fieldSuffix) {<span matSuffix>{{config().fieldSuffix}}</span>}\n @if (config().info) {<crispr-info matSuffix [info]=\"config().info \"></crispr-info>}\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"config().autoActiveFirstOption\"\n (optionSelected)=\"handleSelect($event)\"\n [displayWith]=\"displayLabel(options$ | async)\">\n\n @if (options$ | async; as options) {\n @if (options.length > 0) {\n @for (option of options; track option.value) {\n <mat-option\n [value]=\"option.value\">\n <crispr-option [option]=\"option\"></crispr-option>\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n } @else {\n <mat-option disabled=\"true\">\n {{config().emptyOptionsMessage}}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (config().hint && (control().valid || !control().touched)) {<mat-hint>{{config().hint}}</mat-hint>}\n\n </mat-form-field>\n</crispr-field-container>\n"],"names":["i4","i5","i6"],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { ChangeDetectionStrategy, Component } from '@angular/core';
3
- import * as i2 from '@angular/material/radio';
4
- import { MatRadioModule } from '@angular/material/radio';
5
- import * as i1 from '@angular/forms';
6
- import { ReactiveFormsModule } from '@angular/forms';
7
- import * as i1$1 from '@angular/common';
8
- import { CommonModule } from '@angular/common';
9
- import * as i6 from '@tft/form-validation-handler';
10
- import { FormValidationHandlerModule } from '@tft/form-validation-handler';
11
- import { CrisprControlComponent, observablifyOptions, FieldContainerComponent } from './tft-crispr-forms.mjs';
12
-
13
- /* eslint-disable @nx/enforce-module-boundaries */
14
- class RadioFieldComponent extends CrisprControlComponent {
15
- constructor() {
16
- super(...arguments);
17
- this.defaultConfig = {};
18
- }
19
- ngOnInit() {
20
- super.ngOnInit();
21
- // options$ can be passed as an array, promise that resolves array, or observable that resolves array
22
- // this functions accounts for all possibilities and converts to observable that resolves array
23
- this.options$ = observablifyOptions(this.config().options, this.group());
24
- }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: RadioFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: RadioFieldComponent, isStandalone: true, selector: "crispr-radio-field", usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-radio-group\n [formControl]=\"control()\"\n [color]=\"config().color\">\n @for (option of options$ | async; track option) {\n <mat-radio-button class=\"example-radio-button\" [value]=\"option.value\">\n {{option.label}}\n </mat-radio-button>\n }\n </mat-radio-group>\n</crispr-field-container>\n", styles: ["mat-radio-button{padding:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i2.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i2.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: FormValidationHandlerModule }, { kind: "directive", type: i6.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
27
- }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: RadioFieldComponent, decorators: [{
29
- type: Component,
30
- args: [{ selector: 'crispr-radio-field', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
31
- CommonModule,
32
- ReactiveFormsModule,
33
- FieldContainerComponent,
34
- MatRadioModule,
35
- FormValidationHandlerModule,
36
- ], standalone: true, template: "<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-radio-group\n [formControl]=\"control()\"\n [color]=\"config().color\">\n @for (option of options$ | async; track option) {\n <mat-radio-button class=\"example-radio-button\" [value]=\"option.value\">\n {{option.label}}\n </mat-radio-button>\n }\n </mat-radio-group>\n</crispr-field-container>\n", styles: ["mat-radio-button{padding:12px}\n"] }]
37
- }] });
38
-
39
- export { RadioFieldComponent };
40
- //# sourceMappingURL=tft-crispr-forms-index-BQFuEW6x.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tft-crispr-forms-index-BQFuEW6x.mjs","sources":["../../../../libs/crispr-forms/src/lib/ui/radio-field/radio-field.component.ts","../../../../libs/crispr-forms/src/lib/ui/radio-field/radio-field.component.html"],"sourcesContent":["/* eslint-disable @nx/enforce-module-boundaries */\nimport { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { MatRadioModule } from '@angular/material/radio';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormValidationHandlerModule } from '@tft/form-validation-handler';\nimport { FieldContainerComponent } from '../field-container';\nimport { RadioFieldConfig, SelectOption, observablifyOptions } from '../../utils';\nimport { CrisprControlComponent } from '../../utils/abstracts/crispr-control.abstract';\n\n@Component({\n selector: 'crispr-radio-field',\n templateUrl: './radio-field.component.html',\n styleUrls: ['./radio-field.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FieldContainerComponent,\n MatRadioModule,\n FormValidationHandlerModule,\n ],\n standalone: true\n})\nexport class RadioFieldComponent extends CrisprControlComponent<RadioFieldConfig> implements OnInit {\n defaultConfig = {};\n options$: Observable<SelectOption[]>;\n ngOnInit() {\n super.ngOnInit();\n // options$ can be passed as an array, promise that resolves array, or observable that resolves array\n // this functions accounts for all possibilities and converts to observable that resolves array\n this.options$ = observablifyOptions(this.config().options, this.group());\n }\n}\n","<crispr-field-container\n [config]=\"config()\"\n [group]=\"group()\">\n\n <mat-radio-group\n [formControl]=\"control()\"\n [color]=\"config().color\">\n @for (option of options$ | async; track option) {\n <mat-radio-button class=\"example-radio-button\" [value]=\"option.value\">\n {{option.label}}\n </mat-radio-button>\n }\n </mat-radio-group>\n</crispr-field-container>\n"],"names":["i3","i4"],"mappings":"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"}