{"version":3,"file":"c8y-ngx-components-platform-configuration.mjs","sources":["../../platform-configuration/platform-configuration-form-provider.service.ts","../../platform-configuration/platform-configuration-form.component.ts","../../platform-configuration/platform-configuration-form.component.html","../../platform-configuration/platform-configuration.module.ts","../../platform-configuration/c8y-ngx-components-platform-configuration.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { DatePipe, gettext } from '@c8y/ngx-components';\nimport { FormControl, Validators } from '@angular/forms';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class PlatformConfigurationFormProviderService {\n  lineBreakHint = gettext('Use [Enter] or <br> tag to add a new line');\n\n  exampleTomorrowDate = (() => {\n    const tomorrow = new Date();\n    tomorrow.setDate(tomorrow.getDate() + 1);\n    return this.c8yDatePipe.transform(tomorrow, 'yyyy-MM-ddTHH:mm:ssZ');\n  })();\n\n  platformConfigurationFormDefinitions = {\n    'system.password.enforce.strength': {\n      formId: 'system.password.enforce.strength',\n      title: gettext('Enforce \"green\" passwords for all users'),\n      type: 'boolean',\n      control: new FormControl('')\n    },\n    'system.password.limit.validity': {\n      formId: 'system.password.limit.validity',\n      title: gettext('Password validity limit (days)'),\n      description: gettext(\n        'The number of days a password may be valid before it must be reset; minimum value is 0, maximum value is 999999. Leave empty to use the value from the tenant options.'\n      ),\n      type: 'number',\n      control: new FormControl('', [Validators.min(0), Validators.max(999999)])\n    },\n    'system.password.history.size': {\n      formId: 'system.password.history.size',\n      title: gettext('Password history size'),\n      description: gettext(\n        'The number of times before the current password can be reused. Minimum value is 0, preset value is 10.'\n      ),\n      type: 'number',\n      placeholder: `${gettext('e.g. {{ example }}')}`,\n      placeholderParams: { example: '10' },\n      control: new FormControl('', [Validators.min(0)])\n    },\n    'system.password.green.min-length': {\n      formId: 'system.password.green.min-length',\n      title: gettext('Minimal length of \"green\" password'),\n      description: gettext(\n        'The minimum number of characters which are required for a safe password. Minimum (and preset) value is 8, maximum value is 32. Leave empty to skip this constraint.'\n      ),\n      type: 'number',\n      control: new FormControl('', [Validators.min(8), Validators.max(32)])\n    },\n    'ui.email.protocolAndEncryption': {\n      formId: 'ui.email.protocolAndEncryption',\n      title: gettext('Protocol and encryption'),\n      type: 'select',\n      options: [\n        {\n          value: 'SMTP_PLAIN',\n          name: gettext('SMTP (no encryption)')\n        },\n        {\n          value: 'SMTP_ENCRYPTED',\n          name: gettext('SMTP (STARTTLS)')\n        },\n        {\n          value: 'SMTPS_ENCRYPTED',\n          name: gettext('SMTPS (SSL/TLS)')\n        }\n      ],\n      skipOnSave: true,\n      control: new FormControl('')\n    },\n    'email.protocol': {\n      formId: 'email.protocol',\n      title: gettext('Protocol'),\n      type: 'select',\n      options: [\n        {\n          value: 'smtp',\n          name: 'SMTP'\n        },\n        {\n          value: 'smtps',\n          name: 'SMTPS'\n        }\n      ],\n      control: new FormControl('')\n    },\n    'email.connection.encrypted': {\n      formId: 'email.connection.encrypted',\n      title: gettext('Connection encrypted'),\n      type: 'boolean',\n      control: new FormControl('')\n    },\n    'email.host': {\n      formId: 'email.host',\n      title: gettext('Host'),\n      type: 'string',\n      placeholder: `${gettext('e.g. {{ example }}')}`,\n      placeholderParams: { example: 'localhost' },\n      control: new FormControl('')\n    },\n    'email.port': {\n      formId: 'email.port',\n      title: gettext('Port'),\n      type: 'number',\n      placeholder: `${gettext('e.g. {{ example }}')}`,\n      placeholderParams: { example: '25' },\n      control: new FormControl('', [Validators.min(1), Validators.max(65535)])\n    },\n    'email.username': {\n      formId: 'email.username',\n      title: gettext('Username'),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'credentials.email.password': {\n      formId: 'credentials.email.password',\n      title: gettext('Password'),\n      type: 'password',\n      control: new FormControl('')\n    },\n    'email.from': {\n      formId: 'email.from',\n      title: gettext('Sender address'),\n      type: 'string',\n      control: new FormControl('', [Validators.email])\n    },\n    'passwordReset.sendNotificationToUnknownEmails': {\n      formId: 'passwordReset.sendNotificationToUnknownEmails',\n      title: gettext('Send notifications to unknown email addresses'),\n      type: 'boolean',\n      control: new FormControl('')\n    },\n    'passwordReset.email.subject': {\n      formId: 'passwordReset.email.subject',\n      title: gettext('Email subject'),\n      description: gettext('Subject used for all password reset related emails'),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'passwordReset.token.email.template': {\n      formId: 'passwordReset.token.email.template',\n      title: gettext('Password reset email template (when address is known)'),\n      description: `${gettext(\n        'Placeholders: {tenant-domain}, {host}, {token}, {username}, {email}. Whole link to reset password can be, for example: {tenant-domain}/apps/devicemanagement/index.html?token={token}&email={email}'\n      )}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'passwordReset.user.not.found.email.template': {\n      formId: 'passwordReset.user.not.found.email.template',\n      title: gettext('Password reset email template (when address is not known)'),\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'passwordReset.success.email.template': {\n      formId: 'passwordReset.success.email.template',\n      title: gettext('Password change confirmation email template'),\n      description: `${gettext('Placeholders: {host}, {tenant-domain}, {username}')}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'passwordReset.invite.template': {\n      formId: 'passwordReset.invite.template',\n      title: gettext('Invitation email template'),\n      description: `${gettext(\n        'Placeholders: {tenant-domain}, {host}, {token}, {username}, {email}. Whole link to setup password can be, for example: {tenant-domain}/apps/devicemanagement/index.html?token={token}'\n      )}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'export.data.mail.subject': {\n      formId: 'export.data.mail.subject',\n      title: gettext('Email subject'),\n      description: gettext(\n        'Placeholders: {tenant-domain}, {host}, {binaryId}. Whole link to result file is: {tenant-domain}/inventory/binaries/{binaryId}'\n      ),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'export.data.mail.text': {\n      formId: 'export.data.mail.text',\n      title: gettext('Email template'),\n      description: `${gettext(\n        'Placeholders: {tenant-domain}, {host}, {binaryId}. Whole link to result file is: {tenant-domain}/inventory/binaries/{binaryId}'\n      )}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'export.data.mail.text.userunauthorized': {\n      formId: 'export.data.mail.text.userunauthorized',\n      title: gettext('User unauthorized error message'),\n      description: gettext('Placeholders: {user}, {exportApi}'),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'two-factor-authentication.token.sms.template': {\n      formId: 'two-factor-authentication.token.sms.template',\n      title: gettext('Verification token SMS template'),\n      description: gettext('Placeholder: {token} - created token'),\n      type: 'string',\n      placeholder: gettext('e.g.: Verification code: {token}'),\n      control: new FormControl('')\n    },\n    'system.support.url': {\n      formId: 'system.support.url',\n      title: gettext('URL'),\n      type: 'string',\n      description: gettext(\n        'Possible values: URL string, \"false`KEEP_ORIGINAL`\" (hides the link) or leave empty (uses the default). Applications can override this setting by defining \"supportUrl`KEEP_ORIGINAL`\" application option.'\n      ),\n      control: new FormControl('')\n    },\n    'storageLimit.warning.email.subject': {\n      formId: 'storageLimit.warning.email.subject',\n      title: gettext('Warning email subject'),\n      description: gettext('Email which will be sent one day before data is deleted'),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'storageLimit.warning.email.template': {\n      formId: 'storageLimit.warning.email.template',\n      title: gettext('Warning email template'),\n      description: `${gettext(\n        'Email which will be sent one day before data is deleted. Placeholders: {tenant-domain}, {tenant}, {size} - storage usage in %'\n      )}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'storageLimit.process.email.subject': {\n      formId: 'storageLimit.process.email.subject',\n      title: gettext('Limit exceeded email subject'),\n      description: gettext('Email which will be sent after over-limit data has been deleted'),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'storageLimit.process.email.template': {\n      formId: 'storageLimit.process.email.template',\n      title: gettext('Limit exceeded email template'),\n      description: `${gettext(\n        'Email which will be sent after over-limit data has been deleted. Placeholders: {tenant-domain}, {tenant}, {size} - storage usage in %'\n      )}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'tenantSuspend.mail.sendtosuspended': {\n      formId: 'tenantSuspend.mail.sendtosuspended',\n      title: gettext(\"Send email to suspended tenant's administrator\"),\n      type: 'boolean',\n      control: new FormControl('')\n    },\n    'tenantSuspend.mail.additional.address': {\n      formId: 'tenantSuspend.mail.additional.address',\n      title: gettext('Tenant suspended email additional receiver'),\n      type: 'string',\n      control: new FormControl('', [Validators.email])\n    },\n    'tenantSuspend.mail.subject': {\n      formId: 'tenantSuspend.mail.subject',\n      title: gettext('Tenant suspended email subject'),\n      description: gettext(\n        \"Placeholder: {tenant} - suspended tenant's ID; {tenant-domain} - tenant's domain\"\n      ),\n      type: 'string',\n      control: new FormControl('')\n    },\n    'tenantSuspend.mail.text': {\n      formId: 'tenantSuspend.mail.text',\n      title: gettext('Tenant suspended email template'),\n      description: `${gettext(\n        \"Placeholder: {tenant} - suspended tenant's ID; {tenant-domain} - tenant's domain\"\n      )}`,\n      type: 'textarea',\n      control: new FormControl(''),\n      lineBreakHint: true\n    },\n    'system.support-user.enabled': {\n      formId: 'system.support-user.enabled',\n      title: gettext('Activate support user'),\n      description: gettext(\n        'Possible values: \"true`KEEP_ORIGINAL`\", \"false`KEEP_ORIGINAL`\", or a specific date until the user should remain active, for example, \"{{ exampleDate }}\". Leaving it blank, will set the value to \"true`KEEP_ORIGINAL`\".'\n      ),\n      descriptionTranslateParams: {\n        exampleDate: this.exampleTomorrowDate\n      },\n      type: 'string',\n      control: new FormControl(''),\n      placeholder: this.exampleTomorrowDate\n    },\n    'system.support-user.validity-limit': {\n      formId: 'system.support-user.validity-limit',\n      title: gettext('Validity limit'),\n      description: gettext(\n        'Each support user request from subtenant user will prolong support user access by the given number of hours (default: 24 hours). Leaving it blank, will set the value to \"24\".'\n      ),\n      type: 'number',\n      placeholder: `${gettext('e.g. {{ example }}')}`,\n      placeholderParams: { example: '24' },\n      control: new FormControl('', [Validators.min(0)])\n    }\n  };\n\n  optionsGroups = [\n    {\n      title: gettext('Passwords'),\n      id: 'passwordsOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['system.password.enforce.strength'],\n        this.platformConfigurationFormDefinitions['system.password.limit.validity'],\n        this.platformConfigurationFormDefinitions['system.password.history.size'],\n        this.platformConfigurationFormDefinitions['system.password.green.min-length']\n      ]\n    },\n    {\n      title: gettext('Two-factor authentication'),\n      id: 'twoFactorAuthenticationOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['two-factor-authentication.token.sms.template']\n      ]\n    },\n    {\n      title: gettext('Support link'),\n      id: 'supportLinkOptions',\n      items: [this.platformConfigurationFormDefinitions['system.support.url']]\n    },\n    {\n      title: gettext('Password reset'),\n      id: 'passwordResetOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['passwordReset.sendNotificationToUnknownEmails'],\n        this.platformConfigurationFormDefinitions['passwordReset.token.email.template'],\n        this.platformConfigurationFormDefinitions['passwordReset.user.not.found.email.template'],\n        this.platformConfigurationFormDefinitions['passwordReset.email.subject'],\n        this.platformConfigurationFormDefinitions['passwordReset.success.email.template'],\n        this.platformConfigurationFormDefinitions['passwordReset.invite.template']\n      ]\n    },\n    {\n      title: gettext('Support user'),\n      id: 'supportUserOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['system.support-user.enabled'],\n        this.platformConfigurationFormDefinitions['system.support-user.validity-limit']\n      ]\n    },\n    {\n      title: gettext('Email server'),\n      id: 'emailServerOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['ui.email.protocolAndEncryption'],\n        this.platformConfigurationFormDefinitions['email.host'],\n        this.platformConfigurationFormDefinitions['email.port'],\n        this.platformConfigurationFormDefinitions['email.username'],\n        this.platformConfigurationFormDefinitions['credentials.email.password'],\n        this.platformConfigurationFormDefinitions['email.from']\n      ]\n    },\n    {\n      title: gettext('Data export'),\n      id: 'dataExportOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['export.data.mail.subject'],\n        this.platformConfigurationFormDefinitions['export.data.mail.text'],\n        this.platformConfigurationFormDefinitions['export.data.mail.text.userunauthorized']\n      ]\n    },\n    {\n      title: gettext('Storage limit'),\n      id: 'storageLimitOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['storageLimit.warning.email.subject'],\n        this.platformConfigurationFormDefinitions['storageLimit.warning.email.template'],\n        this.platformConfigurationFormDefinitions['storageLimit.process.email.subject'],\n        this.platformConfigurationFormDefinitions['storageLimit.process.email.template']\n      ]\n    },\n    {\n      title: gettext('Suspending tenants'),\n      id: 'suspendingTenantsOptions',\n      items: [\n        this.platformConfigurationFormDefinitions['tenantSuspend.mail.sendtosuspended'],\n        this.platformConfigurationFormDefinitions['tenantSuspend.mail.additional.address'],\n        this.platformConfigurationFormDefinitions['tenantSuspend.mail.subject'],\n        this.platformConfigurationFormDefinitions['tenantSuspend.mail.text']\n      ]\n    }\n  ];\n\n  constructor(private c8yDatePipe: DatePipe) {}\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { PlatformConfigurationFormProviderService } from './platform-configuration-form-provider.service';\n\n@Component({\n  selector: 'c8y-platform-configuration-form',\n  templateUrl: './platform-configuration-form.component.html'\n})\nexport class PlatformConfigurationFormComponent {\n  @Input('optionsGroups')\n  set _optionsGroups(groupIds: string[]) {\n    if (groupIds === undefined) {\n      return;\n    }\n    this.optionsGroups = groupIds.map(groupId =>\n      this.formProviderService.optionsGroups.find(option => option.id === groupId)\n    );\n  }\n\n  @Input()\n  set readOnly(disabled: boolean) {\n    disabled ? this.form.disable() : this.form.enable();\n  }\n\n  @Input()\n  set formValue(value) {\n    if (value) {\n      const convertedValue = this.afterLoad(value);\n      this.form.patchValue(convertedValue, { emitEvent: false });\n      this.form.markAsUntouched();\n      this.form.markAsPristine();\n    }\n  }\n  optionsGroups = [];\n\n  @Output()\n  onSave = new EventEmitter();\n\n  form = new FormGroup({});\n\n  lineBreakHint = this.formProviderService.lineBreakHint;\n\n  constructor(private formProviderService: PlatformConfigurationFormProviderService) {\n    Object.keys(formProviderService.platformConfigurationFormDefinitions).forEach(fieldId => {\n      this.form.addControl(\n        fieldId,\n        formProviderService.platformConfigurationFormDefinitions[fieldId].control\n      );\n    });\n  }\n\n  /**\n   * Parses provided object's property values\n   * @param options\n   */\n  parseConfiguration(options: object): void {\n    const definitions: object = this.formProviderService.platformConfigurationFormDefinitions;\n    Object.entries(options).forEach(([key, rawValue]) => {\n      if (\n        definitions[key] &&\n        (definitions[key].type === 'number' || definitions[key].type === 'boolean')\n      ) {\n        try {\n          options[key] = JSON.parse(rawValue);\n        } catch {\n          options[key] = rawValue;\n        }\n      }\n    });\n  }\n\n  /**\n   * Parses incoming raw object before it is applied to FormGroup.\n   */\n  afterLoad(options: object): object {\n    this.parseConfiguration(options);\n\n    delete options['ui.email.protocolAndEncryption'];\n    const emailProtocol = options['email.protocol'];\n    const connectionEncrypted = options['email.connection.encrypted'] || false;\n    if (emailProtocol === 'smtp') {\n      if (connectionEncrypted) {\n        options['ui.email.protocolAndEncryption'] = 'SMTP_ENCRYPTED';\n      } else {\n        options['ui.email.protocolAndEncryption'] = 'SMTP_PLAIN';\n      }\n    } else if (emailProtocol === 'smtps') {\n      options['ui.email.protocolAndEncryption'] = 'SMTPS_ENCRYPTED';\n    } else {\n      options['ui.email.protocolAndEncryption'] = undefined;\n    }\n    return options;\n  }\n\n  /**\n   * Translates ui.email.protocolAndEncryption field into\n   * separate email.protocol and email.connection.encrypted\n   */\n  beforeSave(value): object {\n    const protocolAndEncryption = value['ui.email.protocolAndEncryption'];\n    if (protocolAndEncryption) {\n      //email.protocol\n      const protocol = protocolAndEncryption.match(/^(.+?)_(.+?)$/)[1];\n      value['email.protocol'] = protocol ? protocol.toLowerCase() : protocol;\n\n      // email.connection.encrypted\n      const encryption = protocolAndEncryption.match(/^(.+?)_(.+?)$/)[2];\n      value['email.connection.encrypted'] = encryption === 'ENCRYPTED';\n      delete value['ui.email.protocolAndEncryption'];\n    }\n\n    return value;\n  }\n\n  getDirtyValues() {\n    const dirtyValues = {};\n\n    Object.keys(this.form.controls).forEach(key => {\n      const currentControl = this.form.controls[key];\n\n      if (currentControl.dirty) {\n        dirtyValues[key] = currentControl.value;\n      }\n    });\n\n    return dirtyValues;\n  }\n\n  emitForm() {\n    if (this.form.valid) {\n      const changedValues = this.getDirtyValues();\n      const convertedValue = this.beforeSave(changedValues);\n      this.onSave.emit(convertedValue);\n    }\n  }\n}\n","<form [formGroup]=\"form\">\n  <div class=\"row\">\n    <div class=\"col-lg-12 col-lg-max\">\n      <div class=\"card card--fullpage\">\n        <div class=\"card-header separator\">\n          <div class=\"card-title\">\n            {{ 'Configuration' | translate }}\n          </div>\n        </div>\n        <div class=\"inner-scroll\">\n          <div class=\"card-block\">\n            <div>\n              <fieldset\n                class=\"row schema-form-fieldset separator-bottom p-t-24\"\n                *ngFor=\"let category of optionsGroups\"\n              >\n                <div class=\"col-sm-3 col-md-2 p-l-24 p-l-xs-8 p-b-8\">\n                  <div\n                    class=\"h4 text-normal text-right text-left-xs\"\n                    data-cy=\"fieldset--section-title\"\n                  >\n                    {{ category.title | translate }}\n                  </div>\n                </div>\n                <div class=\"col-sm-9 col-md-8\">\n                  <div\n                    class=\"form-group\"\n                    *ngFor=\"let field of category.items\"\n                  >\n                    <ng-container [ngSwitch]=\"field.type\">\n                      <ng-container *ngSwitchCase=\"'string'\">\n                        <ng-container\n                          *ngTemplateOutlet=\"stringTemplate; context: { $implicit: field }\"\n                        ></ng-container>\n                      </ng-container>\n                      <ng-container *ngSwitchCase=\"'number'\">\n                        <ng-container\n                          *ngTemplateOutlet=\"numberTemplate; context: { $implicit: field }\"\n                        ></ng-container>\n                      </ng-container>\n                      <ng-container *ngSwitchCase=\"'password'\">\n                        <ng-container\n                          *ngTemplateOutlet=\"passwordTemplate; context: { $implicit: field }\"\n                        ></ng-container>\n                      </ng-container>\n\n                      <ng-container *ngSwitchCase=\"'textarea'\">\n                        <ng-container\n                          *ngTemplateOutlet=\"textareaTemplate; context: { $implicit: field }\"\n                        ></ng-container>\n                      </ng-container>\n\n                      <ng-container *ngSwitchCase=\"'boolean'\">\n                        <ng-container\n                          *ngTemplateOutlet=\"booleanTemplate; context: { $implicit: field }\"\n                        ></ng-container>\n                      </ng-container>\n\n                      <ng-container *ngSwitchCase=\"'select'\">\n                        <ng-container\n                          *ngTemplateOutlet=\"selectTemplate; context: { $implicit: field }\"\n                        ></ng-container>\n                      </ng-container>\n                    </ng-container>\n                  </div>\n                </div>\n              </fieldset>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"card-footer separator\">\n          <button\n            class=\"btn btn-primary\"\n            [title]=\"'Save configuration' | translate\"\n            type=\"submit\"\n            (click)=\"emitForm()\"\n            [disabled]=\"!form.dirty || form.invalid || form.disabled\"\n          >\n            <span translate>Save</span>\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <ng-template\n    #stringTemplate\n    let-field\n  >\n    <c8y-form-group>\n      <label\n        title=\"{{ field.title | translate }}\"\n        [for]=\"field.formId\"\n      >\n        {{ field.title | translate }}\n      </label>\n      <input\n        class=\"text-truncate form-control\"\n        [title]=\"field.title | translate\"\n        type=\"text\"\n        [id]=\"field.formId\"\n        [formControlName]=\"field.formId\"\n        [placeholder]=\"field.placeholder || '' | translate : field.placeholderParams\"\n      />\n      <div\n        class=\"help-block\"\n        *ngIf=\"field.description\"\n      >\n        {{ field.description | translate : field.descriptionTranslateParams }}\n      </div>\n    </c8y-form-group>\n  </ng-template>\n\n  <ng-template\n    #passwordTemplate\n    let-field\n  >\n    <c8y-form-group>\n      <label\n        title=\"{{ field.title | translate }}\"\n        [for]=\"field.formId\"\n      >\n        {{ field.title | translate }}\n      </label>\n      <input\n        class=\"text-truncate form-control\"\n        [title]=\"field.title | translate\"\n        type=\"password\"\n        autocomplete=\"new-password\"\n        [id]=\"field.formId\"\n        [formControlName]=\"field.formId\"\n        [placeholder]=\"field.placeholder || '' | translate : field.placeholderParams\"\n      />\n      <div\n        class=\"help-block\"\n        *ngIf=\"field.description\"\n      >\n        {{ field.description | translate : field.descriptionTranslateParams }}\n      </div>\n    </c8y-form-group>\n  </ng-template>\n\n  <ng-template\n    #numberTemplate\n    let-field\n  >\n    <c8y-form-group>\n      <label\n        title=\"{{ field.title | translate }}\"\n        [for]=\"field.formId\"\n      >\n        {{ field.title | translate }}\n      </label>\n      <input\n        class=\"text-truncate form-control\"\n        [title]=\"field.title | translate\"\n        type=\"number\"\n        [id]=\"field.formId\"\n        [formControlName]=\"field.formId\"\n        [placeholder]=\"field.placeholder || '' | translate : field.placeholderParams\"\n      />\n      <div\n        class=\"help-block\"\n        *ngIf=\"field.description\"\n      >\n        {{ field.description | translate : field.descriptionTranslateParams }}\n      </div>\n    </c8y-form-group>\n  </ng-template>\n\n  <ng-template\n    #textareaTemplate\n    let-field\n  >\n    <c8y-form-group>\n      <label\n        title=\"{{ field.title | translate }}\"\n        [for]=\"field.formId\"\n      >\n        {{ field.title | translate }}\n      </label>\n      <textarea\n        class=\"form-control\"\n        [title]=\"field.title | translate\"\n        [id]=\"field.formId\"\n        [formControlName]=\"field.formId\"\n        [placeholder]=\"field.placeholder || '' | translate : field.placeholderParams\"\n        [rows]=\"10\"\n      ></textarea>\n      <div\n        class=\"help-block\"\n        *ngIf=\"field.description || field.lineBreakHint\"\n      >\n        <span *ngIf=\"field.description\">\n          {{ field.description | translate : field.descriptionTranslateParams }}\n        </span>\n        <span *ngIf=\"field.description && field.lineBreakHint\"><br /></span>\n        <span *ngIf=\"field.lineBreakHint\">{{ lineBreakHint | translate }}</span>\n      </div>\n    </c8y-form-group>\n  </ng-template>\n\n  <ng-template\n    #booleanTemplate\n    let-field\n  >\n    <c8y-form-group>\n      <label\n        class=\"c8y-checkbox\"\n        title=\"{{ field.title | translate }}\"\n      >\n        <input\n          [title]=\"field.title | translate\"\n          type=\"checkbox\"\n          [formControlName]=\"field.formId\"\n        />\n        <span></span>\n        <span>{{ field.title | translate }}</span>\n      </label>\n\n      <div\n        class=\"help-block\"\n        *ngIf=\"field.description\"\n      >\n        {{ field.description | translate : field.descriptionTranslateParams }}\n      </div>\n    </c8y-form-group>\n  </ng-template>\n\n  <ng-template\n    #selectTemplate\n    let-field\n  >\n    <c8y-form-group>\n      <label\n        title=\"{{ field.title | translate }}\"\n        [for]=\"field.formId\"\n      >\n        <span>{{ field.title | translate }}</span>\n      </label>\n      <div class=\"c8y-select-wrapper\">\n        <select\n          class=\"form-control\"\n          [id]=\"field.formId\"\n          [formControlName]=\"field.formId\"\n        >\n          <option></option>\n          <option\n            *ngFor=\"let option of field.options\"\n            [value]=\"option.value\"\n          >\n            {{ option.name | translate }}\n          </option>\n        </select>\n        <span></span>\n      </div>\n\n      <div\n        class=\"help-block\"\n        *ngIf=\"field.description\"\n      >\n        {{ field.description | translate : field.descriptionTranslateParams }}\n      </div>\n    </c8y-form-group>\n  </ng-template>\n</form>\n","import { CommonModule } from '@c8y/ngx-components';\nimport { NgModule } from '@angular/core';\nimport { PlatformConfigurationFormComponent } from './platform-configuration-form.component';\nimport { FormsModule } from '@c8y/ngx-components';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n  imports: [CommonModule, FormsModule, ReactiveFormsModule],\n  declarations: [PlatformConfigurationFormComponent],\n  exports: [PlatformConfigurationFormComponent]\n})\nexport class PlatformConfigurationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.PlatformConfigurationFormProviderService"],"mappings":"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"}