{"version":3,"file":"c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs","sources":["../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.ts","../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.html","../../branding/shared/lazy/add-branding-modal/add-branding-modal.service.ts","../../branding/shared/lazy/add-branding-modal/c8y-ngx-components-branding-shared-lazy-add-branding-modal.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\nimport { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';\nimport {\n  AbstractControl,\n  FormBuilder,\n  ReactiveFormsModule,\n  ValidatorFn,\n  Validators\n} from '@angular/forms';\nimport {\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  FormGroupComponent,\n  IconDirective,\n  MessageDirective,\n  MessagesComponent,\n  ModalComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NgForOf } from '@angular/common';\n\n@Component({\n  selector: 'c8y-add-branding-modal',\n  templateUrl: './add-branding-modal.component.html',\n  standalone: true,\n  imports: [\n    ModalComponent,\n    IconDirective,\n    FormGroupComponent,\n    MessagesComponent,\n    MessageDirective,\n    C8yTranslateDirective,\n    C8yTranslatePipe,\n    NgForOf,\n    ReactiveFormsModule\n  ]\n})\nexport class AddBrandingModalComponent {\n  @Input() duplicateBranding = false;\n  form: ReturnType<typeof this.initForm>;\n  namesAlreadyTaken: string[] = [];\n  loading = true;\n\n  result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n    this._resovle = resolve;\n    this._reject = reject;\n  });\n\n  messages = [\n    {\n      name: 'nameAlreadyTaken',\n      text: gettext('The provided name is already taken.')\n    },\n    {\n      name: 'onlyLowerCaseCharacters',\n      text: gettext('Only lower case characters are allowed.')\n    },\n    {\n      name: 'shouldStartWithLowerCaseLetterOrNumber',\n      text: gettext('Should start with a lower case letter or a number.')\n    },\n    {\n      name: 'invalidCharacters',\n      text: gettext('Invalid character \"{{ invalidCharacter }}\". Only a-z, 0-9 and - are allowed.')\n    }\n  ] as const;\n\n  private _resovle: (value: ReturnType<typeof this.initForm>['value']) => void;\n  private _reject: (reason?: any) => void;\n\n  constructor(\n    private branding: StoreBrandingService,\n    private formBuilder: FormBuilder\n  ) {\n    this.form = this.initForm();\n    this.getExistingBrandingVersions();\n  }\n\n  async getExistingBrandingVersions() {\n    try {\n      const { variants } = await this.branding.loadBrandingVariants();\n      this.namesAlreadyTaken = variants.map(variant => variant.version);\n    } catch (e) {\n      console.warn(e);\n    }\n    this.loading = false;\n  }\n\n  initForm() {\n    return this.formBuilder.group({\n      brandingName: [\n        '',\n        [Validators.required, this.ensureProperVariantName(), this.ensureNotExistingName()]\n      ]\n    });\n  }\n\n  cancel() {\n    this._reject();\n  }\n\n  save() {\n    this._resovle(this.form.value);\n  }\n\n  private ensureNotExistingName(): ValidatorFn {\n    return (control: AbstractControl) => {\n      if (typeof control.value === 'string') {\n        const lowercaseName = control.value.toLowerCase();\n        const nameAlreadyTaken = this.namesAlreadyTaken.some(name =>\n          name.toLowerCase().startsWith(lowercaseName + '-')\n        );\n        if (nameAlreadyTaken) {\n          return { nameAlreadyTaken: {} };\n        }\n      }\n      return null;\n    };\n  }\n\n  private ensureProperVariantName(): ValidatorFn {\n    return (control: AbstractControl) => {\n      if (typeof control.value === 'string') {\n        const value = control.value;\n        if (/[A-Z]/.test(value)) {\n          return {\n            onlyLowerCaseCharacters: {}\n          };\n        }\n        if (!/^[a-z0-9]+/.test(value)) {\n          return {\n            shouldStartWithLowerCaseLetterOrNumber: {}\n          };\n        }\n\n        const matches = /[^a-z0-9-]/.exec(value);\n        if (matches) {\n          return {\n            invalidCharacters: {\n              invalidCharacter: matches[0]\n            }\n          };\n        }\n      }\n      return null;\n    };\n  }\n}\n","<c8y-modal\n  [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n  [headerClasses]=\"'dialog-header'\"\n  (onDismiss)=\"cancel()\"\n  (onClose)=\"save()\"\n  [disabled]=\"form.invalid\"\n  [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n  <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n  <div [formGroup]=\"form\" class=\"p-24\">\n    <c8y-form-group>\n      <label\n        for=\"brandingName\"\n        translate\n      >\n        Branding name\n      </label>\n      <input\n        class=\"form-control\"\n        name=\"brandingName\"\n        id=\"brandingName\"\n        type=\"text\"\n        formControlName=\"brandingName\"\n        placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n      />\n      <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n        <c8y-message *ngFor=\"let message of messages\"\n          [name]=\"message.name\"\n          [text]=\"message.text | translate\"\n        ></c8y-message>\n      </c8y-messages>\n    </c8y-form-group>\n  </div>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { AddBrandingModalComponent } from './add-branding-modal.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AddBrandingModalService {\n  constructor(private modal: BsModalService) {}\n\n  async openAddBrandingModal() {\n    let versionDetails: Awaited<AddBrandingModalComponent['result']>;\n    try {\n      const modalRef = this.modal.show(AddBrandingModalComponent, {\n        class: 'modal-sm',\n        ariaDescribedby: 'modal-body',\n        ariaLabelledBy: 'modal-title',\n        ignoreBackdropClick: true,\n        keyboard: false\n      });\n      versionDetails = await modalRef.content.result;\n    } catch (e) {\n      // modal closed\n      return;\n    }\n\n    return versionDetails;\n  }\n\n  async openDuplicateBrandingModal() {\n    let versionDetails: Awaited<AddBrandingModalComponent['result']>;\n    try {\n      const modalRef = this.modal.show(AddBrandingModalComponent, {\n        class: 'modal-sm',\n        ariaDescribedby: 'modal-body',\n        ariaLabelledBy: 'modal-title',\n        initialState: { duplicateBranding: true },\n        ignoreBackdropClick: true,\n        keyboard: false\n      });\n      versionDetails = await modalRef.content.result;\n    } catch (e) {\n      // modal closed\n      return;\n    }\n\n    return versionDetails;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":";;;;;;;;;;MAqCa,yBAAyB,CAAA;IAiCpC,WAAA,CACU,QAA8B,EAC9B,WAAwB,EAAA;QADxB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,WAAW,GAAX,WAAW;QAlCZ,IAAA,CAAA,iBAAiB,GAAG,KAAK;QAElC,IAAA,CAAA,iBAAiB,GAAa,EAAE;QAChC,IAAA,CAAA,OAAO,GAAG,IAAI;QAEd,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,CAA4C,CAAC,OAAO,EAAE,MAAM,KAAI;AAClF,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACvB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAA,CAAA,QAAQ,GAAG;AACT,YAAA;AACE,gBAAA,IAAI,EAAE,kBAAkB;AACxB,gBAAA,IAAI,EAAE,OAAO,CAAC,qCAAqC;AACpD,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,yBAAyB;AAC/B,gBAAA,IAAI,EAAE,OAAO,CAAC,yCAAyC;AACxD,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,wCAAwC;AAC9C,gBAAA,IAAI,EAAE,OAAO,CAAC,oDAAoD;AACnE,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,IAAI,EAAE,OAAO,CAAC,8EAA8E;AAC7F;SACO;AASR,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,CAAC,2BAA2B,EAAE;IACpC;AAEA,IAAA,MAAM,2BAA2B,GAAA;AAC/B,QAAA,IAAI;YACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE;AAC/D,YAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;QACnE;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;IACtB;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5B,YAAA,YAAY,EAAE;gBACZ,EAAE;AACF,gBAAA,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,EAAE,EAAE,IAAI,CAAC,qBAAqB,EAAE;AACnF;AACF,SAAA,CAAC;IACJ;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,OAAO,EAAE;IAChB;IAEA,IAAI,GAAA;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC;IAEQ,qBAAqB,GAAA;QAC3B,OAAO,CAAC,OAAwB,KAAI;AAClC,YAAA,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;gBACrC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE;gBACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IACvD,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,GAAG,GAAG,CAAC,CACnD;gBACD,IAAI,gBAAgB,EAAE;AACpB,oBAAA,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE;gBACjC;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;IAEQ,uBAAuB,GAAA;QAC7B,OAAO,CAAC,OAAwB,KAAI;AAClC,YAAA,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;AACrC,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;AAC3B,gBAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACvB,OAAO;AACL,wBAAA,uBAAuB,EAAE;qBAC1B;gBACH;gBACA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBAC7B,OAAO;AACL,wBAAA,sCAAsC,EAAE;qBACzC;gBACH;gBAEA,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBACxC,IAAI,OAAO,EAAE;oBACX,OAAO;AACL,wBAAA,iBAAiB,EAAE;AACjB,4BAAA,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAC5B;qBACF;gBACH;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;+GA7GW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,sICrCtC,smCAoCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVI,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,aAAa,2EACb,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,kFAChB,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAErB,OAAO,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACP,mBAAmB,+1BAFnB,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAhBrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EAEtB,IAAI,EAAA,OAAA,EACP;wBACP,cAAc;wBACd,aAAa;wBACb,kBAAkB;wBAClB,iBAAiB;wBACjB,gBAAgB;wBAChB,qBAAqB;wBACrB,gBAAgB;wBAChB,OAAO;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,smCAAA,EAAA;;sBAGA;;;ME/BU,uBAAuB,CAAA;AAClC,IAAA,WAAA,CAAoB,KAAqB,EAAA;QAArB,IAAA,CAAA,KAAK,GAAL,KAAK;IAAmB;AAE5C,IAAA,MAAM,oBAAoB,GAAA;AACxB,QAAA,IAAI,cAA4D;AAChE,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC1D,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,eAAe,EAAE,YAAY;AAC7B,gBAAA,cAAc,EAAE,aAAa;AAC7B,gBAAA,mBAAmB,EAAE,IAAI;AACzB,gBAAA,QAAQ,EAAE;AACX,aAAA,CAAC;AACF,YAAA,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM;QAChD;QAAE,OAAO,CAAC,EAAE;;YAEV;QACF;AAEA,QAAA,OAAO,cAAc;IACvB;AAEA,IAAA,MAAM,0BAA0B,GAAA;AAC9B,QAAA,IAAI,cAA4D;AAChE,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC1D,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,eAAe,EAAE,YAAY;AAC7B,gBAAA,cAAc,EAAE,aAAa;AAC7B,gBAAA,YAAY,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE;AACzC,gBAAA,mBAAmB,EAAE,IAAI;AACzB,gBAAA,QAAQ,EAAE;AACX,aAAA,CAAC;AACF,YAAA,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM;QAChD;QAAE,OAAO,CAAC,EAAE;;YAEV;QACF;AAEA,QAAA,OAAO,cAAc;IACvB;+GAxCW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACND;;AAEG;;;;"}