{"version":3,"file":"7650.022124b6fdd5f8ae.js","mappings":"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","names":["i0","ctx_r1","heading","_r3","share","shareToOptions","FACEBOOK","TWITTER","LINKEDIN","CLIPBOARD","project","shareUrl","ModalInviteSuccessComponent","_ModalInviteSuccessComponent","constructor","socialSharingService","modalController","this","title","SHARING_METHOD","openAddMemberDialog","_this","_asyncToGenerator","dismiss","navToProject","shareTo","id","description","type","ITEM_TYPE","Projects","catch","error","console","i1","i2","selectors","viewQuery","rf","ctx","BaseModalComponent","socialSharingServiceProvider","decls","vars","consts","template","ModalInviteSuccessComponent_h1_4_Template","_r1","ModalInviteSuccessComponent_section_11_Template","btnText","NgIf","SelectInputOnClickDirective","TranslatePipe","IonButton","IonIcon","IonItem","IonInput","styles","message","email_r3","InviteFormComponent_ng_container_1_div_18_span_4_Template","emails","sendInvites","$event","emailsChange","InviteFormComponent_ng_container_1_div_14_Template","InviteFormComponent_ng_container_1_div_18_Template","projectMemberInviteForm","get","hideProjectSelect","projectOptions","valid","length","loadingAttempt","translatePath","actionUrl","InviteFormComponent","_InviteFormComponent","routeId","value","messagePath","_routeId","OnboardingTypes","Teams","Weddings","translate","pipe","take","subscribe","res","warn","patchValue","formBuilder","store","mailerApi","configService","tokensService","toaster","userService","projectId","TRANSLATE_ROOT","inviteSuccess","EventEmitter","isLoggedIn$","group","Validators","required","_appUrl","onDestroy$","Subject","_projects","ngOnInit","select","selectMyProjects","takeUntil","projects","Array","isArray","activeProjectId","routeTemplates","push","Pro","checkAndUpdateProjectId","projs","buildProjectOptions","some","p","filter","includes","toLowerCase","ngOnDestroy","next","complete","split","element","Utils","REGEX_EMAIL","test","combineLatest","username$","email$","_ref","name","userEmail","proj","find","projectsTextArr","present","img","hero","projectRole","PROJECT_MEMBER_ROLE","CREW","returnUrl","getInviteAcceptPath","appProjectUrl","PROJECT_DETAIL_ROUTE","eventType","getInviteTypeFromProject","payload","getReturnUrl","acceptUrl","tokenQueryParam","TOKEN_QUERY_PARAM","messageNoNewlines","convertNewlinesToBr","getEmailTranslatePath","el","footer","instant","promises","email","token","Token","sentToEmail","fromEmail","action","TokenActions","ProjectInvite","createToken","then","tokenId","urlWithToken","url","projectsHtml","projectsText","buildProjectsListMessage","map","item","params","toEmail","subject","topic","MailTopic","InviteToCrew","messageText","stripHtml","leaveBrTags","buttonLabel","DEBUG_LOGS","sendEmail","result","Promise","all","allResults","resetOnSuccess","allError","_x","apply","arguments","sort","a","b","sortObjArrayAlphaBy","text","msg","reset","emit","i3","i4","i5","i6","i7","i8","inputs","outputs","standalone","features","InviteFormComponent_ng_container_1_Template","InviteFormComponent_ng_template_3_Template","notLoggedIn_r4","FormsModule","ReactiveFormsModule","FormTextareaComponent","FormSelectComponent","ButtonComponent","NgFor","LoginFormComponent","AsyncPipe","FormControlCastPipe","QrManageComponent_ng_template_1_h1_0_Template","QrManageComponent_ng_template_1_ng_template_1_Template","persistentTokenActive","notPublicHeading_r1","qrCode","_r4","renewExpiration","confirmDeleteAndNew","_c0","persistentToken","expires","_r5","addDays","QrManageComponent_ng_template_4_ng_container_0_ng_container_2_ng_container_1_Template","QrManageComponent_ng_template_4_ng_container_0_ng_container_2_ng_template_2_Template","persistentTokenExpired","notExpired_r6","_r7","disablePublicInvite","QrManageComponent_ng_template_4_ng_container_0_ng_container_1_Template","QrManageComponent_ng_template_4_ng_container_0_ng_container_2_Template","QrManageComponent_ng_template_4_ng_container_0_div_3_Template","persistentTokenId","_r8","generateQr","QrManageComponent_ng_template_4_ng_template_1_div_3_ion_spinner_2_Template","generatingQr","QrManageComponent_ng_template_4_ng_template_1_div_3_Template","hasPersistentToken","QrManageComponent_ng_template_4_ng_container_0_Template","QrManageComponent_ng_template_4_ng_template_1_Template","notPublic_r9","QrManageComponent","_QrManageComponent","_project","isStudio","listTokens","tokens","environment","production","log","t","persistToken","createTokenQrCode","loadingTokens","_b","_a","isActive","isTokenExpired","alertController","setTimeout","enableTokenUpdateExpired","Date","now","disableToken","toISOString","success","data","ToasterPosition","Bottom","updatePersistentToken","_this2","create","header","subHeader","buttons","role","handler","deleteAndGenerateNew","_this3","userId$","userId","createPersistentToken","getEventTypeFromOnboarding","err","event","updates","days","from","_this4","enableToken","getExpires","_this5","deleteToken","QrManageComponent_h1_0_Template","QrManageComponent_ng_template_1_Template","QrManageComponent_div_3_Template","QrManageComponent_ng_template_4_Template","doneLoadingTokensHeading_r10","doneLoadingTokens_r11","TranslateDirective","DatePipe","QrCodeComponent","IonSpinner","openSuccessDialog","inactiveUsers_r5","ngIf","viewInactiveUsers","AddMemberComponent_div_27_div_1_span_2_Template","AddMemberComponent_div_27_div_1_span_3_Template","viewingInactiveUsers","AddMemberComponent_div_27_div_1_Template","user_r7","roleInCurrentProject","_r6","$implicit","onClickUser","AddMemberComponent_div_32_div_3_div_5_Template","viewProjectMember","isUserSelected","avatar","avatarFallback","AddMemberComponent_div_32_div_1_Template","AddMemberComponent_div_32_div_3_Template","searchResults_r8","selectedUserIds","_r9","onProjectRoleChanged","projects$","PAGE","AddMemberComponent","_AddMemberComponent","of","getTranslatePath","projectMemberService","projectService","sentryService","navCtrl","addSuccess","showBillingText","loadingAddCrew","DEFAULT_USER_AVATAR_TERTIARY","submitEmailAttempt","inactiveUsers","searchChanged$","getMyProjects","projectsInactiveUsers$","reduce","acc","members","member","m","tap","searchResults$","selectMemberQueryResults","distinctUntilChanged","users","u","User","selected","getUserAvatar","memberProjects","projOwned","OWNER","search","switchMap","queryMembers","EMPTY","resetQueryMembers","searchChanged","user","splice","findIndex","username","addToQueryMemberResults","stopPropagation","component","ProjectMemberModalComponent","componentProps","viewOnly","cssClass","addProjectRole","submitAddUser","forEach","isCurrentlyInactive","dispatch","updateMemberAction","addMemberAction","membersAdded","makeCommaSeparatedString","captureError","modal","onDidDismiss","navigateForward","openCommunityRules","CommunityRulesPage","isModal","AddMemberComponent_p_7_Template","AddMemberComponent_app_invite_form_18_Template","AddMemberComponent_ng_template_19_Template","AddMemberComponent_div_27_Template","AddMemberComponent_div_32_Template","AddMemberComponent_app_project_member_projects_51_Template","AddMemberComponent_div_54_Template","AddMemberComponent_span_58_Template","AddMemberComponent_ion_spinner_61_Template","AddMemberComponent_section_62_Template","projectLoading_r10","ImageFallbackDirective","SearchbarComponent","ProjectMemberProjectsComponent","IonAvatar","item_r1","hint","errorMessage","_FormSelectComponent","BaseFormComponent","super","interface","disabled","interfaceOptions","side","items","placeholder","isReadyForValidation","updateProp","detail","FormSelectComponent_ion_select_option_2_Template","FormSelectComponent_span_3_Template","label","control","FormItemComponent","IonSelect","IonSelectOption","_SelectInputOnClickDirective","selectAll","nativeEl","nativeElement","querySelector","setSelectionRange","hostBindings"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/modal-invite-success/modal-invite-success.component.html","./src/app/shared/components/modal-invite-success/modal-invite-success.component.ts","./src/app/project-members/shared/components/invite-form/invite-form.component.html","./src/app/project-members/shared/components/invite-form/invite-form.component.ts","./src/app/tokens/shared/components/qr-manage/qr-manage.component.html","./src/app/tokens/shared/components/qr-manage/qr-manage.component.ts","./src/app/project-members/add-member/add-member.component.html","./src/app/project-members/add-member/add-member.component.ts","./src/app/shared/components/ui/form/form-select/form-select.component.html","./src/app/shared/components/ui/form/form-select/form-select.component.ts","./src/app/shared/directives/select-input-on-click.directive.ts"],"sourcesContent":["<fs-base-modal [title]=\"title\" mode=\"light\" #modal>\n  <section>\n    <div class=\"container heading ion-text-center\">\n      <h1 *ngIf=\"heading\">{{ heading }}</h1>\n      <div class=\"buttons\">\n        <ion-button (click)=\"openAddMemberDialog()\">{{ btnText }}</ion-button>\n        <ion-button fill=\"outline\" (click)=\"navToProject()\">{{ 'PROJECT.RETURN' | translate }}</ion-button>\n      </div>\n    </div>\n  </section>\n\n  <section *ngIf=\"project?.id\">\n    <div class=\"text-center\">\n      <h3>{{ 'PROJECT.SHARE_THIS' | translate }}</h3>\n      <div class=\"share-buttons row ion-padding ion-justify-content-center\">\n        <ion-button fill=\"outline\" color=\"dark\" (click)=\"share(shareToOptions.FACEBOOK)\" title=\"Share on Facebook\">\n          <ion-icon slot=\"icon-only\" name=\"logo-facebook\"></ion-icon>\n        </ion-button>\n        <ion-button fill=\"outline\" color=\"dark\" (click)=\"share(shareToOptions.TWITTER)\" title=\"Share on Twitter\">\n          <ion-icon slot=\"icon-only\" name=\"logo-twitter\"></ion-icon>\n        </ion-button>\n        <ion-button fill=\"outline\" color=\"dark\" (click)=\"share(shareToOptions.LINKEDIN)\" title=\"Share on LinkedIn\">\n          <ion-icon slot=\"icon-only\" name=\"logo-linkedin\"></ion-icon>\n        </ion-button>\n      </div>\n      <div class=\"row\">\n        <ion-item class=\"share-item\" lines=\"none\">\n          <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"project?.shareUrl\"></ion-input>\n          <ion-button shape=\"round\" (click)=\"share(shareToOptions.CLIPBOARD)\" title=\"Copy to Clipboard\">\n            <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n          </ion-button>\n        </ion-item>\n      </div>\n    </div>\n  </section>\n</fs-base-modal>\n","/** @format */\n\nimport { Component, ViewChild, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon, IonInput, IonItem, ModalController } from '@ionic/angular/standalone';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { SHARING_METHOD, ShareableItem } from '@app/core/social-sharing/social-sharing.model';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { SelectInputOnClickDirective } from '@app/shared/directives/select-input-on-click.directive';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { Project } from '@app/projects/shared/project.model';\n\n// const STEPS = {\n//   selection: { id: 'selection', back: null, next: 'subSelection' },\n//   additionalText: { id: 'additionalText', back: 'subSelection', next: 'sent' },\n//   sent: { id: 'sent', back: null, next: null },\n// };\n// type Steps = keyof typeof STEPS;\n\n@Component({\n  selector: 'app-modal-invite-success',\n  templateUrl: './modal-invite-success.component.html',\n  styleUrls: ['./modal-invite-success.component.scss'],\n  providers: [socialSharingServiceProvider],\n  standalone: true,\n  imports: [\n    NgIf,\n    BaseModalComponent,\n    SelectInputOnClickDirective,\n    TranslatePipe,\n    IonButton,\n    IonIcon,\n    IonItem,\n    IonInput,\n  ],\n})\nexport class ModalInviteSuccessComponent {\n  @Input() heading: string;\n  @Input() btnText: string;\n  @Input() project: Project;\n\n  title = '';\n  shareToOptions = SHARING_METHOD;\n\n  @ViewChild('modal', { static: false, read: BaseModalComponent })\n  modal: BaseModalComponent;\n\n  constructor(private socialSharingService: SocialSharingService, private modalController: ModalController) {}\n\n  async openAddMemberDialog() {\n    this.modalController.dismiss({\n      openAddMemberDialog: true,\n    });\n  }\n\n  navToProject() {\n    // this.project.id\n    this.modalController.dismiss({\n      navToProject: true,\n    });\n  }\n\n  share(shareTo: SHARING_METHOD) {\n    const shareItem: ShareableItem = {\n      id: this.project.id,\n      title: this.project.title,\n      description: this.project.description,\n      shareUrl: this.project.shareUrl,\n      type: ITEM_TYPE.Projects,\n      // tags: ,\n    };\n\n    this.socialSharingService.shareTo(shareItem, shareTo).catch((error) => {\n      console.error(error);\n    });\n  }\n}\n","<div class=\"invite-form\">\n  \n  <ng-container *ngIf=\"isLoggedIn$ | async as isLoggedIn; else notLoggedIn\">\n    <form\n      [formGroup]=\"projectMemberInviteForm\"\n      (ngSubmit)=\"sendInvites()\"\n    >\n\n      <fs-form-textarea\n        [label]=\"'MEMBERS.INVITE.LABEL' | translate\"\n        [control]=\"projectMemberInviteForm.get('message') | formControlCast\"\n      ></fs-form-textarea>\n\n      <fs-form-textarea\n        [label]=\"'COMMON.EMAILS' | translate\"\n        [placeholder]=\"'ONBOARDING.COMMON.INVITE.MEMBERS_PLACEHOLDER' | translate\"\n        [control]=\"projectMemberInviteForm.get('emails') | formControlCast\"\n        [debounce]=\"1000\"\n        (onInput)=\"emailsChange($event)\"\n      ></fs-form-textarea>\n\n      <!-- <ion-item lines=\"none\">\n        <ion-label position=\"floating\" class=\"ion-text-uppercase\">{{ 'MEMBERS.INVITE.LABEL' | translate }}</ion-label>\n        <ion-textarea rows=\"5\" auto-grow=\"true\" [(ngModel)]=\"message\"></ion-textarea>\n      </ion-item>\n\n      <ion-item lines=\"none\">\n        <ion-label position=\"stacked\" class=\"ion-text-uppercase\">{{ 'COMMON.EMAILS' | translate }}</ion-label>\n        <ion-textarea debounce=\"500\" rows=\"6\"\n          [placeholder]=\"'ONBOARDING.COMMON.INVITE.MEMBERS_PLACEHOLDER' | translate\"\n          (ionChange)=\"membersChange($event.detail.value)\"\n        ></ion-textarea>\n      </ion-item> -->\n\n      <fs-form-select [hidden]=\"hideProjectSelect\"\n        label=\"{{ 'COMMON.PROJECT' | translate }}\"\n        placeholder=\"{{ 'PROJECT.SELECT_PROJECT' | translate }}\"\n        [items]=\"projectOptions\"\n        [control]=\"projectMemberInviteForm.get('projectId') | formControlCast\"\n      ></fs-form-select>\n\n      <div class=\"actions ion-text-center ion-padding-top ion-padding-bottom\">\n        <div *ngIf=\"message\" class=\"message ion-padding-bottom ion-color-success\">\n          {{ message }}\n        </div>\n        <fs-button\n          [disabled]=\"!projectMemberInviteForm.valid || emails.length < 1 || loadingAttempt\"\n          type=\"submit\"\n          size=\"large\"\n          [loading]=\"loadingAttempt\"\n          >{{ translatePath + 'INVITE_ACTION' | translate }}</fs-button\n        >\n      </div>\n    </form>\n\n    <div *ngIf=\"emails?.length > 0\" class=\"results\">\n      <h3>{{ 'COMMON.EMAILS_FOUND' | translate }}:</h3>\n      <span *ngFor=\"let email of emails\" style=\"display:inline-block;margin-right: 10px;\">{{ email }}</span>\n    </div>\n\n    <!-- <div *ngIf=\"projectId\" class=\"ion-text-center\">\n      <ion-button [routerLink]=\"['/stack/discover/project/', projectId]\" fill=\"outline\">\n        {{ 'PROJECT.RETURN_TO_PROJECT' | translate }}\n      </ion-button>\n    </div> -->\n  </ng-container>\n\n  <ng-template #notLoggedIn>\n    <!-- LOGGED OUT -->\n    <div class=\"container skinny-limit-width\">\n      <fs-login-form [routeOnSuccess]=\"actionUrl\"></fs-login-form>\n    </div>\n  </ng-template>\n</div>","/** @format */\n\nimport { Component, Input, OnDestroy, OnInit, Output, EventEmitter } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { UntypedFormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { combineLatest, Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { MailerApiService, MailTopic, SendMail } from '@app/core/api/mailer.api.service';\nimport { ConfigService } from '@app/core/config/config.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { FormTextareaComponent } from '@app/shared/components/ui/form/form-textarea/form-textarea.component';\nimport { FormSelectComponent } from '@app/shared/components/ui/form/form-select/form-select.component';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { LoginFormComponent } from '@app/shared/components/login/login-form.component';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport { Utils } from '@app/shared/utils';\nimport { Project } from '@app/projects/shared/project.model';\nimport {\n  getInviteAcceptPath,\n  getInviteTypeFromProject,\n  OnboardingTypes,\n  TRANSLATE_ROOT,\n} from '@app/onboarding/shared/onboarding.model';\nimport { getReturnUrl, Token, TokenActions, TokenPayload, TOKEN_QUERY_PARAM } from '@app/tokens/shared/tokens.model';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\nimport { PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMyProjects } from '@store/selectors/projects.selectors';\n\nconst DEBUG_LOGS = false;\nconst ROOT_APP_URL = 'https://app.filmstacker.com/';\n\n@Component({\n  selector: 'app-invite-form',\n  templateUrl: './invite-form.component.html',\n  styleUrls: ['./invite-form.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    FormsModule,\n    ReactiveFormsModule,\n    FormTextareaComponent,\n    FormSelectComponent,\n    ButtonComponent,\n    NgFor,\n    LoginFormComponent,\n    AsyncPipe,\n    TranslatePipe,\n    FormControlCastPipe,\n  ],\n})\nexport class InviteFormComponent implements OnInit, OnDestroy {\n  @Input() projectId = '';\n  @Input() translatePath = TRANSLATE_ROOT;\n  @Input() actionUrl = '/invite';\n  @Input()\n  set routeId(value) {\n    this._routeId = value || OnboardingTypes.Teams;\n    let messagePath;\n    switch (value) {\n      case OnboardingTypes.Weddings: {\n        messagePath = 'EMAILS.ONBOARDING.WEDDINGS.INVITE_MESSAGE';\n        break;\n      }\n      default: {\n        messagePath = 'EMAILS.ONBOARDING.EVENTS.INVITE_MESSAGE';\n      }\n    }\n    DEBUG_LOGS && console.log(`[InviteForm]`, { routeId: value, messagePath });\n    this.translate\n      .get(messagePath)\n      .pipe(take(1))\n      .subscribe((res: string) => {\n        if (!res) {\n          return console.warn(`[INVITE] missing translation?`);\n        }\n        this.projectMemberInviteForm.patchValue({\n          message: res,\n        });\n      });\n  }\n  get routeId() {\n    return this._routeId;\n  }\n\n  @Output() inviteSuccess = new EventEmitter();\n\n  isLoggedIn$ = this.userService.isLoggedIn$;\n\n  projectMemberInviteForm = this.formBuilder.group({\n    projectId: ['', Validators.required],\n    message: ['', Validators.required],\n    emails: ['', Validators.required],\n  });\n\n  /** the emails we will contact */\n  emails: string[] = [];\n  loadingAttempt = false;\n  message = '';\n\n  hideProjectSelect = true;\n  projectOptions = [];\n  // myProjects$ = this.store.select(getMyProjects);\n\n  private _appUrl = ROOT_APP_URL;\n  private onDestroy$ = new Subject<void>();\n  private _projects: Project[] = [];\n  private _routeId: string;\n\n  constructor(\n    private formBuilder: UntypedFormBuilder,\n    private store: Store<State>,\n    private translate: TranslateService,\n    private mailerApi: MailerApiService,\n    private configService: ConfigService,\n    private tokensService: TokensService,\n\n    private toaster: ToasterService,\n    private userService: UserService\n  ) {}\n\n  ngOnInit(): void {\n    /**\n     * 1. get the activeProject and select that one if it's mine & is {eventType} template\n     * 2. Filter myProjects by eventType template\n     * 3. auto-select if only one project exists\n     * @see stack-form-details for similar implementation\n     */\n    //  combineLatest([\n    //   this.myProjects$,\n    //   from(this.projectId),//this.environService.activeProjectId$,\n    //   this.onboardingService.routeOnboardingType$\n    // ])\n    this.store\n      .select(selectMyProjects)\n      .pipe(takeUntil(this.onDestroy$))\n      .subscribe((projects) => {\n        this._projects = Array.isArray(projects) ? projects : [];\n        const activeProjectId = this.projectId;\n\n        const routeTemplates = [];\n        switch (this.routeId) {\n          case OnboardingTypes.Weddings: {\n            routeTemplates.push(...['wedding', 'weddings']);\n            break;\n          }\n          case OnboardingTypes.Teams:\n            routeTemplates.push(...['team', 'teams']);\n            break;\n          case OnboardingTypes.Pro:\n            routeTemplates.push(...['pro']);\n            break;\n          default: {\n            // nada\n          }\n        }\n\n        DEBUG_LOGS &&\n          console.log(`[InviteForm] getMyProjects`, {\n            projects,\n            routeTemplates,\n            routeId: this.routeId,\n            activeProjectId,\n          });\n\n        const checkAndUpdateProjectId = (projs: Project[] = []): boolean => {\n          // don't return on already set form, as this will be called multiple times while building the myProjects from crew & owned api calls\n          // if (this.projectMemberInviteForm.get('projectId').value) {\n          //   // we already have a value, we're done\n          //   return true;\n          // }\n          if (projs.length > 0) {\n            this.buildProjectOptions(projs);\n            if (projs.length === 1) {\n              DEBUG_LOGS && console.log(`[InviteForm] only one project -> use that!`);\n              this.projectMemberInviteForm.patchValue({\n                projectId: projs[0].id,\n              });\n            } else if (activeProjectId && projs.some((p) => p && p.id === activeProjectId)) {\n              // if there's an activeProject, and it's included\n              DEBUG_LOGS && console.log(`[InviteForm] includes activeProject -> use that!`, activeProjectId);\n              this.projectMemberInviteForm.patchValue({\n                projectId: activeProjectId,\n              });\n            }\n            this.hideProjectSelect = projs.length === 1;\n            return true; // options ready for select\n          }\n          return false;\n        };\n\n        // check if we have myprojects that match the projectId found in route\n        const routed = this.projectId ? this._projects.filter((p) => p && p.id === this.projectId) : [];\n        if (!checkAndUpdateProjectId(routed)) {\n          // check if we have myprojects that match the template based on routeId\n          const filtered = this._projects.filter(\n            (p) => p && p.template && routeTemplates.includes(p.template.toLowerCase())\n          );\n          if (!checkAndUpdateProjectId(filtered)) {\n            // myProjects do not have matching routeTemplates\n            DEBUG_LOGS &&\n              console.log(`[InviteForm] combineLatest myProjects do not have matching routeTemplates...yet`, {\n                projects,\n                activeProjectId,\n                routeTemplates,\n                filtered,\n              });\n            checkAndUpdateProjectId(this._projects);\n          }\n        }\n      });\n\n    // this is not the correct logic, as a widget could not accept tokens, only the root app\n    // this.configService.appConfig.then(({ shareUrl }) => {\n    //   this._appUrl = shareUrl;\n    // });\n  }\n\n  // ngAfterViewChecked(): void {\n  //   /**\n  //    * this was migrated from the onboarding-invite - TBD if still needed...\n  //    * was added to avoid expression change after it was checked ng-valid-true for the projectId causing input-select to change & hide\n  //    * https://stackoverflow.com/questions/53901392/expression-has-changed-after-it-was-checked-previous-value-ng-valid-true-c\n  //    */\n  //   this.changeDetectorRef.detectChanges();\n  // }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  /**\n   * TextArea emails change\n   * split the string on each occurrence of a space or comma (split(/[, ]+/)), or newline  (.split(/\\r?\\n/))\n   * The plus + matches the preceding item (comma or space) one or more times, which means both a comma and a space would count as 1 match.\n   * filter exists and passes basic valid email test\n   */\n  emailsChange(value) {\n    try {\n      if (!value || typeof value.split !== 'function') return;\n      this.emails = value.split(/[, \\r?\\n/]+/).filter((element) => element && Utils.REGEX_EMAIL.test(element));\n    } catch (error) {\n      console.warn(error);\n    }\n  }\n\n  /**\n   * @todo why the url pro? just always make it teams!\n   *\n   * Send the invitations\n   * @see add-member.component refactor similar function implementation?\n   */\n  async sendInvites() {\n    this.message = '';\n    if (!Array.isArray(this.emails) || this.emails.length < 1) {\n      return;\n    }\n    this.loadingAttempt = true;\n\n    try {\n      combineLatest([this.userService.username$, this.userService.email$])\n        .pipe(take(1))\n        .subscribe(async ([name, userEmail]) => {\n          const emails = this.emails;\n          const message = this.projectMemberInviteForm.get('message').value;\n          const projectId = this.projectMemberInviteForm.get('projectId').value;\n\n          const proj = this._projects.find((p) => p && p.id === projectId);\n          const projectsTextArr = [];\n          if (proj && proj.id && proj.title) {\n            projectsTextArr.push({\n              id: projectId,\n              title: proj.title,\n              img: proj.hero,\n              shareUrl: proj.shareUrl,\n              // mission: proj.mission,\n            });\n          } else {\n            console.warn(`[INVITE] sendInvite missing project Data?`, {\n              proj,\n              projects: this._projects,\n              projectId,\n            });\n            this.toaster.present(`We had an issue getting the Project Details? Please try again..`);\n            return;\n          }\n\n          // set everyone as crew, initially\n          const projectRole = PROJECT_MEMBER_ROLE.CREW;\n          /** the url to have displayed in the email */\n          const returnUrl = `${this._appUrl}${getInviteAcceptPath(this.routeId as OnboardingTypes)}/${projectId}`;\n          const appProjectUrl = `${this._appUrl}${PROJECT_DETAIL_ROUTE}/${projectId}`;\n          /**\n           * @todo when migrating, here handle different eventType\n           */\n          // const eventType = getEventTypeFromOnboarding(this.routeId);\n          const eventType = getInviteTypeFromProject(proj);\n          const payload: TokenPayload = {\n            /** the url to redirect upon signup/in */\n            returnUrl: getReturnUrl(projectId),\n            acceptUrl: returnUrl,\n            message,\n            // eventType,// moved to parent\n          };\n\n          // create a querystring adder to shareUrl\n          const tokenQueryParam = TOKEN_QUERY_PARAM;\n          // const tokenQuery = `?${tokenQueryParam}=`; // ${tokenId}`;\n\n          const messageNoNewlines = Utils.convertNewlinesToBr(message);\n\n          const getEmailTranslatePath = (el) => {\n            switch (this.routeId) {\n              case OnboardingTypes.Weddings: {\n                return 'EMAILS.ONBOARDING.WEDDINGS.' + el;\n              }\n              default: {\n                return 'EMAILS.ONBOARDING.EVENTS.' + el;\n              }\n            }\n          };\n\n          const footer = this.translate.instant(getEmailTranslatePath('INVITE_INSTRUCTION'));\n\n          // loop all the emails..\n          const promises = [];\n\n          for (const email of this.emails) {\n            /**\n             *\n             */\n            const token: Token = new Token({\n              // email,\n              sentToEmail: email,\n              fromEmail: userEmail, // user that sent the token\n              projectId,\n              projectRole,\n              action: TokenActions.ProjectInvite,\n              payload,\n              eventType,\n            });\n\n            promises.push(\n              this.tokensService.createToken(token).then((res) => {\n                const { id: tokenId, message: createTokenMessage } = res;\n\n                /**\n                 * @todo refactor to mailerService.sendInviteEmail\n                 * see member-invite-modal.component\n                 */\n\n                // a token exists now\n                // create message with token queryparam\n                const urlWithToken = (url) =>\n                  url && tokenId && tokenQueryParam ? `${url}?${tokenQueryParam}=${tokenId}` : url;\n                const { projectsHtml, projectsText } = this.mailerApi.buildProjectsListMessage(\n                  projectsTextArr.map((item) => ({ ...item, shareUrl: urlWithToken(appProjectUrl) }))\n                );\n\n                const params: SendMail = {\n                  tokenId,\n                  tokenQueryParam,\n                  toEmail: email,\n                  fromEmail: `${name} (${userEmail})`,\n                  // name, // this is the toName... confusing!\n                  subject: this.translate.instant(getEmailTranslatePath('INVITE_SUBJECT')),\n                  topic: MailTopic.InviteToCrew,\n                  // toEmail: 'jd@filmstacker.com',//must be confirmed in AWS SES\n                  message: messageNoNewlines + '<br><br>' + projectsHtml,\n                  messageText: Utils.stripHtml(messageNoNewlines, { leaveBrTags: true }) + '<br><br>' + projectsText,\n                  footer,\n                  heading: this.translate.instant(getEmailTranslatePath('INVITE_HEADING')),\n                  buttonLabel: this.translate.instant(getEmailTranslatePath('INVITE_CTA')),\n                  returnUrl,\n                };\n\n                DEBUG_LOGS &&\n                  console.log(`[INVITE] sendInvite sendingEmail:`, {\n                    toEmail: email,\n                    userEmail,\n                    projectsText,\n                    message,\n                    footer,\n                    returnUrl,\n                    params,\n                    createTokenMessage,\n                  });\n\n                return this.mailerApi\n                  .sendEmail(params)\n                  .pipe(take(1))\n                  .subscribe((result) => result);\n              })\n            );\n          } //end emails loop\n\n          DEBUG_LOGS && console.log(`sendInvites:`, { emails, message, userEmail, projectId });\n\n          return await Promise.all(promises)\n            .then((allResults) => {\n              DEBUG_LOGS && console.log(`[INVITE] sendEmail success res:`, allResults);\n              this.resetOnSuccess(\n                this.translate.instant(this.translatePath + 'INVITE_SUCCESS', { value: allResults.length })\n              );\n            })\n            .catch((allError) => {\n              console.warn(`[INVITE] sendEmail ERROR:`, allError);\n              this.message = this.translate.instant('ERRORS.GENERIC_OOPS');\n            });\n        });\n    } catch (error) {\n      console.warn(`[Invite] sendInvites FAILED:`, error);\n      this.toaster.present(this.translate.instant('MEMBERS.INVITE.ERROR'));\n    } finally {\n      this.loadingAttempt = false;\n    }\n  }\n\n  /**\n   * @dev - is this better? yes... optimize the delay in showing the popup on select click\n   * @todo implement appConfig allowPublishTo\n   * @see publish-stack.page.getProjects for implementation reference\n   */\n  private buildProjectOptions(projects: Project[]): { text: string; value: string }[] {\n    // let allProjects = [];\n    // /**\n    //  */\n    // if (this.configProjects.length > 0) {\n    //   // combine myProjects with configProjects\n    //   allProjects = Utils.addOrReplaceMultipleObjectsToNewArray(projects || [], this.configProjects, 'id').sort(\n    //     Utils.sortObjArrayAlphaBy\n    //   );\n    // } else {\n    //   allProjects = projects;\n    // }\n    this.projectOptions = projects\n      .sort((a, b) => Utils.sortObjArrayAlphaBy(a, b, 'title'))\n      .map((item) => ({\n        text: item.title,\n        value: item.id,\n      }));\n\n    return this.projectOptions;\n  }\n\n  private resetOnSuccess(msg) {\n    this.message = msg;\n\n    this.projectMemberInviteForm.reset({\n      // projectId: this.projectId\n      message: this.projectMemberInviteForm.get('message').value,\n      projectId: this.projectMemberInviteForm.get('projectId').value,\n      emails: ' ',\n    });\n    // this.inviteForm.updateValueAndValidity();\n    // this.inviteForm.controls.emails.setErrors(null);\n    this.inviteSuccess.emit(true);\n  }\n}\n","<h1 *ngIf=\"loadingTokens && !hasPersistentToken else doneLoadingTokensHeading\">\n  {{ 'COMMON.LOADING' | translate }}\n</h1>\n<ng-template #doneLoadingTokensHeading>\n  <h1 *ngIf=\"persistentTokenActive else notPublicHeading\">\n    {{ 'ONBOARDING.COMMON.INVITE.OPEN_PUBLIC' | translate }}\n  </h1>\n  <ng-template #notPublicHeading>\n    <h1>\n      {{ 'ONBOARDING.COMMON.INVITE.CLOSED_PUBLIC' | translate }}\n    </h1>\n  </ng-template>\n</ng-template>\n\n\n<div *ngIf=\"loadingTokens && !hasPersistentToken else doneLoadingTokens\" class=\"ion-text-center\">\n  <p class=\"ion-text-center\">\n    {{ 'COMMON.LOADING' | translate }}\n  </p>\n</div>\n\n<ng-template #doneLoadingTokens>\n\n  <ng-container *ngIf=\"hasPersistentToken && (!persistentTokenExpired || persistentToken?.expires); else notPublic\">\n    <!-- \n      In development: \n      \"Print this QR as a 6x9 graphic\"  \n      \"Email this QR image to your email\"\n    -->\n    <ng-container *ngIf=\"!persistentTokenExpired\">\n      <p class=\"no-top-margin\">\n        {{ translatePath + 'INVITE_QR_TEXT' | translate }}\n      </p>\n\n      <app-qr-code [qrCode]=\"qrCode\"></app-qr-code>\n\n      <ion-item class=\"share-item\" lines=\"none\">\n        <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"qrCode\"></ion-input>\n        <ion-button size=\"default\" (click)=\"share(shareToOptions.CLIPBOARD, $event)\" [title]=\"'SOCIAL.COPY_TO_CLIPBOARD' | translate\">\n          <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n      </ion-item>\n\n      <!-- trying button instead of toggle, below...\n      <ion-item *ngIf=\"persistentTokenId\" lines=\"none\" class=\"ion-padding-top\">\n        <ion-label class=\"ion-text-wrap\">\n          <ng-container *ngIf=\"persistentTokenActive else toggleNoPersistentText\">\n            {{ 'ONBOARDING.COMMON.INVITE.TOGGLE_CLOSE_PUBLIC' | translate }}\n          </ng-container>\n          <ng-template #toggleNoPersistentText>\n            {{ 'ONBOARDING.COMMON.INVITE.TOGGLE_OPEN_PUBLIC' | translate }}\n          </ng-template>\n        </ion-label>\n        <ion-toggle #togglePublicInvite slot=\"start\" [checked]=\"true\" [enableOnOffLabels]=\"true\"\n          (ionChange)=\"toggleDisabledChanged($event)\"></ion-toggle>\n      </ion-item> -->\n    </ng-container>\n\n    <ng-container *ngIf=\"persistentToken?.expires\">\n      <ng-container *ngIf=\"persistentTokenExpired else notExpired\">\n        <p class=\"no-top-margin\">\n          {{ translatePath + 'INVITE_NO_QR_TEXT' | translate }}\n        </p>\n        <p class=\"bold\" translate [translateParams]=\"{ date: persistentToken.expires | date:'medium' }\">\n          {{ 'ONBOARDING.COMMON.INVITE.EXPIRED_ON' }}\n        </p>\n        <ion-button class=\"ion-padding-end\" (click)=\"renewExpiration()\">\n          {{ 'ONBOARDING.COMMON.INVITE.EXPIRED_RENEW' | translate }}\n        </ion-button>\n        <ion-button fill=\"outline\" color=\"secondary\" (click)=\"confirmDeleteAndNew()\">\n          {{ 'ONBOARDING.COMMON.INVITE.DELETE_NEW' | translate }}\n        </ion-button>\n      </ng-container>\n\n      <ng-template #notExpired>\n        <ion-item lines=\"none\">\n          <ion-label translate [translateParams]=\"{ date: persistentToken.expires | date:'medium' }\"\n            class=\"ion-text-wrap ion-padding-vertical\" style=\"text-transform: none;\">\n            {{ 'ONBOARDING.COMMON.INVITE.EXPIRES' }}\n          </ion-label>\n          <ion-button fill=\"outline\" slot=\"end\" (click)=\"addDays()\">\n            {{ 'ONBOARDING.COMMON.INVITE.ADD_DAYS' | translate }}\n          </ion-button>\n        </ion-item>\n      </ng-template>\n\n    </ng-container>\n\n    <div *ngIf=\"persistentTokenId && !persistentTokenExpired\" class=\"ion-text-center ion-padding-top\">\n      <ion-button fill=\"outline\" color=\"secondary\" (click)=\"disablePublicInvite()\">\n        {{ 'ONBOARDING.COMMON.INVITE.DISABLE_QR' | translate }}\n      </ion-button>\n    </div>\n\n  </ng-container>\n\n  <ng-template #notPublic>\n    <p class=\"no-top-margin\">\n      {{ translatePath + 'INVITE_NO_QR_TEXT' | translate }}\n    </p>\n    <div *ngIf=\"!hasPersistentToken || persistentTokenExpired\" class=\"ion-text-center\">\n      <ion-button [disabled]=\"!projectId || generatingQr\" size=\"large\" (click)=\"generateQr()\">\n        <ion-spinner *ngIf=\"generatingQr\"></ion-spinner>\n        {{ 'ONBOARDING.COMMON.INVITE.PUBLIC' | translate }}\n      </ion-button>\n    </div>\n  </ng-template>\n\n</ng-template>","/** @format */\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { NgIf, DatePipe } from '@angular/common';\nimport { TranslateService, TranslatePipe, TranslateDirective } from '@ngx-translate/core';\nimport { AlertController, IonItem, IonInput, IonButton, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { combineLatest } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterPosition, ToasterService } from '@app/core/services/toaster.service';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { SelectInputOnClickDirective } from '@app/shared/directives/select-input-on-click.directive';\nimport { ShareableItem, SHARING_METHOD } from '@app/core/social-sharing/social-sharing.model';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { Project } from '@app/projects/shared/project.model';\nimport { createTokenQrCode, getInviteTypeFromProject, TRANSLATE_ROOT } from '@app/onboarding/shared/onboarding.model';\nimport { getEventTypeFromOnboarding, getExpires, isTokenExpired, Token } from '@app/tokens/shared/tokens.model';\nimport { TokensService } from '@app/tokens/shared/services/tokens.service';\nimport { QrCodeComponent } from '../qr-code/qr-code.component';\nimport { environment } from 'src/environments/environment';\n\n@Component({\n  selector: 'fs-qr-manage',\n  templateUrl: './qr-manage.component.html',\n  styleUrls: ['./qr-manage.component.scss'],\n  providers: [socialSharingServiceProvider],\n  standalone: true,\n  imports: [\n    NgIf,\n    TranslatePipe,\n    TranslateDirective,\n    SelectInputOnClickDirective,\n    DatePipe,\n    QrCodeComponent,\n    IonItem,\n    IonInput,\n    IonButton,\n    IonIcon,\n    IonSpinner,\n  ],\n})\nexport class QrManageComponent implements OnInit {\n  @Input() isStudio: boolean = false;\n  @Input() translatePath = TRANSLATE_ROOT;\n  @Input()\n  set project(value) {\n    this._project = value;\n    if (!this.isStudio) {\n      if (this.project && this.project.id) {\n        this.tokensService\n          .listTokens({ projectId: this.project.id })\n          .then((tokens) => {\n            /**\n             * @todo need to create a persistent token if not exists...\n             * need to throttle?\n             *\n             * set qrCode to the persistentToken\n             *\n             * @todo handle multiple persistent tokens with filter and loop\n             * @note we want all, not just active - handle logic in template\n             */\n            !environment.production && console.log(`Tokens [${tokens.length}]:`, tokens);\n            // const activeTokens = tokens.filter((t) => t && t.id && (t.isActive || !t.hasOwnProperty('isActive')));\n            // !environment.production && console.log(`Tokens active [${activeTokens.length}]:`, activeTokens);\n            if (Array.isArray(tokens) && tokens.length > 0) {\n              this.persistentToken = tokens.find((t) => t && t.persistToken);\n              // build the qr code if there's a persistentToken\n              this.qrCode = this.hasPersistentToken ? createTokenQrCode(this.project, this.persistentTokenId) : '';\n              this.loadingTokens = false;\n            } else {\n              this.persistentToken = null;\n            }\n          })\n          .catch((error) => {\n            console.warn(error);\n          });\n      }\n    }\n  }\n  get project(): Project {\n    return this._project;\n  }\n  get projectId(): string {\n    return this.project && this.project.id;\n  }\n  get routeId() {\n    return getInviteTypeFromProject(this.project);\n  }\n\n  // @ViewChild('togglePublicInvite', { static: false }) togglePublicInvite: IonToggle;\n\n  loadingTokens = true; // trigger the spinner\n  qrCode = '';\n  generatingQr = false;\n  persistentToken: Token;\n  get hasPersistentToken(): boolean {\n    return this.persistentToken?.id?.length > 0;\n  }\n  get persistentTokenId(): string {\n    return this.persistentToken?.id;\n  }\n  get persistentTokenActive(): boolean {\n    return this.persistentToken?.isActive;\n  }\n  get persistentTokenExpired() {\n    return isTokenExpired(this.persistentToken);\n  }\n\n  shareToOptions = SHARING_METHOD;\n\n  private _project: Project;\n\n  constructor(\n    private toaster: ToasterService,\n    private alertController: AlertController,\n    private tokensService: TokensService,\n    private socialSharingService: SocialSharingService,\n    private userService: UserService,\n    private translate: TranslateService\n  ) {}\n\n  ngOnInit() {\n    setTimeout(() => {\n      this.loadingTokens = false;\n    }, 5600);\n  }\n\n  addDays() {\n    this.enableTokenUpdateExpired(30, this.persistentToken?.expires ?? Date.now());\n  }\n\n  renewExpiration() {\n    this.enableTokenUpdateExpired();\n  }\n\n  // trying button...\n  // toggleDisabledChanged(event: Event) {\n  //   const customEvent = event as ToggleCustomEvent;\n  //   const checked = !!customEvent.detail.checked;\n  // }\n\n  /**\n   * When disabling, set the expires to now so we track when it happened, and then it will expire\n   * If you don't want an expiring QR, delete & create new...\n   */\n  async disablePublicInvite() {\n    try {\n      const res = await this.tokensService.disableToken({\n        tokenId: this.persistentTokenId,\n        expires: new Date().toISOString(),\n      });\n      if (res?.success && res?.data) {\n        this.toaster.present(this.translate.instant('ONBOARDING.COMMON.INVITE.UPDATED'), ToasterPosition.Bottom);\n        this.updatePersistentToken(res.data);\n      } else {\n        console.warn('Response but not success?', res);\n        this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n      }\n    } catch (error) {\n      console.warn('disablePublicInvite Caught error', error);\n      this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n    }\n  }\n\n  async confirmDeleteAndNew() {\n    const alert = await this.alertController.create({\n      header: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.HEADER'),\n      subHeader: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.SUBHEAD'),\n      message: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.MESSAGE'),\n      buttons: [\n        {\n          text: this.translate.instant('COMMON.CANCEL'),\n          role: 'cancel',\n          handler: () => {\n            //\n          },\n        },\n        {\n          text: this.translate.instant('ONBOARDING.COMMON.INVITE.CONFIRM_DELETE.ACTION'),\n          role: 'destructive',\n          handler: () => {\n            this.deleteAndGenerateNew();\n          },\n        },\n      ],\n    });\n\n    await alert.present();\n  }\n\n  async generateQr() {\n    if (!this.projectId) {\n      return console.warn('No projectId?');\n    }\n    if (this.persistentTokenId) {\n      this.enableTokenUpdateExpired();\n    } else {\n      // console.log(`Creating the persistentToken...`);\n      this.generatingQr = true;\n      combineLatest([this.userService.userId$, this.userService.email$])\n        .pipe(take(1))\n        .subscribe(([userId, userEmail]) => {\n          this.tokensService\n            .createPersistentToken({\n              userId,\n              userEmail,\n              projectId: this.projectId,\n              eventType: getEventTypeFromOnboarding(this.routeId),\n            })\n            .then((res) => {\n              this.generatingQr = false;\n              this.updatePersistentToken(res);\n              this.qrCode = this.hasPersistentToken ? createTokenQrCode(this.project, this.persistentTokenId) : '';\n            })\n            .catch((err) => {\n              console.error(err);\n              this.generatingQr = false;\n            });\n        });\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  share(shareTo: SHARING_METHOD, event?: MouseEvent) {\n    if (!this.project?.id) {\n      return;\n    }\n    const shareItem: ShareableItem = {\n      id: this.project.id,\n      title: this.project.title,\n      // description: this.project.description,\n      shareUrl: this.qrCode,\n      type: ITEM_TYPE.Projects,\n      // tags: ,\n    };\n\n    this.socialSharingService.shareTo(shareItem, shareTo).catch((error) => {\n      console.error(error);\n    });\n  }\n\n  private updatePersistentToken(updates) {\n    this.persistentToken = {\n      ...(this.persistentToken || {}),\n      ...(updates || {}),\n    };\n  }\n\n  private async enableTokenUpdateExpired(days = 30, from = null) {\n    try {\n      const res = await this.tokensService.enableToken({\n        tokenId: this.persistentTokenId,\n        expires: getExpires(days, from),\n      });\n      if (res?.success && res?.data) {\n        this.toaster.present(this.translate.instant('ONBOARDING.COMMON.INVITE.UPDATED'), ToasterPosition.Bottom);\n        this.updatePersistentToken(res.data);\n      } else {\n        console.warn('Response but not success?', res);\n        this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n      }\n    } catch (error) {\n      console.warn('AddDays Caught error', error);\n      this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n    }\n  }\n\n  private async deleteAndGenerateNew() {\n    try {\n      await this.tokensService.deleteToken(this.persistentTokenId);\n      this.persistentToken = null;\n      this.generateQr();\n    } catch (error) {\n      console.warn('deleteAndGenerateNew Caught:', error);\n      this.toaster.present(this.translate.instant('ERRORS.GENERIC'), ToasterPosition.Bottom);\n    }\n  }\n}\n","<div class=\"add-member\">\n  <h2>\n    {{ translatePath + 'INVITE_TITLE' | translate }}\n  </h2>\n  <p>\n    {{ translatePath + 'INVITE_BODY_1' | translate }}\n  </p>\n  <p *ngIf=\"showBillingText\">\n    {{ translatePath + 'INVITE_BODY_2' | translate }}\n  </p>\n\n  <p class=\"instructions\">\n    {{ 'ONBOARDING.COMMON.INVITE.INTRO_RULES' | translate }} \n    <a (click)=\"openCommunityRules()\">{{ 'COMMON.COMMUNITY_RULES' | translate }}</a>. \n    {{ 'ONBOARDING.COMMON.INVITE.RULES' | translate }}\n  </p>\n\n  <div class=\"add-member__content-wrap\">\n\n    <section class=\"emails-wrap\">\n      <!-- <h1>\n        {{ translatePath + 'INVITE_SUBTITLE' | translate }}\n      </h1> -->\n      <!-- <p class=\"no-top-margin\">\n        {{ 'ONBOARDING.COMMON.INTRO.EXPLAINED' | translate }}\n      </p> -->\n      <!-- [project]=\"project\" -->\n      <app-invite-form *ngIf=\"project else projectLoading\"\n        [projectId]=\"project?.id\"\n        [routeId]=\"routeId\"\n        [translatePath]=\"translatePath\"\n        (inviteSuccess)=\"openSuccessDialog()\"\n      ></app-invite-form>\n\n      <ng-template #projectLoading>\n        <p class=\"ion-text-center\">\n          {{ 'COMMON.LOADING_PROJECT' | translate }}\n        </p>\n      </ng-template>\n    </section>\n\n    <section class=\"existing-wrap\">\n      <h1>\n        {{ 'ONBOARDING.COMMON.INVITE.EXISTING' | translate }}\n      </h1>\n      <div class=\"ion-padding-bottom\">\n        <!-- <p class=\"no-top-margin\">\n          {{ 'ONBOARDING.COMMON.INVITE.EXISTING_BODY' | translate }}\n        </p> -->\n        <!-- <h2 class=\"title\">Invite Film Crew</h2> -->\n        <section class=\"\">\n          <div *ngIf=\"projectsInactiveUsers$ | async as inactiveUsers\">\n            <div *ngIf=\"inactiveUsers?.length > 0\" class=\"ion-text-center\">\n              <ion-button fill=\"clear\" (click)=\"viewInactiveUsers(inactiveUsers)\">\n                <span *ngIf=\"!viewingInactiveUsers\">{{ 'COMMON.SEE' | translate }}</span>\n                <span *ngIf=\"viewingInactiveUsers\">{{ 'COMMON.HIDE' | translate }}</span>\n                &nbsp;{{ 'MEMBERS.INACTIVE_PROJECT_MEMBERS' | translate }} ({{ inactiveUsers.length }})\n              </ion-button>\n            </div>\n          </div>\n      \n          <div class=\"search-users \">\n            <app-searchbar\n              color=\"light\"\n              [placeholderText]=\"'ONBOARDING.COMMON.INVITE.SEARCH_USERS' | translate\"\n              [debounceTime]=\"1000\"\n              (searchEnter)=\"searchChanged($event)\"\n              (searchChange)=\"searchChanged($event)\"\n            ></app-searchbar>\n          </div>\n      \n          <div *ngIf=\"(searchResults$ | async) as searchResults\">\n            <div *ngIf=\"searchResults.length > 0\" class=\"instructions next-step ion-text-center\">\n              {{ 'ONBOARDING.COMMON.INVITE.SELECT_USERS' | translate }}\n            </div>\n      \n            <div class=\"user-search-results \" [class.user-is-selected]=\"selectedUserIds?.length > 0\">\n              <div *ngFor=\"let user of searchResults\" class=\"user-item clickable\"\n                [class.selected]=\"isUserSelected(user?.userId)\"\n                [title]=\"isUserSelected(user?.userId) ? 'Deselect User' : 'Select User'\"\n                [class.disabled]=\"user?.roleInCurrentProject\" (click)=\"onClickUser(user)\">\n                <ion-avatar>\n                  <img [src]=\"user?.avatar\" [fallback]=\"avatarFallback\" />\n                </ion-avatar>\n                <div class=\"name ion-text-center\">\n                  {{ user?.name || user?.userId }}\n                </div>\n                <div *ngIf=\"user?.roleInCurrentProject\" class=\"current-role ion-text-center\">\n                  {{ user?.roleInCurrentProject }}\n                </div>\n      \n                <div class=\"user-item__info-btn\">\n                  <ion-button color=\"medium\" fill=\"clear\" (click)=\"viewProjectMember($event, user)\"\n                    [title]=\"'USER.SEE_DETAILS' | translate\">\n                    <ion-icon slot=\"icon-only\" name=\"information-circle-outline\"></ion-icon>\n                  </ion-button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </section>\n\n        <div class=\"project-list ion-padding-horizontal ion-margin-top\">\n          <h3 class=\"ion-padding-top\">\n            <b>\n              {{ 'ONBOARDING.COMMON.INVITE.CHOOSE_PROJECT_ROLE' | translate }}\n            </b>\n          </h3>\n          <p>\n            <b>{{ 'COMMON.CREW' | translate }}</b>:\n            {{ 'MEMBERS.EXPLAIN_CREW' | translate }}\n            <br>\n            <b>{{ 'COMMON.PRODUCERS' | translate }}</b>:\n            {{ 'MEMBERS.EXPLAIN_PRODUCERS' | translate }}\n          </p>\n\n          <!--CREW MEMBER PROJECTS-->\n          <!-- [projects]=\"isStudio ? (myProjects$ | async) : [ project ]\" -->\n          <app-project-member-projects *ngIf=\"isStudio || project\" \n              [projects]=\"projects$ | async\"\n              [addMember]=\"true\"\n              (closeModal)=\"dismiss.emit()\"\n              (roleChanged)=\"onProjectRoleChanged($event)\"\n            ></app-project-member-projects>\n      \n        </div>\n      \n        <section class=\"skinny-limit-width\">\n          <div class=\"ion-text-center submit-btn-wrap ion-padding-top\">\n      \n            <div *ngIf=\"message\" class=\"message ion-padding-bottom\">\n              {{ message }}\n            </div>\n      \n            <ion-button color=\"primary\" fill=\"solid\" size=\"large\"\n              [disabled]=\"selectedUserIds?.length < 1 || !addProjectRole || loadingAddCrew\" (click)=\"submitAddUser()\">\n              {{ 'ONBOARDING.COMMON.ADD_USER' | translate }}<span *ngIf=\"selectedUserIds?.length > 1\">s&nbsp;</span> \n              {{ 'ONBOARDING.COMMON.TO_PROJECT' | translate }}\n              <ion-spinner *ngIf=\"loadingAddCrew\" name=\"crescent\"></ion-spinner>\n            </ion-button>\n      \n            <!-- <ion-button color=\"primary\" fill=\"clear\" size=\"medium\" (click)=\"dismiss()\">\n              {{ 'COMMON.DONE' | translate }}\n            </ion-button> -->\n          </div>\n        </section>\n      </div>\n    </section>\n\n    <section *ngIf=\"!isStudio\" class=\"qr-wrap ion-padding-vertical\">\n\n      <fs-qr-manage\n        [project]=\"project\"\n        [translatePath]=\"translatePath\"\n        [isStudio]=\"isStudio\"\n      ></fs-qr-manage>\n\n    </section>\n  </div>\n</div>\n","/**\n * @todo translations in submit method..\n * @format\n */\n// import _uniqBy from 'lodash/uniqBy';\nimport { Component, OnInit, OnDestroy, Input, EventEmitter, Output } from '@angular/core';\nimport { UntypedFormBuilder } from '@angular/forms';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { ModalController, NavController, IonButton, IonAvatar, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { Subject, Observable, EMPTY, of } from 'rxjs';\nimport { takeUntil, switchMap, distinctUntilChanged, tap, filter, map } from 'rxjs/operators';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { User, DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { ModalInviteSuccessComponent } from '@app/shared/components/modal-invite-success/modal-invite-success.component';\nimport { SearchbarComponent } from '@app/shared/components/top-navbar/searchbar/searchbar.component';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { Utils } from '@app/shared/utils';\nimport { Project, ProjectMember } from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\nimport { ProjectMemberModalComponent } from '@app/project-members/project-member-modal/project-member-modal.component';\nimport { InviteFormComponent } from '@app/project-members/shared/components/invite-form/invite-form.component';\nimport { ProjectMemberProjectsComponent } from '@app/project-members/project-member-projects/project-member-projects.component';\nimport { getInviteTypeFromProject, getTranslatePath } from '@app/onboarding/shared/onboarding.model';\nimport { QrManageComponent } from '@app/tokens/shared/components/qr-manage/qr-manage.component';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMemberQueryResults } from '@store/selectors/members.selectors';\nimport { addMember as addMemberAction, updateMember as updateMemberAction } from '@store/actions/projects.actions';\nimport { CommunityRulesPage } from '@app/pages/community-rules/community-rules.page';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[AddMember]';\n\n/**\n * TODO:\n *  roleInCurrentProject - verify on Studio, and project role\n * submitAddUser - undo temp Promise.resolve\n */\n@Component({\n  selector: 'app-add-member',\n  templateUrl: './add-member.component.html',\n  styleUrls: ['./add-member.component.scss'],\n  standalone: true,\n  imports: [\n    NgIf,\n    NgFor,\n    AsyncPipe,\n    TranslatePipe,\n    ImageFallbackDirective,\n    QrManageComponent,\n    InviteFormComponent,\n    SearchbarComponent,\n    ProjectMemberProjectsComponent,\n    IonButton,\n    IonAvatar,\n    IonIcon,\n    IonSpinner,\n  ],\n})\nexport class AddMemberComponent implements OnInit, OnDestroy {\n  @Input() isStudio: boolean = false;\n  @Input()\n  set project(value) {\n    this._project = value;\n    if (!this.isStudio) {\n      this.projects$ = of([this.project]);\n    }\n  }\n  get project(): Project {\n    return this._project;\n  }\n  get projectId(): string {\n    return this.project && this.project.id;\n  }\n\n  @Output() addSuccess = new EventEmitter();\n  @Output() dismiss = new EventEmitter();\n\n  /** small block of text saying crew must purchase upload minutes */\n  showBillingText = false;\n\n  searchResults$: Observable<(User & { roleInCurrentProject?: PROJECT_MEMBER_ROLE })[]>;\n  addProjectRole: PROJECT_MEMBER_ROLE;\n\n  loadingAddCrew = false; // trigger the spinner\n  avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n\n  selectedUserIds: { userId: string; username: string }[] = [];\n\n  submitEmailAttempt = false;\n  message = ''; // show the results\n\n  projects$: Observable<Project[]>;\n  projectsInactiveUsers$: Observable<ProjectMember[]>;\n  viewingInactiveUsers = false;\n\n  get routeId() {\n    return getInviteTypeFromProject(this.project);\n  }\n  get translatePath() {\n    return getTranslatePath(this.routeId);\n  }\n\n  private _project: Project;\n  private inactiveUsers: ProjectMember[] = [];\n  private searchChanged$: Subject<string> = new Subject();\n  private onDestroy$ = new Subject<void>();\n\n  constructor(\n    private modalController: ModalController,\n    private formBuilder: UntypedFormBuilder,\n    private toaster: ToasterService,\n    private projectMemberService: ProjectMemberService,\n    private projectService: ProjectService,\n    private sentryService: SentryService,\n    private store: Store<State>,\n    private navCtrl: NavController,\n    private translate: TranslateService\n  ) {}\n\n  ngOnInit() {\n    // isStudio ? (myProjects$ | async) : [ project ]\n    this.projects$ = this.isStudio ? this.projectService.getMyProjects() : of([this.project]);\n    this.projectsInactiveUsers$ = this.projects$.pipe(\n      map((projects) =>\n        projects.reduce((acc, project) => {\n          if (project && Array.isArray(project.members)) {\n            acc.push(\n              ...project.members.filter((member) => !member.isActive).map((m) => ({ ...m, projectId: project.id }))\n            );\n          }\n          return acc;\n        }, [])\n      ),\n      tap((res) => {\n        DEBUG_LOGS && console.log(`${PAGE} projectsInactiveUsers$:`, res);\n        this.inactiveUsers = res;\n      })\n    );\n\n    this.searchResults$ = this.store.select(selectMemberQueryResults).pipe(\n      distinctUntilChanged(),\n      map((users) =>\n        users.map((u) => {\n          if (!u) u = new User(u);\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          (u as any).selected = false;\n          u.avatar = this.projectMemberService.getUserAvatar(u.userId);\n          // DEBUG_LOGS && console.log(`searchResultsMap`, {\n          //   userId: u.userId,\n          //   projectId: this.project && this.project.id,\n          //   memberProjects: u.memberProjects,\n          // });\n          const projectId = this.projectId;\n          let roleInCurrentProject = null;\n          if (projectId && Array.isArray(u.memberProjects)) {\n            const proj = u.memberProjects.filter((p) => p.isActive).find((p) => p.projectId === projectId);\n            roleInCurrentProject = proj && proj.role ? proj.role : null;\n          }\n          // now, check for projects owned\n          if (!roleInCurrentProject && projectId && Array.isArray(u.projects)) {\n            const projOwned = u.projects.find((p) => p.id === projectId);\n            roleInCurrentProject = projOwned && projOwned.id ? PROJECT_MEMBER_ROLE.OWNER : null;\n          }\n          return {\n            ...u,\n            roleInCurrentProject,\n          };\n        })\n      )\n    );\n\n    this.searchChanged$\n      .pipe(\n        takeUntil(this.onDestroy$),\n        distinctUntilChanged(),\n        filter((search) => typeof search === 'string' && search.length > 1),\n        switchMap((search) => {\n          this.projectMemberService.queryMembers(search);\n          return EMPTY;\n        })\n      )\n      .subscribe(() => {\n        // console.log('Not empty, just subscribed..')\n      });\n  }\n\n  ngOnDestroy() {\n    this.projectMemberService.resetQueryMembers();\n    this.onDestroy$.next();\n    this.onDestroy$.complete();\n  }\n\n  searchChanged(event) {\n    if (event) {\n      DEBUG_LOGS && console.log(`${PAGE} searchChanged:`, event);\n      this.searchChanged$.next(event);\n    } else {\n      DEBUG_LOGS && console.log(`${PAGE} searchChanged reset:`, event);\n      this.selectedUserIds = [];\n      this.searchChanged$.next('');\n      this.projectMemberService.resetQueryMembers();\n    }\n    this.message = '';\n  }\n\n  onClickUser(user) {\n    if (!user || !user.userId) {\n      console.warn(`${PAGE} onClickUser missing user?`, user);\n    }\n    if (this.isUserSelected(user.userId)) {\n      // deselect\n      this.selectedUserIds.splice(\n        this.selectedUserIds.findIndex((id) => id.userId === user.userId),\n        1\n      );\n    } else {\n      // select\n      this.selectedUserIds.push({ userId: user.userId, username: user.username || user.userId });\n      DEBUG_LOGS && console.log(`${PAGE} onClickUser select user:`, user);\n    }\n  }\n\n  isUserSelected(userId): boolean {\n    return this.selectedUserIds.findIndex((id) => id.userId === userId) > -1;\n  }\n\n  viewInactiveUsers(inactiveUsers) {\n    DEBUG_LOGS && console.log(`${PAGE} viewInactiveUsers`, { inactiveUsers });\n    this.selectedUserIds = [];\n    this.searchChanged$.next('');\n    this.projectMemberService.resetQueryMembers();\n    if (!this.viewingInactiveUsers) {\n      this.projectMemberService.addToQueryMemberResults(\n        inactiveUsers.map((u) => ({\n          userId: u.userId,\n          username: u.username,\n          avatar: u.avatar,\n          memberProjects: [u],\n        }))\n      );\n    }\n    this.viewingInactiveUsers = !this.viewingInactiveUsers;\n  }\n\n  async viewProjectMember(event, user) {\n    event.stopPropagation();\n    DEBUG_LOGS && console.log(`${PAGE} viewProjectMember`, { user });\n    // const appConfig = await this.configService.appConfig;\n    // if (appConfig.isWidgetActive) return;\n    const modal = await this.modalController.create({\n      component: ProjectMemberModalComponent,\n      componentProps: {\n        userId: user.userId,\n        viewOnly: true,\n        // projects: this.projects || [],\n      },\n      cssClass: 'modal-lg',\n    });\n\n    return await modal.present();\n  }\n\n  /**\n   * project-member-projects emitted this change\n   * check if it's an update to existing or new\n   * (both check if toAdd already has this user,\n   * and if this user is !isActive which would cause an API update rather than create)\n   */\n  onProjectRoleChanged({ role, project }) {\n    if (!role || !project || !project.id) {\n      console.warn(`${PAGE} onProjectRoleChanged missing project or role?`, { role, project });\n      return;\n    }\n    this.addProjectRole = role;\n    // this.toAdd = _uniqBy([{ role, projectId: project.id }, ...this.toAdd], 'projectId');\n    DEBUG_LOGS && console.log(`${PAGE} project role changed`, { role, projectId: project.id });\n  }\n\n  /**\n   * Combine toAdd with selectedUserIds\n   * determine isUpdate (!isActive) or create\n   *\n   * @todo refactor this nonsense\n   */\n  submitAddUser() {\n    this.loadingAddCrew = true;\n    this.message = '';\n    try {\n      DEBUG_LOGS &&\n        console.log(`${PAGE} submitAddUser...`, {\n          addProjectRole: this.addProjectRole,\n          selectedUserIds: this.selectedUserIds,\n        });\n\n      if (!this.addProjectRole || this.addProjectRole.length < 1 || this.selectedUserIds.length < 1) {\n        this.loadingAddCrew = true;\n        this.message = `We're missing required info to perform operation. Please reload and try again.`;\n      }\n\n      /**\n       * loop the toAdd and look at each for each selectedUserIds\n       * create ProjectMembers as updates\n       */\n      const updates: ProjectMember[] = [];\n      // const inactiveUsers = await lastValueFrom(this.projectsInactiveUsers$); //rxjs7\n      const projectId = this.projectId;\n      this.selectedUserIds.forEach(({ userId, username }) => {\n        if (this.addProjectRole && projectId) {\n          const isCurrentlyInactive = this.inactiveUsers.find(\n            (u) => userId && u?.userId === userId && u.projectId === projectId\n          );\n\n          const member: ProjectMember = {\n            isActive: true,\n            role: this.addProjectRole,\n            userId,\n            username,\n            projectId,\n          };\n          if (isCurrentlyInactive) {\n            // update user instead of creating\n            this.store.dispatch(updateMemberAction({ member }));\n          } else {\n            this.store.dispatch(addMemberAction({ member }));\n          }\n          updates.push(member);\n        } else {\n          console.warn(`${PAGE} submitAddUser '${userId}' missing required props: role or projectId`, {\n            addProjectRole: this.addProjectRole,\n            projectId,\n          });\n        }\n      }); // end forEach selectedUserIds\n\n      if (updates.length > 0) {\n        const membersAdded = Utils.makeCommaSeparatedString(updates.map((u) => u.username));\n        const membersPlural = updates.length > 1 ? 's' : '';\n        this.message += `Success. Added ${membersAdded} as member${membersPlural} to the project!`;\n        this.addProjectRole = PROJECT_MEMBER_ROLE.CREW;\n        this.selectedUserIds = [];\n        this.addSuccess.emit({});\n      } else {\n        this.message += `No updates were performed.`;\n      }\n\n      this.loadingAddCrew = false;\n    } catch (error) {\n      console.warn(`${PAGE} submitAddUser caught:`, error);\n      this.sentryService.captureError(error);\n      this.message = `Oops! We caught an error. Please try again.`; // ${error && error.message ? error.message : ''}`;\n      this.toaster.present(`Oops! something didn't go as planned... Please try again.`);\n      this.loadingAddCrew = false;\n    }\n  }\n\n  /**\n   * https://xd.adobe.com/view/61615fe1-b7c1-47a9-493b-3c7268fe8988-1750/screen/3073281d-aabd-4185-8cf2-8812fdea0563\n   */\n  async openSuccessDialog() {\n    this.dismiss.emit();\n    this.addSuccess.emit({});\n    const modal = await this.modalController.create({\n      component: ModalInviteSuccessComponent,\n      componentProps: {\n        heading: this.translate.instant('MEMBERS.INVITE.HEADING'),\n        btnText: this.translate.instant('MEMBERS.INVITE.CTA'),\n        project: this.project,\n      },\n    });\n\n    await modal.present();\n    const { data } = await modal.onDidDismiss();\n    if (data && data.navToProject) {\n      this.navCtrl.navigateForward(`/${PROJECT_DETAIL_ROUTE}/${this.project.id}`);\n    } else if (data && data.openAddMemberDialog) {\n      // 2025-01-27 we had to remove this because it was causing a loop (standalone components)\n      // re-open this component modal again\n      // this.openAddMemberDialog();\n      this.dismiss.emit({ openAddMemberDialog: true });\n    }\n  }\n\n  /**\n   * This is essentially opening up yourself, is it weird?\n   * 2025-01-27 we had to remove this because it was causing a loop (standalone components)\n   */\n  // async openAddMemberDialog() {\n  //   const modal = await this.modalController.create({\n  //     component: AddMemberModalComponent,\n  //     componentProps: {\n  //       project: this.project,\n  //       isStudio: this.isStudio,\n  //     },\n  //     cssClass: 'crew-member-modal fullheight-modal',\n  //   });\n  //   return await modal.present();\n  // }\n\n  async openCommunityRules() {\n    // /community-rules\";dismiss.emit()\n    const modal = await this.modalController.create({\n      component: CommunityRulesPage,\n      componentProps: {\n        isModal: true,\n        // returnUrl\n      },\n    });\n    return await modal.present();\n  }\n}\n","<fs-form-item [label]=\"label\" [errorMessage]=\"errorMessage\" class=\"fs-form-select\">\n  <ion-select\n    mode=\"md\"\n    [interfaceOptions]=\"interfaceOptions\"\n    [placeholder]=\"placeholder\"\n    [label]=\"label\"\n    [value]=\"control.value\"\n    [disabled]=\"disabled\"\n    [interface]=\"interface\"\n    (ionBlur)=\"isReadyForValidation = true\"\n    (ionChange)=\"isReadyForValidation = true; updateProp($any($event).detail.value)\"\n  >\n    <!-- \n      weirdly this is not working. haven't investigated why:\n      [style.border-color]=\"errorMessage ? 'var(--ion-color-danger)' : 'none'\"\n    -->\n    <ion-select-option *ngFor=\"let item of items\" [value]=\"item.value\">{{\n      item.text\n    }}</ion-select-option>\n  </ion-select>\n  <span class=\"fs-form-select__hint\" *ngIf=\"hint || errorMessage\" [innerHTML]=\"hint + ' ' + (errorMessage ? errorMessage : '')\"></span>\n</fs-form-item>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgFor, NgIf } from '@angular/common';\nimport { IonSelect, IonSelectOption } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BaseFormComponent } from '../base-form.component';\nimport { FormItemComponent } from '../form-item/form-item.component';\n\n@Component({\n  selector: 'fs-form-select',\n  templateUrl: './form-select.component.html',\n  styleUrls: ['./form-select.component.scss'],\n  standalone: true,\n  imports: [FormItemComponent, NgFor, NgIf, IonSelect, IonSelectOption],\n})\nexport class FormSelectComponent extends BaseFormComponent {\n  @Input() items: { text: string; value: string | number | boolean }[];\n  @Input() interface = 'popover';\n  @Input() placeholder: string;\n  @Input() hint: string = '';\n  @Input() disabled: boolean = false;\n  @Input() interfaceOptions = {\n    side: 'top',\n    cssClass: 'form-select',\n  };\n\n  constructor(translate: TranslateService) {\n    super(translate);\n  }\n}\n","/** @format */\n\nimport { Directive, ElementRef, HostListener } from '@angular/core';\n\n/**\n * Based on https://forum.ionicframework.com/t/ion-input-select-all-text-on-focus/79406/2\n */\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: 'ion-searchbar[selectAllOnClick], ion-input[selectAllOnClick]',\n  standalone: true,\n})\nexport class SelectInputOnClickDirective {\n  constructor(private el: ElementRef) {}\n\n  @HostListener('click')\n  selectAll() {\n    try {\n      // access to the native input element\n      const nativeEl: HTMLInputElement = this.el.nativeElement.querySelector('input');\n\n      if (nativeEl) {\n        if (nativeEl.setSelectionRange) {\n          // select the text from start to end\n          return nativeEl.setSelectionRange(0, nativeEl.value.length);\n        }\n        nativeEl.select();\n      }\n    } catch (error) {\n      console.log(`Caught error in SelectInputOnClickDirective.selectAll`, error);\n    }\n  }\n}\n"],"x_google_ignoreList":[]}