@posiwise/resource-contact-us 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/esm2022/index.mjs +10 -1
  2. package/esm2022/lib/custom-uploader/custom-uploader.component.mjs +107 -0
  3. package/esm2022/lib/edit-footer-links-modal/edit-footer-links-modal.component.mjs +198 -0
  4. package/esm2022/lib/edit-questions-modal/edit-questions-modal.component.mjs +156 -0
  5. package/esm2022/lib/field-error-display/field-error-display.component.mjs +16 -0
  6. package/esm2022/lib/field-error-display/field-error-display.module.mjs +23 -0
  7. package/esm2022/lib/image-cropper/image-cropper.component.mjs +92 -0
  8. package/esm2022/lib/image-cropper/profile-image-cropper.module.mjs +45 -0
  9. package/esm2022/lib/resource-header/edit-navbar-modal.component.mjs +195 -0
  10. package/esm2022/lib/resource-header/resource-header.component.mjs +226 -0
  11. package/esm2022/lib/resource-header/resource-header.module.mjs +63 -0
  12. package/esm2022/resource-contact-us/resource-contact-us.component.mjs +67 -75
  13. package/esm2022/resource-contact-us/resource-contact-us.module.mjs +7 -5
  14. package/fesm2022/posiwise-resource-contact-us-edit-navbar-modal.component-C59Q3971.mjs +197 -0
  15. package/fesm2022/posiwise-resource-contact-us-edit-navbar-modal.component-C59Q3971.mjs.map +1 -0
  16. package/fesm2022/posiwise-resource-contact-us.mjs +949 -87
  17. package/fesm2022/posiwise-resource-contact-us.mjs.map +1 -1
  18. package/index.d.ts +9 -0
  19. package/lib/custom-uploader/custom-uploader.component.d.ts +35 -0
  20. package/lib/edit-footer-links-modal/edit-footer-links-modal.component.d.ts +22 -0
  21. package/lib/edit-questions-modal/edit-questions-modal.component.d.ts +21 -0
  22. package/lib/field-error-display/field-error-display.component.d.ts +7 -0
  23. package/lib/field-error-display/field-error-display.module.d.ts +13 -0
  24. package/lib/image-cropper/image-cropper.component.d.ts +30 -0
  25. package/lib/image-cropper/profile-image-cropper.module.d.ts +19 -0
  26. package/lib/resource-header/edit-navbar-modal.component.d.ts +22 -0
  27. package/lib/resource-header/resource-header.component.d.ts +46 -0
  28. package/lib/resource-header/resource-header.module.d.ts +21 -0
  29. package/package.json +1 -1
  30. package/resource-contact-us/resource-contact-us.component.d.ts +4 -17
  31. package/resource-contact-us/resource-contact-us.module.d.ts +12 -10
@@ -1,9 +1,7 @@
1
- import * as i9 from '@angular/cdk/drag-drop';
2
- import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
3
- import * as i7 from '@angular/common';
1
+ import * as i1$1 from '@angular/common';
4
2
  import { DOCUMENT, CommonModule } from '@angular/common';
5
3
  import * as i0 from '@angular/core';
6
- import { Component, ChangeDetectionStrategy, Inject, ViewChild, Input, NgModule } from '@angular/core';
4
+ import { Component, ChangeDetectionStrategy, Inject, ViewChild, Input, NgModule, EventEmitter, Output, HostListener } from '@angular/core';
7
5
  import * as i1 from '@angular/forms';
8
6
  import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
9
7
  import * as i4 from '@angular/platform-browser';
@@ -13,8 +11,8 @@ import { AppBaseComponent } from '@posiwise/app-base-component';
13
11
  import * as i2 from '@posiwise/common-services';
14
12
  import { ValidationService } from '@posiwise/common-services';
15
13
  import { HelperService } from '@posiwise/helper-service';
16
- import * as i13 from '@posiwise/utils';
17
- import { FieldErrorDisplayModule, ProfileImageCropperModule } from '@posiwise/utils';
14
+ import * as i12 from '@posiwise/utils';
15
+ import { FieldErrorDisplayModule as FieldErrorDisplayModule$1, ProfileImageCropperModule as ProfileImageCropperModule$1 } from '@posiwise/utils';
18
16
  import * as i3 from '@posiwise/smart-crm-shared';
19
17
  import { StatusCodes } from 'http-status-codes';
20
18
  import Swal from 'sweetalert2';
@@ -22,20 +20,47 @@ import * as i6 from '@ng-bootstrap/ng-bootstrap';
22
20
  import { NgbModalModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
23
21
  import * as i8 from '@angular/router';
24
22
  import { RouterModule } from '@angular/router';
25
- import * as i10 from '@posiwise/directives';
23
+ import * as i9 from '@posiwise/directives';
26
24
  import { DirectivesModule } from '@posiwise/directives';
27
- import * as i11 from 'ngx-captcha';
25
+ import * as i10 from 'ngx-captcha';
28
26
  import { NgxCaptchaModule } from 'ngx-captcha';
29
- import * as i12 from 'primeng/dropdown';
27
+ import * as i11 from 'primeng/dropdown';
30
28
  import { DropdownModule } from 'primeng/dropdown';
31
- import * as i14 from '@jsverse/transloco';
29
+ import * as i13 from '@jsverse/transloco';
32
30
  import { CoreTranslocoModule } from '@posiwise/core-transloco';
33
31
  import { PipesModule } from '@posiwise/pipes';
32
+ import * as i2$1 from 'ngx-image-cropper';
33
+ import { ImageCropperModule } from 'ngx-image-cropper';
34
+ import * as i3$1 from 'primeng/button';
35
+ import { ButtonModule } from 'primeng/button';
36
+ import * as i3$2 from '@angular/cdk/drag-drop';
37
+ import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
34
38
 
35
39
  class Trial4ContactUsComponent extends AppBaseComponent {
36
- openQuestionsEditModal() {
37
- this.editingQuestions = JSON.parse(JSON.stringify(this.editingQuestions ?? []));
38
- this.modalService.open(this.questionsEditModal, { centered: true, size: 'lg' });
40
+ async openQuestionsEditModal() {
41
+ this.editingQuestions = JSON.parse(JSON.stringify(this.questions ?? []));
42
+ try {
43
+ // Dynamically import EditQuestionsModalComponent (includes DragDropModule)
44
+ // This only loads when the edit modal is opened (user is logged in with edit permissions)
45
+ // Reduces bundle size for landing pages where users aren't logged in
46
+ const { EditQuestionsModalComponent } = await Promise.resolve().then(function () { return editQuestionsModal_component; });
47
+ const modalRef = this.modalService.open(EditQuestionsModalComponent, {
48
+ size: 'lg',
49
+ centered: true,
50
+ windowClass: 'modal-holder'
51
+ });
52
+ modalRef.componentInstance.editingQuestions = this.editingQuestions;
53
+ modalRef.componentInstance.save.subscribe((updatedQuestions) => {
54
+ this.saveQuestions(modalRef, updatedQuestions);
55
+ });
56
+ modalRef.componentInstance.close.subscribe(() => {
57
+ modalRef.close();
58
+ });
59
+ }
60
+ catch (error) {
61
+ console.error('Failed to load edit questions modal:', error);
62
+ this.toast.error('Failed to open edit modal. Please try again.');
63
+ }
39
64
  }
40
65
  constructor(fb, authService, crmService, sanitizer, adminService, injector, abTestService, modalService, cdr, document) {
41
66
  super(injector);
@@ -150,22 +175,23 @@ class Trial4ContactUsComponent extends AppBaseComponent {
150
175
  this.toast.success(event.file ? 'Logo updated' : 'Logo removed');
151
176
  });
152
177
  }
153
- saveQuestions(modal) {
178
+ saveQuestions(modal, updatedQuestions) {
179
+ const questionsToSave = updatedQuestions || this.editingQuestions;
154
180
  const updateData = {
155
181
  contact_us: {
156
182
  ...this.appConfig.pages_config?.contact_us,
157
- questions: this.editingQuestions
183
+ questions: questionsToSave
158
184
  },
159
185
  subscription_id: this.id
160
186
  };
161
187
  this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
162
- this.questions = this.editingQuestions;
188
+ this.questions = questionsToSave;
163
189
  this.toast.success('Questions updated');
164
- this.question = this.editingQuestions?.[0]?.question;
165
- if (this.editingQuestions?.[0]?.options?.length > 0) {
190
+ this.question = questionsToSave?.[0]?.question;
191
+ if (questionsToSave?.[0]?.options?.length > 0) {
166
192
  this.psaOptions = [
167
193
  { label: 'Select PSA', value: '' },
168
- ...(this.questions?.[0]?.options ?? [])
194
+ ...(questionsToSave?.[0]?.options ?? [])
169
195
  .filter(q => q.option?.trim())
170
196
  .map(q => ({
171
197
  label: q.option,
@@ -179,21 +205,6 @@ class Trial4ContactUsComponent extends AppBaseComponent {
179
205
  modal.close();
180
206
  });
181
207
  }
182
- addNewQuestion() {
183
- this.editingQuestions.push({ question: '', options: [] });
184
- }
185
- addQuestionOption(qIndex) {
186
- this.editingQuestions[qIndex].options.push({ option: '' });
187
- }
188
- removeQuestionOption(qIndex, optIndex) {
189
- this.editingQuestions[qIndex].options.splice(optIndex, 1);
190
- }
191
- dropQuestions(event) {
192
- moveItemInArray(this.editingQuestions, event.previousIndex, event.currentIndex);
193
- }
194
- dropQuestionOptions(qIndex, event) {
195
- moveItemInArray(this.editingQuestions[qIndex].options, event.previousIndex, event.currentIndex);
196
- }
197
208
  openSocialEditModal() {
198
209
  this.editingYoutubeUrl = this.youtubeUrl;
199
210
  this.editingLinkedInUrl = this.linkedInUrl;
@@ -229,15 +240,32 @@ class Trial4ContactUsComponent extends AppBaseComponent {
229
240
  }, { threshold: 0.1 });
230
241
  this.observer.observe(this.footerSection.nativeElement);
231
242
  }
232
- openEditFooterLinksModal(content) {
243
+ async openEditFooterLinksModal() {
233
244
  this.footerLinksData = this.footerLinksData ?? {};
234
245
  this.footerLinksData.items = this.footerLinksData.items ?? [];
235
246
  this.editingFooterLinks = JSON.parse(JSON.stringify(this.footerLinksData));
236
- this.modalService.open(content, {
237
- size: 'lg',
238
- centered: true,
239
- windowClass: 'modal-holder'
240
- });
247
+ try {
248
+ // Dynamically import EditFooterLinksModalComponent (includes DragDropModule)
249
+ // This only loads when the edit modal is opened (user is logged in with edit permissions)
250
+ // Reduces bundle size for landing pages where users aren't logged in
251
+ const { EditFooterLinksModalComponent } = await Promise.resolve().then(function () { return editFooterLinksModal_component; });
252
+ const modalRef = this.modalService.open(EditFooterLinksModalComponent, {
253
+ size: 'lg',
254
+ centered: true,
255
+ windowClass: 'modal-holder'
256
+ });
257
+ modalRef.componentInstance.editingFooterLinks = this.editingFooterLinks;
258
+ modalRef.componentInstance.save.subscribe((updatedFooterLinks) => {
259
+ this.saveFooterLinks(modalRef, updatedFooterLinks);
260
+ });
261
+ modalRef.componentInstance.close.subscribe(() => {
262
+ modalRef.close();
263
+ });
264
+ }
265
+ catch (error) {
266
+ console.error('Failed to load edit footer links modal:', error);
267
+ this.toast.error('Failed to open edit modal. Please try again.');
268
+ }
241
269
  }
242
270
  watchIframeHeightChange() {
243
271
  const iframe = this.document.querySelector('.hubspot-container');
@@ -360,42 +388,18 @@ class Trial4ContactUsComponent extends AppBaseComponent {
360
388
  this.isEmailValid = true;
361
389
  }
362
390
  }
363
- addFooterLink() {
364
- this.editingFooterLinks.items.push({
365
- title: '',
366
- path: '',
367
- subtitles: []
368
- });
369
- }
370
- removeFooterLink(index) {
371
- this.editingFooterLinks.items.splice(index, 1);
372
- }
373
- addSubtitle(footerIndex) {
374
- this.editingFooterLinks.items[footerIndex].subtitles.push({
375
- title: '',
376
- path: ''
377
- });
378
- }
379
- removeSubtitle(footerIndex, subtitleIndex) {
380
- this.editingFooterLinks.items[footerIndex].subtitles.splice(subtitleIndex, 1);
381
- }
382
- dropFooterLinks(event) {
383
- moveItemInArray(this.editingFooterLinks.items, event.previousIndex, event.currentIndex);
384
- }
385
- dropSubtitles(footerIndex, event) {
386
- moveItemInArray(this.editingFooterLinks.items[footerIndex].subtitles, event.previousIndex, event.currentIndex);
387
- }
388
- saveFooterLinks(modal) {
391
+ saveFooterLinks(modal, updatedFooterLinks) {
392
+ const footerLinksToSave = updatedFooterLinks || this.editingFooterLinks;
389
393
  const updatedConfig = {
390
- footer_links: this.editingFooterLinks,
394
+ footer_links: footerLinksToSave,
391
395
  subscription_id: this.id
392
396
  };
393
397
  this.adminService
394
398
  .updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
395
399
  .subscribe(() => {
396
400
  this.toast.success('Footer links updated');
397
- this.footerLinks = [...this.editingFooterLinks.items];
398
- this.footerLinksData = { ...this.editingFooterLinks };
401
+ this.footerLinks = [...footerLinksToSave.items];
402
+ this.footerLinksData = { ...footerLinksToSave };
399
403
  modal.close();
400
404
  });
401
405
  }
@@ -465,11 +469,11 @@ class Trial4ContactUsComponent extends AppBaseComponent {
465
469
  this.observer?.disconnect();
466
470
  }
467
471
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthService }, { token: i3.CrmService }, { token: i4.DomSanitizer }, { token: i5.AdminService }, { token: i0.Injector }, { token: i2.AbTestService }, { token: i6.NgbModal }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
468
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: Trial4ContactUsComponent, selector: "pw-trial-4-contact-us", inputs: { subscriptionId: "subscriptionId", sourceId: "sourceId", masterSubscriptionId: "masterSubscriptionId", experimentName: "experimentName", microserviceName: "microserviceName", shardName: "shardName", user: "user", userLoggedIn: "userLoggedIn" }, viewQueries: [{ propertyName: "footerSection", first: true, predicate: ["footerSection"], descendants: true, static: true }, { propertyName: "content", first: true, predicate: ["bookMeeting"], descendants: true, static: true }, { propertyName: "editFooterLinksModal", first: true, predicate: ["editFooterLinksModal"], descendants: true }, { propertyName: "logoModal", first: true, predicate: ["logoModal"], descendants: true }, { propertyName: "logoUploader", first: true, predicate: ["logoUploader"], descendants: true }, { propertyName: "hubspotEditModal", first: true, predicate: ["hubspotEditModal"], descendants: true }, { propertyName: "socialEditModal", first: true, predicate: ["socialEditModal"], descendants: true }, { propertyName: "questionsEditModal", first: true, predicate: ["questionsEditModal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.enter)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.space)=\"openEditFooterLinksModal(editFooterLinksModal)\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now &amp; schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n<ng-template #editFooterLinksModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Footer Links</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropFooterLinks($event)\">\n <div *ngFor=\"let footer of editingFooterLinks.items; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerTitle{{i}}\" class=\"form-label\">Title</label>\n <input id=\"footerTitle{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.title\" />\n </div>\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerPath{{i}}\" class=\"form-label\">Path</label>\n <input id=\"footerPath{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeFooterLink(i)\" (keydown.enter)=\"removeFooterLink(i)\" (keydown.space)=\"removeFooterLink(i)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Subtitles -->\n <div cdkDropList (cdkDropListDropped)=\"dropSubtitles(i, $event)\">\n <div *ngFor=\"let sub of footer.subtitles; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-5\">\n <label for=\"subtitleTitle{{i}}{{j}}\" class=\"form-label\">Subtitle Title</label>\n <input id=\"subtitleTitle{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.title\" />\n </div>\n <div class=\"col-md-5\">\n <label for=\"subtitlePath{{i}}{{j}}\" class=\"form-label\">Subtitle Path</label>\n <input id=\"subtitlePath{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeSubtitle(i, j)\" (keydown.enter)=\"removeSubtitle(i, j)\" (keydown.space)=\"removeSubtitle(i, j)\"></i>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addFooterLink()\">\n + Add Footer Link\n </button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveFooterLinks(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #questionsEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Questions</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Questions Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropQuestions($event)\">\n <div *ngFor=\"let q of editingQuestions; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-11 mb-2\">\n <label for=\"questionText{{i}}\" class=\"form-label\">Question</label>\n <input id=\"questionText{{i}}\" class=\"form-control\" [(ngModel)]=\"q.question\" placeholder=\"Enter question\" />\n </div>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-4\">\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Options Section -->\n <div cdkDropList (cdkDropListDropped)=\"dropQuestionOptions(i, $event)\">\n <div *ngFor=\"let opt of q.options; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-7 mb-2\">\n <label for=\"questionOption{{i}}{{j}}\" class=\"form-label\">Option</label>\n <input id=\"questionOption{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"opt.option\" placeholder=\"Enter option\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addQuestionOption(i)\">+ Add Option</button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addNewQuestion()\">+ Add Question</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveQuestions(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i10.EventTrackerDirective, selector: "[eventTracker]", inputs: ["eventTracker"] }, { kind: "directive", type: i10.LazyImgDirective, selector: "img" }, { kind: "component", type: i11.ReCaptcha2Component, selector: "ngx-recaptcha2", inputs: ["theme", "size"] }, { kind: "component", type: i12.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i13.FieldErrorDisplayComponent, selector: "pw-field-error-display", inputs: ["errorMsg", "displayError"] }, { kind: "component", type: i13.CustomUploaderComponent, selector: "pw-custom-uploader", inputs: ["controlName", "previewData", "aspectRatio", "title"], outputs: ["saveEvent"] }, { kind: "pipe", type: i14.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
472
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: Trial4ContactUsComponent, selector: "pw-trial-4-contact-us", inputs: { subscriptionId: "subscriptionId", sourceId: "sourceId", masterSubscriptionId: "masterSubscriptionId", experimentName: "experimentName", microserviceName: "microserviceName", shardName: "shardName", user: "user", userLoggedIn: "userLoggedIn" }, viewQueries: [{ propertyName: "footerSection", first: true, predicate: ["footerSection"], descendants: true, static: true }, { propertyName: "content", first: true, predicate: ["bookMeeting"], descendants: true, static: true }, { propertyName: "logoModal", first: true, predicate: ["logoModal"], descendants: true }, { propertyName: "logoUploader", first: true, predicate: ["logoUploader"], descendants: true }, { propertyName: "hubspotEditModal", first: true, predicate: ["hubspotEditModal"], descendants: true }, { propertyName: "socialEditModal", first: true, predicate: ["socialEditModal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal()\" (keydown.enter)=\"openEditFooterLinksModal()\" (keydown.space)=\"openEditFooterLinksModal()\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now &amp; schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i9.EventTrackerDirective, selector: "[eventTracker]", inputs: ["eventTracker"] }, { kind: "directive", type: i9.LazyImgDirective, selector: "img" }, { kind: "component", type: i10.ReCaptcha2Component, selector: "ngx-recaptcha2", inputs: ["theme", "size"] }, { kind: "component", type: i11.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i12.FieldErrorDisplayComponent, selector: "pw-field-error-display", inputs: ["errorMsg", "displayError"] }, { kind: "component", type: i12.CustomUploaderComponent, selector: "pw-custom-uploader", inputs: ["controlName", "previewData", "aspectRatio", "title"], outputs: ["saveEvent"] }, { kind: "pipe", type: i13.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
469
473
  }
470
474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, decorators: [{
471
475
  type: Component,
472
- args: [{ selector: 'pw-trial-4-contact-us', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.enter)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.space)=\"openEditFooterLinksModal(editFooterLinksModal)\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now &amp; schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n<ng-template #editFooterLinksModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Footer Links</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropFooterLinks($event)\">\n <div *ngFor=\"let footer of editingFooterLinks.items; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerTitle{{i}}\" class=\"form-label\">Title</label>\n <input id=\"footerTitle{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.title\" />\n </div>\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerPath{{i}}\" class=\"form-label\">Path</label>\n <input id=\"footerPath{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeFooterLink(i)\" (keydown.enter)=\"removeFooterLink(i)\" (keydown.space)=\"removeFooterLink(i)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Subtitles -->\n <div cdkDropList (cdkDropListDropped)=\"dropSubtitles(i, $event)\">\n <div *ngFor=\"let sub of footer.subtitles; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-5\">\n <label for=\"subtitleTitle{{i}}{{j}}\" class=\"form-label\">Subtitle Title</label>\n <input id=\"subtitleTitle{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.title\" />\n </div>\n <div class=\"col-md-5\">\n <label for=\"subtitlePath{{i}}{{j}}\" class=\"form-label\">Subtitle Path</label>\n <input id=\"subtitlePath{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeSubtitle(i, j)\" (keydown.enter)=\"removeSubtitle(i, j)\" (keydown.space)=\"removeSubtitle(i, j)\"></i>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addFooterLink()\">\n + Add Footer Link\n </button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveFooterLinks(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #questionsEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Questions</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Questions Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropQuestions($event)\">\n <div *ngFor=\"let q of editingQuestions; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-11 mb-2\">\n <label for=\"questionText{{i}}\" class=\"form-label\">Question</label>\n <input id=\"questionText{{i}}\" class=\"form-control\" [(ngModel)]=\"q.question\" placeholder=\"Enter question\" />\n </div>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-4\">\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Options Section -->\n <div cdkDropList (cdkDropListDropped)=\"dropQuestionOptions(i, $event)\">\n <div *ngFor=\"let opt of q.options; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-7 mb-2\">\n <label for=\"questionOption{{i}}{{j}}\" class=\"form-label\">Option</label>\n <input id=\"questionOption{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"opt.option\" placeholder=\"Enter option\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addQuestionOption(i)\">+ Add Option</button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addNewQuestion()\">+ Add Question</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveQuestions(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"] }]
476
+ args: [{ selector: 'pw-trial-4-contact-us', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal()\" (keydown.enter)=\"openEditFooterLinksModal()\" (keydown.space)=\"openEditFooterLinksModal()\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now &amp; schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"] }]
473
477
  }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.AuthService }, { type: i3.CrmService }, { type: i4.DomSanitizer }, { type: i5.AdminService }, { type: i0.Injector }, { type: i2.AbTestService }, { type: i6.NgbModal }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
474
478
  type: Inject,
475
479
  args: [DOCUMENT]
@@ -479,9 +483,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
479
483
  }], content: [{
480
484
  type: ViewChild,
481
485
  args: ['bookMeeting', { static: true }]
482
- }], editFooterLinksModal: [{
483
- type: ViewChild,
484
- args: ['editFooterLinksModal']
485
486
  }], logoModal: [{
486
487
  type: ViewChild,
487
488
  args: ['logoModal']
@@ -494,9 +495,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
494
495
  }], socialEditModal: [{
495
496
  type: ViewChild,
496
497
  args: ['socialEditModal']
497
- }], questionsEditModal: [{
498
- type: ViewChild,
499
- args: ['questionsEditModal']
500
498
  }], subscriptionId: [{
501
499
  type: Input
502
500
  }], sourceId: [{
@@ -518,6 +516,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
518
516
  /**
519
517
  * Standalone module for Trial4ContactUsComponent (pw-trial-4-contact-us)
520
518
  * Lightweight alternative to importing entire ResourceSharedModule
519
+ *
520
+ * DragDropModule removed - now lazy-loaded only when edit modals open
521
+ * This reduces bundle size for landing pages where users aren't logged in
521
522
  */
522
523
  class Trial4ContactUsModule {
523
524
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -525,7 +526,7 @@ class Trial4ContactUsModule {
525
526
  FormsModule,
526
527
  ReactiveFormsModule,
527
528
  RouterModule,
528
- DragDropModule,
529
+ // DragDropModule removed - lazy-loaded in EditFooterLinksModalComponent and EditQuestionsModalComponent
529
530
  NgbModalModule,
530
531
  NgbTooltipModule,
531
532
  DirectivesModule,
@@ -533,14 +534,14 @@ class Trial4ContactUsModule {
533
534
  CoreTranslocoModule,
534
535
  NgxCaptchaModule,
535
536
  DropdownModule,
536
- FieldErrorDisplayModule, // For pw-field-error-display
537
- ProfileImageCropperModule, // For pw-custom-uploader + pw-image-cropper
537
+ FieldErrorDisplayModule$1, // For pw-field-error-display
538
+ ProfileImageCropperModule$1, // For pw-custom-uploader + pw-image-cropper
538
539
  AdminModuleUtilsModule], exports: [Trial4ContactUsComponent] }); }
539
540
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsModule, imports: [CommonModule,
540
541
  FormsModule,
541
542
  ReactiveFormsModule,
542
543
  RouterModule,
543
- DragDropModule,
544
+ // DragDropModule removed - lazy-loaded in EditFooterLinksModalComponent and EditQuestionsModalComponent
544
545
  NgbModalModule,
545
546
  NgbTooltipModule,
546
547
  DirectivesModule,
@@ -548,8 +549,8 @@ class Trial4ContactUsModule {
548
549
  CoreTranslocoModule,
549
550
  NgxCaptchaModule,
550
551
  DropdownModule,
551
- FieldErrorDisplayModule, // For pw-field-error-display
552
- ProfileImageCropperModule, // For pw-custom-uploader + pw-image-cropper
552
+ FieldErrorDisplayModule$1, // For pw-field-error-display
553
+ ProfileImageCropperModule$1, // For pw-custom-uploader + pw-image-cropper
553
554
  AdminModuleUtilsModule] }); }
554
555
  }
555
556
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsModule, decorators: [{
@@ -561,7 +562,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
561
562
  FormsModule,
562
563
  ReactiveFormsModule,
563
564
  RouterModule,
564
- DragDropModule,
565
+ // DragDropModule removed - lazy-loaded in EditFooterLinksModalComponent and EditQuestionsModalComponent
565
566
  NgbModalModule,
566
567
  NgbTooltipModule,
567
568
  DirectivesModule,
@@ -569,17 +570,878 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
569
570
  CoreTranslocoModule,
570
571
  NgxCaptchaModule,
571
572
  DropdownModule,
572
- FieldErrorDisplayModule, // For pw-field-error-display
573
- ProfileImageCropperModule, // For pw-custom-uploader + pw-image-cropper
573
+ FieldErrorDisplayModule$1, // For pw-field-error-display
574
+ ProfileImageCropperModule$1, // For pw-custom-uploader + pw-image-cropper
574
575
  AdminModuleUtilsModule
575
576
  ],
576
577
  exports: [Trial4ContactUsComponent]
577
578
  }]
578
579
  }] });
579
580
 
581
+ class ProfileImageCropperComponent {
582
+ constructor(cdr) {
583
+ this.cdr = cdr;
584
+ this.imageChangedEvent = '';
585
+ this.croppedImage = '';
586
+ this.imageSelectionEvent = new EventEmitter();
587
+ this.closeEvent = new EventEmitter();
588
+ this.fileChangeEvent = new EventEmitter();
589
+ this.aspectRatio = 'auto';
590
+ this.transform = {};
591
+ this.canvasRotation = 0;
592
+ this.showCropper = false;
593
+ }
594
+ onFileChange(event) {
595
+ const input = event.target;
596
+ if (input.files && input.files.length > 0) {
597
+ this.imageChangedEvent = event;
598
+ this.fileChangeEvent.emit(input.files[0].name);
599
+ }
600
+ }
601
+ imageCropped(event) {
602
+ const reader = new FileReader();
603
+ reader.onloadend = () => {
604
+ this.croppedImage = reader.result;
605
+ this.cdr.detectChanges();
606
+ };
607
+ reader.readAsDataURL(event.blob);
608
+ }
609
+ imageLoaded() {
610
+ this.showCropper = true;
611
+ }
612
+ rotateLeft() {
613
+ this.canvasRotation--;
614
+ this.flipAfterRotate();
615
+ }
616
+ rotateRight() {
617
+ this.canvasRotation++;
618
+ this.flipAfterRotate();
619
+ }
620
+ flipAfterRotate() {
621
+ const flippedH = this.transform.flipH;
622
+ const flippedV = this.transform.flipV;
623
+ this.transform = {
624
+ ...this.transform,
625
+ flipH: flippedV,
626
+ flipV: flippedH
627
+ };
628
+ }
629
+ flipHorizontal() {
630
+ this.transform = {
631
+ ...this.transform,
632
+ flipH: !this.transform.flipH
633
+ };
634
+ }
635
+ flipVertical() {
636
+ this.transform = {
637
+ ...this.transform,
638
+ flipV: !this.transform.flipV
639
+ };
640
+ }
641
+ saveProfilePicture() {
642
+ if (this.croppedImage) {
643
+ this.imageSelectionEvent.emit(this.croppedImage);
644
+ this.busy = true;
645
+ }
646
+ }
647
+ onCloseModal() {
648
+ this.closeEvent.emit();
649
+ }
650
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProfileImageCropperComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
651
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ProfileImageCropperComponent, selector: "pw-image-cropper", inputs: { aspectRatio: "aspectRatio", dynamicData: "dynamicData" }, outputs: { imageSelectionEvent: "imageSelectionEvent", closeEvent: "closeEvent", fileChangeEvent: "fileChangeEvent" }, ngImport: i0, template: "<section class=\"image-cropper\">\n <div class=\"row text-start\">\n <div class=\"col-12\">\n <div class=\"card-block pb-0\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"file-upload my-2 float-start\">\n <label for=\"custom-input\">\n Upload Pic\n <input id=\"custom-input\"\n type=\"file\"\n (change)=\"onFileChange($event)\" />\n </label>\n </div>\n\n <div class=\"float-end m-2\">\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Rotate Left\">\n <i\n class=\"fa fa-undo-alt\"\n (click)=\"rotateLeft()\"\n (keydown.enter)=\"rotateLeft()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Rotate Right\">\n <i\n class=\"fa fa-redo-alt\"\n (click)=\"rotateRight()\"\n (keydown.enter)=\"rotateRight()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Flip Horizontal\">\n <i\n class=\"fa fa-arrows-alt-h\"\n (click)=\"flipHorizontal()\"\n (keydown.enter)=\"flipHorizontal()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Flip Vertical\">\n <i\n class=\"fa fa-arrows-alt-v\"\n (click)=\"flipVertical()\"\n (keydown.enter)=\"flipVertical()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-8\">\n <div *ngIf=\"aspectRatio === 'auto'\">\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [canvasRotation]=\"canvasRotation\"\n [aspectRatio]=\"4 / 4\"\n [onlyScaleDown]=\"true\"\n [transform]=\"transform\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'fullLogo'\">\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"5 / 1.1\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'rectangular'\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"3 / 1\"\n [onlyScaleDown]=\"true\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'dynamic'\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"false\"\n [resizeToWidth]=\"0\"\n [cropperStaticWidth]=\"0\"\n [cropperStaticHeight]=\"0\"\n [cropperMinWidth]=\"10\"\n [cropperMinHeight]=\"10\"\n [onlyScaleDown]=\"false\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n [imageQuality]=\"100\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [style.display]=\"showCropper ? null : 'none'\">\n </image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'custom'\">\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [aspectRatio]=\"4 / 3\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n </div>\n <div *ngIf=\"croppedImage\" class=\"col-4 mt-2\">\n <img [src]=\"croppedImage\"\n class=\"cropped-image\"\n alt=\"cropped.png\"\n width=\"128\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"card-footer px-3\">\n <div class=\"float-end mt-2\">\n <button type=\"button\"\n class=\"btn btn-outline-default me-2\"\n (click)=\"onCloseModal()\">\n Close\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"saveProfilePicture()\"\n [buttonBusy]=\"busy\">\n Save\n </button>\n </div>\n </div>\n</section>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.image-cropper label{background:var(--first);border-radius:5px;color:#fff;display:table;font-size:13px;font-weight:500;padding:7px}.image-cropper input[type=file]{display:none}.cropped-image{max-height:390px!important}.card-footer{background-color:transparent;left:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$1.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "cropperFrameAriaLabel", "output", "format", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "directive", type: i9.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i9.LazyImgDirective, selector: "img" }] }); }
652
+ }
653
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProfileImageCropperComponent, decorators: [{
654
+ type: Component,
655
+ args: [{ selector: 'pw-image-cropper', template: "<section class=\"image-cropper\">\n <div class=\"row text-start\">\n <div class=\"col-12\">\n <div class=\"card-block pb-0\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"file-upload my-2 float-start\">\n <label for=\"custom-input\">\n Upload Pic\n <input id=\"custom-input\"\n type=\"file\"\n (change)=\"onFileChange($event)\" />\n </label>\n </div>\n\n <div class=\"float-end m-2\">\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Rotate Left\">\n <i\n class=\"fa fa-undo-alt\"\n (click)=\"rotateLeft()\"\n (keydown.enter)=\"rotateLeft()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Rotate Right\">\n <i\n class=\"fa fa-redo-alt\"\n (click)=\"rotateRight()\"\n (keydown.enter)=\"rotateRight()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Flip Horizontal\">\n <i\n class=\"fa fa-arrows-alt-h\"\n (click)=\"flipHorizontal()\"\n (keydown.enter)=\"flipHorizontal()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button class=\"btn btn-primary btn-sm mx-2\"\n title=\"Flip Vertical\">\n <i\n class=\"fa fa-arrows-alt-v\"\n (click)=\"flipVertical()\"\n (keydown.enter)=\"flipVertical()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-8\">\n <div *ngIf=\"aspectRatio === 'auto'\">\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [canvasRotation]=\"canvasRotation\"\n [aspectRatio]=\"4 / 4\"\n [onlyScaleDown]=\"true\"\n [transform]=\"transform\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'fullLogo'\">\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"5 / 1.1\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'rectangular'\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"3 / 1\"\n [onlyScaleDown]=\"true\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'dynamic'\">\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"false\"\n [resizeToWidth]=\"0\"\n [cropperStaticWidth]=\"0\"\n [cropperStaticHeight]=\"0\"\n [cropperMinWidth]=\"10\"\n [cropperMinHeight]=\"10\"\n [onlyScaleDown]=\"false\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n [imageQuality]=\"100\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [style.display]=\"showCropper ? null : 'none'\">\n </image-cropper>\n </div>\n\n <div *ngIf=\"aspectRatio === 'custom'\">\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"true\"\n [canvasRotation]=\"canvasRotation\"\n [transform]=\"transform\"\n [aspectRatio]=\"4 / 3\"\n [onlyScaleDown]=\"true\"\n [roundCropper]=\"false\"\n alignImage=\"center\"\n outputType=\"base64\"\n (imageCropped)=\"imageCropped($event)\"\n (imageLoaded)=\"imageLoaded()\"\n [imageQuality]=\"100\"\n [style.display]=\"showCropper ? null : 'none'\"></image-cropper>\n </div>\n </div>\n <div *ngIf=\"croppedImage\" class=\"col-4 mt-2\">\n <img [src]=\"croppedImage\"\n class=\"cropped-image\"\n alt=\"cropped.png\"\n width=\"128\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"card-footer px-3\">\n <div class=\"float-end mt-2\">\n <button type=\"button\"\n class=\"btn btn-outline-default me-2\"\n (click)=\"onCloseModal()\">\n Close\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"saveProfilePicture()\"\n [buttonBusy]=\"busy\">\n Save\n </button>\n </div>\n </div>\n</section>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.image-cropper label{background:var(--first);border-radius:5px;color:#fff;display:table;font-size:13px;font-weight:500;padding:7px}.image-cropper input[type=file]{display:none}.cropped-image{max-height:390px!important}.card-footer{background-color:transparent;left:0}\n"] }]
656
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { imageSelectionEvent: [{
657
+ type: Output
658
+ }], closeEvent: [{
659
+ type: Output
660
+ }], fileChangeEvent: [{
661
+ type: Output
662
+ }], aspectRatio: [{
663
+ type: Input
664
+ }], dynamicData: [{
665
+ type: Input
666
+ }] } });
667
+
668
+ class CustomUploaderComponent extends AppBaseComponent {
669
+ constructor(injector, modalService, document) {
670
+ super(injector);
671
+ this.modalService = modalService;
672
+ this.document = document;
673
+ this.saveEvent = new EventEmitter();
674
+ this.aspectRatio = 'auto';
675
+ this.uploadedFile = null;
676
+ }
677
+ deleteExistingFile() {
678
+ HelperService.raiseDeletePopup().then(rep => {
679
+ if (rep.value) {
680
+ this.previewData = null;
681
+ this.onSaveFile();
682
+ }
683
+ });
684
+ }
685
+ onSaveFile() {
686
+ this.buttonBusy = true;
687
+ this.saveEvent.emit({
688
+ file: this.previewData?.url ? this.previewData : this.uploadedFile,
689
+ name: this.controlName
690
+ });
691
+ }
692
+ // modal image cropper
693
+ onFileChange(value) {
694
+ this.selectedFileName = value;
695
+ }
696
+ dataURLtoBlob(dataUrl) {
697
+ const arr = dataUrl?.split(',');
698
+ // eslint-disable-next-line @typescript-eslint/prefer-regexp-exec
699
+ const mime = /^[A-Z]*[a-z]*:(.*?);[A-Z]*/.exec(arr[0])?.[1];
700
+ const bStr = atob(arr[1]);
701
+ let n = bStr.length;
702
+ const u8arr = new Uint8Array(n);
703
+ // eslint-disable-next-line no-plusplus
704
+ while (n--) {
705
+ u8arr[n] = bStr.charCodeAt(n);
706
+ }
707
+ return new Blob([u8arr], { type: mime });
708
+ }
709
+ onImageSelection(event) {
710
+ const blob = this.dataURLtoBlob(event);
711
+ const file = new File([blob], this.selectedFileName);
712
+ this.uploadedFile = file;
713
+ this.onSaveFile();
714
+ }
715
+ openModal(content) {
716
+ this.modalService.open(content, { centered: true, windowClass: 'modal-holder' });
717
+ }
718
+ clearValues() {
719
+ this.uploadedFile = null;
720
+ this.selectedFileName = null;
721
+ this.updateHeight();
722
+ }
723
+ onClose() {
724
+ this.modalService.dismissAll();
725
+ }
726
+ updateHeight() {
727
+ // wait for update card height
728
+ setTimeout(() => {
729
+ this.onImgChange();
730
+ });
731
+ }
732
+ onImgChange(event) {
733
+ if (event) {
734
+ const target = event.target;
735
+ target.src = 'assets/img/icons/imagenotavailable.png';
736
+ }
737
+ const el = this.document.querySelectorAll('pw-domain-config-interface,pw-domain-config-build div[matchheight="card"]');
738
+ el.forEach((item) => {
739
+ HelperService.matchHeights(item, 'card');
740
+ });
741
+ }
742
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: CustomUploaderComponent, deps: [{ token: i0.Injector }, { token: i6.NgbModal }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
743
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: CustomUploaderComponent, selector: "pw-custom-uploader", inputs: { controlName: "controlName", previewData: "previewData", aspectRatio: "aspectRatio", title: "title" }, outputs: { saveEvent: "saveEvent" }, usesInheritance: true, ngImport: i0, template: "<div class=\"card pb-2\">\n <div class=\"card-header upload-button-bar\">\n <button pButton\n type=\"button\"\n [disabled]=\"previewData?.url || uploadedFile\"\n (click)=\"openModal(content)\"\n (keydown.enter)=\"openModal(content)\"\n icon=\"pi pi-plus\"\n label=\"Choose\"></button>\n </div>\n <div class=\"card-body\">\n <!-- no files -->\n <div class=\"d-flex preview-wrapper\"\n *ngIf=\"!previewData?.url\">\n <div>\n <img src=\"assets/img/icons/nofilesfound.png\"\n (load)=\"onImgChange()\"\n class=\"mx-auto img-fluid\"\n alt=\"\" />\n </div>\n </div>\n <!-- existing images -->\n <div class=\"d-flex preview-wrapper\"\n *ngIf=\"previewData?.url\">\n <div>\n <a [href]=\"previewData?.url\"\n target=\"_blank\">\n <img [src]=\"previewData?.url\"\n alt=\"\"\n (load)=\"onImgChange()\"\n (error)=\"onImgChange($event)\"\n class=\"img-fluid\" />\n </a>\n </div>\n <div class=\"ms-3\">\n <i\n container=\"body\"\n ngbTooltip=\"Delete\"\n (click)=\"deleteExistingFile()\"\n (keydown.enter)=\"deleteExistingFile()\"\n (keydown.space)=\"deleteExistingFile()\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n </div>\n</div>\n<!-- image cropper -->\n<ng-template #content\n let-modal>\n <div class=\"card m-0\">\n <div class=\"card-content\">\n <div class=\"card-title\">\n <h3 class=\"modal-title\">{{ title }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"card-header\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile\n [aspectRatio]=\"aspectRatio\"\n (fileChangeEvent)=\"onFileChange($event)\"\n (imageSelectionEvent)=\"onImageSelection($event)\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.upload-button-bar{background:#efefef;padding:1rem 1.25rem}.card{min-height:270px!important;max-height:550px!important;height:auto}.preview-wrapper{align-items:center;text-align:center}.preview-wrapper div{padding:1rem;flex:1 1 auto;width:25%;word-break:break-all}button[label=Choose],button[label=Choose]:hover,button[label=Choose]:enabled:active{background-color:#616161;border-color:#616161}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i9.LazyImgDirective, selector: "img" }, { kind: "component", type: ProfileImageCropperComponent, selector: "pw-image-cropper", inputs: ["aspectRatio", "dynamicData"], outputs: ["imageSelectionEvent", "closeEvent", "fileChangeEvent"] }, { kind: "pipe", type: i13.TranslocoPipe, name: "transloco" }] }); }
744
+ }
745
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: CustomUploaderComponent, decorators: [{
746
+ type: Component,
747
+ args: [{ selector: 'pw-custom-uploader', template: "<div class=\"card pb-2\">\n <div class=\"card-header upload-button-bar\">\n <button pButton\n type=\"button\"\n [disabled]=\"previewData?.url || uploadedFile\"\n (click)=\"openModal(content)\"\n (keydown.enter)=\"openModal(content)\"\n icon=\"pi pi-plus\"\n label=\"Choose\"></button>\n </div>\n <div class=\"card-body\">\n <!-- no files -->\n <div class=\"d-flex preview-wrapper\"\n *ngIf=\"!previewData?.url\">\n <div>\n <img src=\"assets/img/icons/nofilesfound.png\"\n (load)=\"onImgChange()\"\n class=\"mx-auto img-fluid\"\n alt=\"\" />\n </div>\n </div>\n <!-- existing images -->\n <div class=\"d-flex preview-wrapper\"\n *ngIf=\"previewData?.url\">\n <div>\n <a [href]=\"previewData?.url\"\n target=\"_blank\">\n <img [src]=\"previewData?.url\"\n alt=\"\"\n (load)=\"onImgChange()\"\n (error)=\"onImgChange($event)\"\n class=\"img-fluid\" />\n </a>\n </div>\n <div class=\"ms-3\">\n <i\n container=\"body\"\n ngbTooltip=\"Delete\"\n (click)=\"deleteExistingFile()\"\n (keydown.enter)=\"deleteExistingFile()\"\n (keydown.space)=\"deleteExistingFile()\"\n class=\"fa fa-trash delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </div>\n </div>\n</div>\n<!-- image cropper -->\n<ng-template #content\n let-modal>\n <div class=\"card m-0\">\n <div class=\"card-content\">\n <div class=\"card-title\">\n <h3 class=\"modal-title\">{{ title }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"card-header\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile\n [aspectRatio]=\"aspectRatio\"\n (fileChangeEvent)=\"onFileChange($event)\"\n (imageSelectionEvent)=\"onImageSelection($event)\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.upload-button-bar{background:#efefef;padding:1rem 1.25rem}.card{min-height:270px!important;max-height:550px!important;height:auto}.preview-wrapper{align-items:center;text-align:center}.preview-wrapper div{padding:1rem;flex:1 1 auto;width:25%;word-break:break-all}button[label=Choose],button[label=Choose]:hover,button[label=Choose]:enabled:active{background-color:#616161;border-color:#616161}\n"] }]
748
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i6.NgbModal }, { type: Document, decorators: [{
749
+ type: Inject,
750
+ args: [DOCUMENT]
751
+ }] }], propDecorators: { saveEvent: [{
752
+ type: Output
753
+ }], controlName: [{
754
+ type: Input
755
+ }], previewData: [{
756
+ type: Input
757
+ }], aspectRatio: [{
758
+ type: Input
759
+ }], title: [{
760
+ type: Input
761
+ }] } });
762
+
763
+ /**
764
+ * Lightweight module for pw-image-cropper component
765
+ *
766
+ * Minimal dependencies - only CommonModule, ImageCropperModule, DirectivesModule
767
+ * Use this instead of ResourceSharedComponentsModule when you only need image cropping
768
+ */
769
+ class ProfileImageCropperModule {
770
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProfileImageCropperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
771
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: ProfileImageCropperModule, declarations: [ProfileImageCropperComponent, CustomUploaderComponent], imports: [CommonModule,
772
+ CoreTranslocoModule,
773
+ ButtonModule,
774
+ ImageCropperModule, // for <image-cropper>
775
+ DirectivesModule // for [buttonBusy] directive
776
+ ], exports: [ProfileImageCropperComponent, CustomUploaderComponent] }); }
777
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProfileImageCropperModule, imports: [CommonModule,
778
+ CoreTranslocoModule,
779
+ ButtonModule,
780
+ ImageCropperModule, // for <image-cropper>
781
+ DirectivesModule // for [buttonBusy] directive
782
+ ] }); }
783
+ }
784
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProfileImageCropperModule, decorators: [{
785
+ type: NgModule,
786
+ args: [{
787
+ declarations: [ProfileImageCropperComponent, CustomUploaderComponent],
788
+ imports: [
789
+ CommonModule,
790
+ CoreTranslocoModule,
791
+ ButtonModule,
792
+ ImageCropperModule, // for <image-cropper>
793
+ DirectivesModule // for [buttonBusy] directive
794
+ ],
795
+ exports: [ProfileImageCropperComponent, CustomUploaderComponent]
796
+ }]
797
+ }] });
798
+
799
+ class ResourceHeaderComponent extends AppBaseComponent {
800
+ constructor(injector, document, adminService, modalService) {
801
+ super(injector);
802
+ this.document = document;
803
+ this.adminService = adminService;
804
+ this.modalService = modalService;
805
+ this.isScrolled = false;
806
+ this.open = false;
807
+ this.logo = '/assets/img/landing-page/site-logo.png'; // Static fallback for LCP optimization
808
+ this.navbarItems = this.appConfig?.pages_config?.navbar?.items;
809
+ this.domainId = this.appConfig?.domain_id;
810
+ this.contrastImageUrl = this.appConfig?.company?.logos?.main_contrast?.url;
811
+ this.darkImageUrl = this.appConfig?.company?.logos?.main_dark?.url;
812
+ this.editingNavbar = {
813
+ items: []
814
+ };
815
+ this.canEditResourcesValue = false;
816
+ }
817
+ ngOnInit() {
818
+ console.log('In Header');
819
+ // Subscribe to appConfig changes to update logo dynamically
820
+ this.appConfigService.appConfig$.subscribe(config => {
821
+ if (config?.company?.logos) {
822
+ const isAboutUs = this.router.url?.includes('/about-us');
823
+ const logos = config.company.logos;
824
+ // Use smaller version for better performance (100x100 instead of 1200x264)
825
+ this.logo = isAboutUs
826
+ ? logos.main_contrast?.url || '/assets/img/landing-page/site-logo.png'
827
+ : logos.main_dark?.url || '/assets/img/landing-page/site-logo.png';
828
+ }
829
+ });
830
+ if (this.userLoggedIn) {
831
+ this.localStorage.getItem$('product').subscribe(res => {
832
+ const data = res ? JSON.parse(res) : null;
833
+ this.id = data?.subscriptionId;
834
+ });
835
+ }
836
+ }
837
+ ngOnChanges(changes) {
838
+ if (changes['user'] || changes['userLoggedIn']) {
839
+ if (this.userLoggedIn && this.user) {
840
+ this.updateCanEditResourcesValue();
841
+ }
842
+ }
843
+ }
844
+ openLogoEditModal() {
845
+ this.modalService.open(this.logoEditModal, { centered: true, size: 'md' });
846
+ }
847
+ onSaveLogo(event) {
848
+ const formData = new FormData();
849
+ formData.append('subscription_id', this.id);
850
+ if (event.file instanceof File) {
851
+ formData.append(this.isScrolled ? 'logo_main_contrast' : 'logo_main_dark', event.file);
852
+ }
853
+ else {
854
+ formData.append(this.isScrolled ? 'remove_logo_main_contrast' : 'remove_logo_main_dark', 'true');
855
+ }
856
+ this.adminService.updateDomainConfig(this.domainId, formData).subscribe(() => {
857
+ if (event.file) {
858
+ this.logo = URL.createObjectURL(event.file);
859
+ if (this.isScrolled) {
860
+ this.contrastImageUrl = URL.createObjectURL(event.file);
861
+ }
862
+ else {
863
+ this.darkImageUrl = URL.createObjectURL(event.file);
864
+ }
865
+ this.modalService.dismissAll();
866
+ }
867
+ this.toast.success(event.file ? 'Logo updated' : 'Logo removed');
868
+ });
869
+ }
870
+ onScroll() {
871
+ clearTimeout(this.scrollTimeout);
872
+ this.scrollTimeout = setTimeout(() => {
873
+ requestAnimationFrame(() => {
874
+ const isAboutUs = this.router?.url?.includes('/about-us');
875
+ const shouldScroll = window.scrollY > 150;
876
+ this.isScrolled = shouldScroll;
877
+ if (!isAboutUs) {
878
+ // Use smaller versions for better performance
879
+ const logos = this.appConfig?.company?.logos;
880
+ const newLogo = shouldScroll
881
+ ? logos?.main_contrast?.url ??
882
+ this.contrastImageUrl ??
883
+ '/assets/img/landing-page/site-logo.png'
884
+ : logos?.main_dark?.url ??
885
+ this.darkImageUrl ??
886
+ '/assets/img/landing-page/site-logo.png';
887
+ if (this.logo !== newLogo) {
888
+ this.logo = newLogo;
889
+ }
890
+ }
891
+ if (window.innerWidth < 768) {
892
+ this.open = false;
893
+ const collapseElement = this.navbarCollapse?.nativeElement;
894
+ if (collapseElement?.classList.contains('show')) {
895
+ collapseElement.classList.remove('show');
896
+ }
897
+ }
898
+ // Close all dropdowns when scrolling
899
+ this.closeAllDropdowns();
900
+ });
901
+ }, 50);
902
+ }
903
+ onDocumentClick(event) {
904
+ // Close all dropdowns when clicking outside
905
+ const target = event.target;
906
+ if (!target.closest('.nav-item') &&
907
+ !target.closest('.popup') &&
908
+ !target.closest('.sign-btn')) {
909
+ this.closeAllDropdowns();
910
+ }
911
+ }
912
+ closeAllDropdowns() {
913
+ if (this.navbarItems) {
914
+ this.navbarItems.forEach(item => {
915
+ if (item.open) {
916
+ item.open = false;
917
+ }
918
+ });
919
+ }
920
+ }
921
+ openDropdown(item) {
922
+ // Close other dropdowns first
923
+ this.navbarItems.forEach(navItem => {
924
+ if (navItem !== item) {
925
+ navItem.open = false;
926
+ }
927
+ });
928
+ item.open = true;
929
+ }
930
+ onDropdownItemClick(item) {
931
+ item.open = false;
932
+ }
933
+ async openEditNavbarModal() {
934
+ const navbarConfig = this.appConfig.pages_config?.navbar ?? {};
935
+ navbarConfig.items = navbarConfig.items ?? [];
936
+ this.editingNavbar = JSON.parse(JSON.stringify(navbarConfig));
937
+ try {
938
+ // Dynamically import EditNavbarModalComponent (includes DragDropModule)
939
+ // This only loads when the edit modal is opened (user is logged in with edit permissions)
940
+ // Reduces bundle size for landing pages where users aren't logged in
941
+ const { EditNavbarModalComponent } = await import('./posiwise-resource-contact-us-edit-navbar-modal.component-C59Q3971.mjs');
942
+ const modalRef = this.modalService.open(EditNavbarModalComponent, {
943
+ size: 'lg',
944
+ centered: true,
945
+ windowClass: 'modal-holder'
946
+ });
947
+ modalRef.componentInstance.editingNavbar = this.editingNavbar;
948
+ modalRef.componentInstance.save.subscribe((updatedNavbar) => {
949
+ this.saveNavbarLinks(modalRef, updatedNavbar);
950
+ });
951
+ modalRef.componentInstance.close.subscribe(() => {
952
+ modalRef.close();
953
+ });
954
+ }
955
+ catch (error) {
956
+ console.error('Failed to load edit navbar modal:', error);
957
+ this.toast.error('Failed to open edit modal. Please try again.');
958
+ }
959
+ }
960
+ saveNavbarLinks(modal, updatedNavbar) {
961
+ const navbarToSave = updatedNavbar || this.editingNavbar;
962
+ const updatedConfig = {
963
+ navbar: navbarToSave,
964
+ subscription_id: this.id
965
+ };
966
+ this.adminService
967
+ .updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
968
+ .subscribe(() => {
969
+ this.toast.success('Navbar links updated');
970
+ this.navbarItems = [...navbarToSave.items];
971
+ // Update the appConfig to reflect the saved changes
972
+ this.appConfig.pages_config = this.appConfig.pages_config ?? {};
973
+ this.appConfig.pages_config.navbar = { ...navbarToSave };
974
+ modal.close();
975
+ });
976
+ }
977
+ updateCanEditResourcesValue() {
978
+ this.canEditResourcesValue = HelperService.canEditResources(this.user, this.userLoggedIn, this.permissionService);
979
+ }
980
+ canEditResources() {
981
+ return this.canEditResourcesValue;
982
+ }
983
+ navigateToLogin() {
984
+ window.location.href = '/login';
985
+ }
986
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourceHeaderComponent, deps: [{ token: i0.Injector }, { token: DOCUMENT }, { token: i5.AdminService }, { token: i6.NgbModal }], target: i0.ɵɵFactoryTarget.Component }); }
987
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ResourceHeaderComponent, selector: "pw-resource-header", inputs: { user: "user", userLoggedIn: "userLoggedIn" }, host: { listeners: { "window:scroll": "onScroll()", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "navbarCollapse", first: true, predicate: ["collapsibleNavbar"], descendants: true }, { propertyName: "logoEditModal", first: true, predicate: ["logoEditModal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<nav class=\"navbar navbar-expand-md navbar-dark fixed-top primary-nav-bg-color resource-header\"\n id=\"banner\">\n <div class=\"container container-wrapper banner-section\">\n\n <!-- Toggler/collapsibe Button -->\n <button class=\"navbar-toggler header-menu-bar\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n data-bs-toggle=\"collapse\"\n data-bs-target=\"#collapsibleNavbar\">\n <img src=\"/assets/img/products/trial/navbar-toggle-icon.png\"\n class=\"img-fluid navbar-toggle-icon\"\n alt=\"\" />\n </button>\n\n <!-- Mobile Logo -->\n <div class=\"d-md-none mb-icon\">\n <div>\n <img src=\"/assets/img/landing-page/site-logo.png\"\n [src]=\"logo || '/assets/img/landing-page/site-logo.png'\"\n routerLink=\"/\"\n alt=\"logo\"\n class=\"img-fluid logo_img\"\n width=\"100\"\n height=\"100\"\n loading=\"eager\"\n fetchpriority=\"high\"\n sizes=\"100px\" />\n </div>\n </div>\n\n\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer text-black me-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n\n\n <!-- Navbar links -->\n <div class=\"collapse navbar-collapse mt-3 mt-md-0\"\n id=\"collapsibleNavbar\"\n #collapsibleNavbar>\n <div class=\"row align-items-center w-100\">\n\n <!-- Always occupy 3 columns for logo -->\n <div class=\"col-md-2 d-none d-md-flex align-items-center\">\n <div>\n <img src=\"/assets/img/landing-page/site-logo.png\"\n [src]=\"logo || '/assets/img/landing-page/site-logo.png'\"\n routerLink=\"/\"\n alt=\"logo\"\n class=\"img-fluid logo_img\"\n width=\"100\"\n height=\"100\"\n loading=\"eager\"\n fetchpriority=\"high\"\n sizes=\"100px\" />\n </div>\n </div>\n\n\n <div class=\"col-md-7 d-flex justify-content-start\">\n <ul #anchorLinks\n class=\"navbar-nav flex gap-4 me-0 wow fadeInUp position-relative\"\n data-wow-duration=\"2s\">\n\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer text-black me-3\"\n (click)=\"openEditNavbarModal()\"\n (keydown.enter)=\"openEditNavbarModal()\"\n (keydown.space)=\"openEditNavbarModal()\"\n title=\"Edit Navbar Links\"></i>\n <li class=\"nav-item\" *ngFor=\"let item of navbarItems\">\n <div class=\"dropdown-container\"\n (mouseenter)=\"openDropdown(item)\">\n <a\n class=\"nav-link\"\n href=\"javascript:void(0)\"\n [ngClass]=\"{ 'scrolled-nav-link': isScrolled }\"\n (click)=\"item.subtitles?.length ? (item.open = !item.open) : null\"\n [attr.href]=\"!(item.subtitles?.length) ? item.path : null\"\n >\n {{ item?.title }}\n <i *ngIf=\"item.subtitles.length > 0 && item.open\" class=\"fa-solid fa-caret-down\"></i>\n </a>\n <div class=\"popup position-absolute\"\n *ngIf=\"item.subtitles.length > 0 && item.open\">\n <ul>\n <li\n *ngFor=\"let sub of item.subtitles\"\n [routerLink]=\"sub.path\"\n class=\"dropdownItem\"\n (click)=\"onDropdownItemClick(item)\"\n (keydown.enter)=\"onDropdownItemClick(item)\"\n (keydown.space)=\"onDropdownItemClick(item)\"\n >\n {{ sub.title }}\n </li>\n </ul>\n </div>\n </div>\n </li>\n\n <li class=\"nav-item ms-2 mb-3 d-flex d-md-none\">\n <a class=\"sign-btn sign-header-btn\"\n (click)=\"navigateToLogin()\">Log In</a>\n </li>\n </ul>\n </div>\n\n <!-- Always 3 columns for login -->\n <div class=\"col-md-3 d-none d-md-flex justify-content-end\">\n <a class=\"sign-btn sign-header-btn\"\n (click)=\"navigateToLogin()\">Log In</a>\n </div>\n\n </div>\n </div>\n </div>\n</nav>\n\n<ng-template #logoEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <!-- <pw-custom-uploader\n [title]=\"'Main Logo'\"\n [controlName]=\"'logo_main'\"\n [aspectRatio]=\"'fullLogo'\"\n [previewData]=\"{ url: logo, name: 'logo_main.png' }\"\n (saveEvent)=\"onSaveLogo($event)\">\n </pw-custom-uploader> -->\n </div>\n</ng-template>", styles: [".navbar-custom-background{background-color:#00000080;box-shadow:2px 2px 15px 2px #0000001f;transition:width 2s,height 2s,-webkit-transform 2s;transition:width 2s,height 2s,transform 2s background-color .5s ease;z-index:9999}.fixed-top{position:fixed!important}.primary-button{background-color:#000;border-radius:50px;color:#fff;font: 600 16.3px Montserrat-Regular,sans-serif;padding:5px 16px!important;width:auto;display:flex;gap:15px;align-items:center;justify-content:space-between}.logo_img{width:60%!important;min-width:159px!important}.navbar-toggle-icon{width:25px}@media (min-width: 500px){.navbar-nav .nav-item button{margin-top:10px}}@media (max-width: 1200px){.navbar-nav .nav-item .nav-link{font-size:15px!important}}.navbar-nav .nav-link{display:inline-flex!important;white-space:nowrap;gap:4px}.fa-caret-down{font-family:\"Font Awesome 6 Pro\",sans-serif;font-weight:900}@media (min-width: 1200px){.navbar-nav .nav-item .nav-link{padding-bottom:0!important;padding-top:0!important}.popup{top:3.4rem!important;background-color:var(--first)!important;background-color:transparent;padding:10px;z-index:1000;transition:opacity .3s ease-in-out}.popup ul li{color:#fff;font: 500 14px Montserrat-Regular,sans-serif;cursor:pointer;border-bottom:1px solid #eee}.popup ul li:last-child{border-bottom:none}.router-link-active{color:#000!important}}@media (max-width: 1200px){.popup ul li{color:#fff;font: 500 14px Montserrat-Regular,sans-serif;cursor:pointer;border-bottom:1px solid #eee}.popup ul li:last-child{border-bottom:none}.popup ul li:hover{background-color:#f1f1f1}.mb-icon{width:200px}.container-wrapper{padding:10px 20px!important}.dropdown-container{position:relative;display:inline-block}.popup{top:0%!important;background-color:var(--first)!important;left:10rem;padding:10px;z-index:1000;transition:opacity .3s ease-in-out}}@media (max-width: 500px){.navbar-nav{background-color:var(--first);border-top:3px solid rgb(254,209,54);color:#fff;margin-top:5px;z-index:1}.navbar-nav .nav-item .nav-link{font-size:100%;font-weight:500;padding:.7em 1em!important}}.popup{top:90%;background-color:transparent;padding:10px;z-index:1000}.popup ul{list-style-type:none;padding:0;margin:0}.popup ul li{padding:5px 10px;font: 500 14px Montserrat-Regular,sans-serif}.resource-header .nav-link.scrolled-nav-link{color:#fff!important}.resource-header .sign-btn,.resource-header .sign-header-btn{text-decoration:none!important}.dropdownItem{cursor:pointer}.rotate{transform:rotate(180deg)}@media (max-width: 500px){.logo_img{width:60%!important;margin-left:auto;margin-right:0;display:block;transition:margin .5s ease,width .5s ease}.navbar-nav{background-color:var(--first);border-top:3px solid rgb(254,209,54);color:#fff;margin-top:5px;z-index:1}.navbar-nav .nav-item .nav-link{font-size:100%;font-weight:500;padding:.7em 1em!important}.popup{top:0%!important;background-color:var(--first)!important;left:10rem;padding:10px;z-index:1000;transition:opacity .3s ease-in-out}.popup ul{list-style-type:none;padding:0;margin:0}.dropdownItem{cursor:pointer}.rotate{transform:rotate(180deg)}.dropdown-container{position:relative;display:inline-block}}.navbar-nav{visibility:visible!important;display:flex!important}.nav-link{text-transform:uppercase}.dropdown-container{position:relative;display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i9.LazyImgDirective, selector: "img" }] }); }
988
+ }
989
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourceHeaderComponent, decorators: [{
990
+ type: Component,
991
+ args: [{ selector: 'pw-resource-header', template: "<nav class=\"navbar navbar-expand-md navbar-dark fixed-top primary-nav-bg-color resource-header\"\n id=\"banner\">\n <div class=\"container container-wrapper banner-section\">\n\n <!-- Toggler/collapsibe Button -->\n <button class=\"navbar-toggler header-menu-bar\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n data-bs-toggle=\"collapse\"\n data-bs-target=\"#collapsibleNavbar\">\n <img src=\"/assets/img/products/trial/navbar-toggle-icon.png\"\n class=\"img-fluid navbar-toggle-icon\"\n alt=\"\" />\n </button>\n\n <!-- Mobile Logo -->\n <div class=\"d-md-none mb-icon\">\n <div>\n <img src=\"/assets/img/landing-page/site-logo.png\"\n [src]=\"logo || '/assets/img/landing-page/site-logo.png'\"\n routerLink=\"/\"\n alt=\"logo\"\n class=\"img-fluid logo_img\"\n width=\"100\"\n height=\"100\"\n loading=\"eager\"\n fetchpriority=\"high\"\n sizes=\"100px\" />\n </div>\n </div>\n\n\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer text-black me-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n\n\n <!-- Navbar links -->\n <div class=\"collapse navbar-collapse mt-3 mt-md-0\"\n id=\"collapsibleNavbar\"\n #collapsibleNavbar>\n <div class=\"row align-items-center w-100\">\n\n <!-- Always occupy 3 columns for logo -->\n <div class=\"col-md-2 d-none d-md-flex align-items-center\">\n <div>\n <img src=\"/assets/img/landing-page/site-logo.png\"\n [src]=\"logo || '/assets/img/landing-page/site-logo.png'\"\n routerLink=\"/\"\n alt=\"logo\"\n class=\"img-fluid logo_img\"\n width=\"100\"\n height=\"100\"\n loading=\"eager\"\n fetchpriority=\"high\"\n sizes=\"100px\" />\n </div>\n </div>\n\n\n <div class=\"col-md-7 d-flex justify-content-start\">\n <ul #anchorLinks\n class=\"navbar-nav flex gap-4 me-0 wow fadeInUp position-relative\"\n data-wow-duration=\"2s\">\n\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer text-black me-3\"\n (click)=\"openEditNavbarModal()\"\n (keydown.enter)=\"openEditNavbarModal()\"\n (keydown.space)=\"openEditNavbarModal()\"\n title=\"Edit Navbar Links\"></i>\n <li class=\"nav-item\" *ngFor=\"let item of navbarItems\">\n <div class=\"dropdown-container\"\n (mouseenter)=\"openDropdown(item)\">\n <a\n class=\"nav-link\"\n href=\"javascript:void(0)\"\n [ngClass]=\"{ 'scrolled-nav-link': isScrolled }\"\n (click)=\"item.subtitles?.length ? (item.open = !item.open) : null\"\n [attr.href]=\"!(item.subtitles?.length) ? item.path : null\"\n >\n {{ item?.title }}\n <i *ngIf=\"item.subtitles.length > 0 && item.open\" class=\"fa-solid fa-caret-down\"></i>\n </a>\n <div class=\"popup position-absolute\"\n *ngIf=\"item.subtitles.length > 0 && item.open\">\n <ul>\n <li\n *ngFor=\"let sub of item.subtitles\"\n [routerLink]=\"sub.path\"\n class=\"dropdownItem\"\n (click)=\"onDropdownItemClick(item)\"\n (keydown.enter)=\"onDropdownItemClick(item)\"\n (keydown.space)=\"onDropdownItemClick(item)\"\n >\n {{ sub.title }}\n </li>\n </ul>\n </div>\n </div>\n </li>\n\n <li class=\"nav-item ms-2 mb-3 d-flex d-md-none\">\n <a class=\"sign-btn sign-header-btn\"\n (click)=\"navigateToLogin()\">Log In</a>\n </li>\n </ul>\n </div>\n\n <!-- Always 3 columns for login -->\n <div class=\"col-md-3 d-none d-md-flex justify-content-end\">\n <a class=\"sign-btn sign-header-btn\"\n (click)=\"navigateToLogin()\">Log In</a>\n </div>\n\n </div>\n </div>\n </div>\n</nav>\n\n<ng-template #logoEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <!-- <pw-custom-uploader\n [title]=\"'Main Logo'\"\n [controlName]=\"'logo_main'\"\n [aspectRatio]=\"'fullLogo'\"\n [previewData]=\"{ url: logo, name: 'logo_main.png' }\"\n (saveEvent)=\"onSaveLogo($event)\">\n </pw-custom-uploader> -->\n </div>\n</ng-template>", styles: [".navbar-custom-background{background-color:#00000080;box-shadow:2px 2px 15px 2px #0000001f;transition:width 2s,height 2s,-webkit-transform 2s;transition:width 2s,height 2s,transform 2s background-color .5s ease;z-index:9999}.fixed-top{position:fixed!important}.primary-button{background-color:#000;border-radius:50px;color:#fff;font: 600 16.3px Montserrat-Regular,sans-serif;padding:5px 16px!important;width:auto;display:flex;gap:15px;align-items:center;justify-content:space-between}.logo_img{width:60%!important;min-width:159px!important}.navbar-toggle-icon{width:25px}@media (min-width: 500px){.navbar-nav .nav-item button{margin-top:10px}}@media (max-width: 1200px){.navbar-nav .nav-item .nav-link{font-size:15px!important}}.navbar-nav .nav-link{display:inline-flex!important;white-space:nowrap;gap:4px}.fa-caret-down{font-family:\"Font Awesome 6 Pro\",sans-serif;font-weight:900}@media (min-width: 1200px){.navbar-nav .nav-item .nav-link{padding-bottom:0!important;padding-top:0!important}.popup{top:3.4rem!important;background-color:var(--first)!important;background-color:transparent;padding:10px;z-index:1000;transition:opacity .3s ease-in-out}.popup ul li{color:#fff;font: 500 14px Montserrat-Regular,sans-serif;cursor:pointer;border-bottom:1px solid #eee}.popup ul li:last-child{border-bottom:none}.router-link-active{color:#000!important}}@media (max-width: 1200px){.popup ul li{color:#fff;font: 500 14px Montserrat-Regular,sans-serif;cursor:pointer;border-bottom:1px solid #eee}.popup ul li:last-child{border-bottom:none}.popup ul li:hover{background-color:#f1f1f1}.mb-icon{width:200px}.container-wrapper{padding:10px 20px!important}.dropdown-container{position:relative;display:inline-block}.popup{top:0%!important;background-color:var(--first)!important;left:10rem;padding:10px;z-index:1000;transition:opacity .3s ease-in-out}}@media (max-width: 500px){.navbar-nav{background-color:var(--first);border-top:3px solid rgb(254,209,54);color:#fff;margin-top:5px;z-index:1}.navbar-nav .nav-item .nav-link{font-size:100%;font-weight:500;padding:.7em 1em!important}}.popup{top:90%;background-color:transparent;padding:10px;z-index:1000}.popup ul{list-style-type:none;padding:0;margin:0}.popup ul li{padding:5px 10px;font: 500 14px Montserrat-Regular,sans-serif}.resource-header .nav-link.scrolled-nav-link{color:#fff!important}.resource-header .sign-btn,.resource-header .sign-header-btn{text-decoration:none!important}.dropdownItem{cursor:pointer}.rotate{transform:rotate(180deg)}@media (max-width: 500px){.logo_img{width:60%!important;margin-left:auto;margin-right:0;display:block;transition:margin .5s ease,width .5s ease}.navbar-nav{background-color:var(--first);border-top:3px solid rgb(254,209,54);color:#fff;margin-top:5px;z-index:1}.navbar-nav .nav-item .nav-link{font-size:100%;font-weight:500;padding:.7em 1em!important}.popup{top:0%!important;background-color:var(--first)!important;left:10rem;padding:10px;z-index:1000;transition:opacity .3s ease-in-out}.popup ul{list-style-type:none;padding:0;margin:0}.dropdownItem{cursor:pointer}.rotate{transform:rotate(180deg)}.dropdown-container{position:relative;display:inline-block}}.navbar-nav{visibility:visible!important;display:flex!important}.nav-link{text-transform:uppercase}.dropdown-container{position:relative;display:inline-block}\n"] }]
992
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: Document, decorators: [{
993
+ type: Inject,
994
+ args: [DOCUMENT]
995
+ }] }, { type: i5.AdminService }, { type: i6.NgbModal }], propDecorators: { navbarCollapse: [{
996
+ type: ViewChild,
997
+ args: ['collapsibleNavbar']
998
+ }], logoEditModal: [{
999
+ type: ViewChild,
1000
+ args: ['logoEditModal']
1001
+ }], user: [{
1002
+ type: Input
1003
+ }], userLoggedIn: [{
1004
+ type: Input
1005
+ }], onScroll: [{
1006
+ type: HostListener,
1007
+ args: ['window:scroll', []]
1008
+ }], onDocumentClick: [{
1009
+ type: HostListener,
1010
+ args: ['document:click', ['$event']]
1011
+ }] } });
1012
+
1013
+ /**
1014
+ * ResourceHeaderModule - Optimized
1015
+ * DragDropModule removed - now lazy-loaded only when edit modal opens
1016
+ * This reduces bundle size for landing pages where users aren't logged in
1017
+ */
1018
+ class ResourceHeaderModule {
1019
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourceHeaderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1020
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: ResourceHeaderModule, declarations: [ResourceHeaderComponent], imports: [CommonModule,
1021
+ FormsModule,
1022
+ RouterModule,
1023
+ // DragDropModule removed - lazy-loaded in EditNavbarModalComponent
1024
+ NgbModalModule,
1025
+ NgbTooltipModule,
1026
+ CoreTranslocoModule,
1027
+ DirectivesModule,
1028
+ PipesModule,
1029
+ AdminModuleUtilsModule,
1030
+ ProfileImageCropperModule], exports: [ResourceHeaderComponent] }); }
1031
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourceHeaderModule, imports: [CommonModule,
1032
+ FormsModule,
1033
+ RouterModule,
1034
+ // DragDropModule removed - lazy-loaded in EditNavbarModalComponent
1035
+ NgbModalModule,
1036
+ NgbTooltipModule,
1037
+ CoreTranslocoModule,
1038
+ DirectivesModule,
1039
+ PipesModule,
1040
+ AdminModuleUtilsModule,
1041
+ ProfileImageCropperModule] }); }
1042
+ }
1043
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ResourceHeaderModule, decorators: [{
1044
+ type: NgModule,
1045
+ args: [{
1046
+ declarations: [ResourceHeaderComponent],
1047
+ imports: [
1048
+ CommonModule,
1049
+ FormsModule,
1050
+ RouterModule,
1051
+ // DragDropModule removed - lazy-loaded in EditNavbarModalComponent
1052
+ NgbModalModule,
1053
+ NgbTooltipModule,
1054
+ CoreTranslocoModule,
1055
+ DirectivesModule,
1056
+ PipesModule,
1057
+ AdminModuleUtilsModule,
1058
+ ProfileImageCropperModule
1059
+ ],
1060
+ exports: [ResourceHeaderComponent]
1061
+ }]
1062
+ }] });
1063
+
1064
+ class FieldErrorDisplayComponent {
1065
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FieldErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1066
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: FieldErrorDisplayComponent, selector: "pw-field-error-display", inputs: { errorMsg: "errorMsg", displayError: "displayError" }, ngImport: i0, template: "<div *ngIf=\"displayError\">\n <div class=\"text-danger\">\n {{ errorMsg }}\n </div>\n</div>\n\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1067
+ }
1068
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FieldErrorDisplayComponent, decorators: [{
1069
+ type: Component,
1070
+ args: [{ selector: 'pw-field-error-display', template: "<div *ngIf=\"displayError\">\n <div class=\"text-danger\">\n {{ errorMsg }}\n </div>\n</div>\n\n" }]
1071
+ }], propDecorators: { errorMsg: [{
1072
+ type: Input
1073
+ }], displayError: [{
1074
+ type: Input
1075
+ }] } });
1076
+
1077
+ /**
1078
+ * Standalone module for FieldErrorDisplayComponent.
1079
+ * Import this lightweight module instead of SharedComponentsModule
1080
+ * when you only need field error display functionality.
1081
+ */
1082
+ class FieldErrorDisplayModule {
1083
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FieldErrorDisplayModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1084
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: FieldErrorDisplayModule, declarations: [FieldErrorDisplayComponent], imports: [CommonModule], exports: [FieldErrorDisplayComponent] }); }
1085
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FieldErrorDisplayModule, imports: [CommonModule] }); }
1086
+ }
1087
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FieldErrorDisplayModule, decorators: [{
1088
+ type: NgModule,
1089
+ args: [{
1090
+ declarations: [FieldErrorDisplayComponent],
1091
+ imports: [CommonModule],
1092
+ exports: [FieldErrorDisplayComponent]
1093
+ }]
1094
+ }] });
1095
+
1096
+ /**
1097
+ * Edit Footer Links Modal Component
1098
+ * Contains drag-drop functionality for reordering footer links
1099
+ * This component is lazy-loaded only when the edit modal is opened
1100
+ */
1101
+ class EditFooterLinksModalComponent {
1102
+ constructor() {
1103
+ this.editingFooterLinks = { items: [] };
1104
+ this.save = new EventEmitter();
1105
+ this.close = new EventEmitter();
1106
+ }
1107
+ dropFooterLinks(event) {
1108
+ moveItemInArray(this.editingFooterLinks.items, event.previousIndex, event.currentIndex);
1109
+ }
1110
+ dropSubtitles(footerIndex, event) {
1111
+ moveItemInArray(this.editingFooterLinks.items[footerIndex].subtitles, event.previousIndex, event.currentIndex);
1112
+ }
1113
+ addFooterLink() {
1114
+ this.editingFooterLinks.items.push({
1115
+ title: '',
1116
+ path: '',
1117
+ subtitles: []
1118
+ });
1119
+ }
1120
+ removeFooterLink(index) {
1121
+ this.editingFooterLinks.items.splice(index, 1);
1122
+ }
1123
+ addSubtitle(footerIndex) {
1124
+ this.editingFooterLinks.items[footerIndex].subtitles.push({
1125
+ title: '',
1126
+ path: ''
1127
+ });
1128
+ }
1129
+ removeSubtitle(footerIndex, subtitleIndex) {
1130
+ this.editingFooterLinks.items[footerIndex].subtitles.splice(subtitleIndex, 1);
1131
+ }
1132
+ onSave() {
1133
+ this.save.emit(this.editingFooterLinks);
1134
+ }
1135
+ onClose() {
1136
+ this.close.emit();
1137
+ }
1138
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: EditFooterLinksModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: EditFooterLinksModalComponent, isStandalone: true, selector: "pw-edit-footer-links-modal", inputs: { editingFooterLinks: "editingFooterLinks" }, outputs: { save: "save", close: "close" }, ngImport: i0, template: `
1140
+ <div class="modal-header">
1141
+ <h5 class="modal-title">Edit Footer Links</h5>
1142
+ <button type="button" class="btn-close" aria-label="Close" (click)="onClose()"></button>
1143
+ </div>
1144
+
1145
+ <div class="modal-body">
1146
+ <h4 class="mb-3">Footer Links Section</h4>
1147
+ <div cdkDropList (cdkDropListDropped)="dropFooterLinks($event)">
1148
+ <div *ngFor="let footer of editingFooterLinks.items; let i = index" class="border p-3 mb-3" cdkDrag>
1149
+ <div class="row">
1150
+ <div class="col-md-5 mb-2">
1151
+ <label [for]="'footerTitle' + i" class="form-label">Title</label>
1152
+ <input [id]="'footerTitle' + i" class="form-control" [(ngModel)]="footer.title" />
1153
+ </div>
1154
+ <div class="col-md-5 mb-2">
1155
+ <label [for]="'footerPath' + i" class="form-label">Path</label>
1156
+ <input [id]="'footerPath' + i" class="form-control" [(ngModel)]="footer.path" />
1157
+ </div>
1158
+ <div class="col-md-2 d-flex justify-content-between align-items-center mt-4">
1159
+ <i class="fa fa-trash in-page-trash-icon text-danger cursor-pointer"
1160
+ (click)="removeFooterLink(i)"
1161
+ (keydown.enter)="removeFooterLink(i)"
1162
+ (keydown.space)="removeFooterLink(i)"></i>
1163
+ <i class="fa fa-bars in-page-bars-icon cursor-move" cdkDragHandle></i>
1164
+ </div>
1165
+ </div>
1166
+
1167
+ <!-- Subtitles -->
1168
+ <div cdkDropList (cdkDropListDropped)="dropSubtitles(i, $event)">
1169
+ <div *ngFor="let sub of footer.subtitles; let j = index" class="row border p-3 mb-2 align-items-center" cdkDrag>
1170
+ <div class="col-md-5">
1171
+ <label [for]="'subtitleTitle' + i + j" class="form-label">Subtitle Title</label>
1172
+ <input [id]="'subtitleTitle' + i + j" class="form-control" [(ngModel)]="sub.title" />
1173
+ </div>
1174
+ <div class="col-md-5">
1175
+ <label [for]="'subtitlePath' + i + j" class="form-label">Subtitle Path</label>
1176
+ <input [id]="'subtitlePath' + i + j" class="form-control" [(ngModel)]="sub.path" />
1177
+ </div>
1178
+ <div class="col-md-2 d-flex justify-content-between align-items-center mt-4">
1179
+ <i class="fa fa-trash in-page-trash-icon text-danger cursor-pointer"
1180
+ (click)="removeSubtitle(i, j)"
1181
+ (keydown.enter)="removeSubtitle(i, j)"
1182
+ (keydown.space)="removeSubtitle(i, j)"></i>
1183
+ <i class="fa fa-bars cursor-move in-page-bars-icon" cdkDragHandle></i>
1184
+ </div>
1185
+ </div>
1186
+ </div>
1187
+
1188
+ <button class="btn btn-outline-primary btn-sm mt-2" (click)="addSubtitle(i)">
1189
+ + Add Subtitle
1190
+ </button>
1191
+ </div>
1192
+ </div>
1193
+
1194
+ <button class="btn btn-primary mt-3" (click)="addFooterLink()">
1195
+ + Add Footer Link
1196
+ </button>
1197
+ </div>
1198
+
1199
+ <div class="modal-footer">
1200
+ <button class="btn btn-secondary" (click)="onClose()">Cancel</button>
1201
+ <button class="btn btn-primary" (click)="onSave()">Save</button>
1202
+ </div>
1203
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i3$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3$2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); }
1204
+ }
1205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: EditFooterLinksModalComponent, decorators: [{
1206
+ type: Component,
1207
+ args: [{
1208
+ selector: 'pw-edit-footer-links-modal',
1209
+ standalone: true,
1210
+ imports: [CommonModule, FormsModule, DragDropModule],
1211
+ template: `
1212
+ <div class="modal-header">
1213
+ <h5 class="modal-title">Edit Footer Links</h5>
1214
+ <button type="button" class="btn-close" aria-label="Close" (click)="onClose()"></button>
1215
+ </div>
1216
+
1217
+ <div class="modal-body">
1218
+ <h4 class="mb-3">Footer Links Section</h4>
1219
+ <div cdkDropList (cdkDropListDropped)="dropFooterLinks($event)">
1220
+ <div *ngFor="let footer of editingFooterLinks.items; let i = index" class="border p-3 mb-3" cdkDrag>
1221
+ <div class="row">
1222
+ <div class="col-md-5 mb-2">
1223
+ <label [for]="'footerTitle' + i" class="form-label">Title</label>
1224
+ <input [id]="'footerTitle' + i" class="form-control" [(ngModel)]="footer.title" />
1225
+ </div>
1226
+ <div class="col-md-5 mb-2">
1227
+ <label [for]="'footerPath' + i" class="form-label">Path</label>
1228
+ <input [id]="'footerPath' + i" class="form-control" [(ngModel)]="footer.path" />
1229
+ </div>
1230
+ <div class="col-md-2 d-flex justify-content-between align-items-center mt-4">
1231
+ <i class="fa fa-trash in-page-trash-icon text-danger cursor-pointer"
1232
+ (click)="removeFooterLink(i)"
1233
+ (keydown.enter)="removeFooterLink(i)"
1234
+ (keydown.space)="removeFooterLink(i)"></i>
1235
+ <i class="fa fa-bars in-page-bars-icon cursor-move" cdkDragHandle></i>
1236
+ </div>
1237
+ </div>
1238
+
1239
+ <!-- Subtitles -->
1240
+ <div cdkDropList (cdkDropListDropped)="dropSubtitles(i, $event)">
1241
+ <div *ngFor="let sub of footer.subtitles; let j = index" class="row border p-3 mb-2 align-items-center" cdkDrag>
1242
+ <div class="col-md-5">
1243
+ <label [for]="'subtitleTitle' + i + j" class="form-label">Subtitle Title</label>
1244
+ <input [id]="'subtitleTitle' + i + j" class="form-control" [(ngModel)]="sub.title" />
1245
+ </div>
1246
+ <div class="col-md-5">
1247
+ <label [for]="'subtitlePath' + i + j" class="form-label">Subtitle Path</label>
1248
+ <input [id]="'subtitlePath' + i + j" class="form-control" [(ngModel)]="sub.path" />
1249
+ </div>
1250
+ <div class="col-md-2 d-flex justify-content-between align-items-center mt-4">
1251
+ <i class="fa fa-trash in-page-trash-icon text-danger cursor-pointer"
1252
+ (click)="removeSubtitle(i, j)"
1253
+ (keydown.enter)="removeSubtitle(i, j)"
1254
+ (keydown.space)="removeSubtitle(i, j)"></i>
1255
+ <i class="fa fa-bars cursor-move in-page-bars-icon" cdkDragHandle></i>
1256
+ </div>
1257
+ </div>
1258
+ </div>
1259
+
1260
+ <button class="btn btn-outline-primary btn-sm mt-2" (click)="addSubtitle(i)">
1261
+ + Add Subtitle
1262
+ </button>
1263
+ </div>
1264
+ </div>
1265
+
1266
+ <button class="btn btn-primary mt-3" (click)="addFooterLink()">
1267
+ + Add Footer Link
1268
+ </button>
1269
+ </div>
1270
+
1271
+ <div class="modal-footer">
1272
+ <button class="btn btn-secondary" (click)="onClose()">Cancel</button>
1273
+ <button class="btn btn-primary" (click)="onSave()">Save</button>
1274
+ </div>
1275
+ `
1276
+ }]
1277
+ }], propDecorators: { editingFooterLinks: [{
1278
+ type: Input
1279
+ }], save: [{
1280
+ type: Output
1281
+ }], close: [{
1282
+ type: Output
1283
+ }] } });
1284
+
1285
+ var editFooterLinksModal_component = /*#__PURE__*/Object.freeze({
1286
+ __proto__: null,
1287
+ EditFooterLinksModalComponent: EditFooterLinksModalComponent
1288
+ });
1289
+
1290
+ /**
1291
+ * Edit Questions Modal Component
1292
+ * Contains drag-drop functionality for reordering questions and options
1293
+ * This component is lazy-loaded only when the edit modal is opened
1294
+ */
1295
+ class EditQuestionsModalComponent {
1296
+ constructor() {
1297
+ this.editingQuestions = [];
1298
+ this.save = new EventEmitter();
1299
+ this.close = new EventEmitter();
1300
+ }
1301
+ dropQuestions(event) {
1302
+ moveItemInArray(this.editingQuestions, event.previousIndex, event.currentIndex);
1303
+ }
1304
+ dropQuestionOptions(qIndex, event) {
1305
+ moveItemInArray(this.editingQuestions[qIndex].options, event.previousIndex, event.currentIndex);
1306
+ }
1307
+ addNewQuestion() {
1308
+ this.editingQuestions.push({ question: '', options: [] });
1309
+ }
1310
+ addQuestionOption(qIndex) {
1311
+ this.editingQuestions[qIndex].options.push({ option: '' });
1312
+ }
1313
+ removeQuestionOption(qIndex, optIndex) {
1314
+ this.editingQuestions[qIndex].options.splice(optIndex, 1);
1315
+ }
1316
+ onSave() {
1317
+ this.save.emit(this.editingQuestions);
1318
+ }
1319
+ onClose() {
1320
+ this.close.emit();
1321
+ }
1322
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: EditQuestionsModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1323
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: EditQuestionsModalComponent, isStandalone: true, selector: "pw-edit-questions-modal", inputs: { editingQuestions: "editingQuestions" }, outputs: { save: "save", close: "close" }, ngImport: i0, template: `
1324
+ <div class="modal-header">
1325
+ <h5 class="modal-title">Edit Questions</h5>
1326
+ <button type="button" class="btn-close" aria-label="Close" (click)="onClose()"></button>
1327
+ </div>
1328
+
1329
+ <div class="modal-body">
1330
+ <h4 class="mb-3">Questions Section</h4>
1331
+ <div cdkDropList (cdkDropListDropped)="dropQuestions($event)">
1332
+ <div *ngFor="let q of editingQuestions; let i = index" class="border p-3 mb-3" cdkDrag>
1333
+ <div class="row">
1334
+ <div class="col-md-11 mb-2">
1335
+ <label [for]="'questionText' + i" class="form-label">Question</label>
1336
+ <input [id]="'questionText' + i" class="form-control" [(ngModel)]="q.question" placeholder="Enter question" />
1337
+ </div>
1338
+ <div class="col-md-1 d-flex justify-content-end align-items-start mt-4">
1339
+ <i class="fa fa-bars in-page-bars-icon cursor-move" cdkDragHandle></i>
1340
+ </div>
1341
+ </div>
1342
+
1343
+ <!-- Options Section -->
1344
+ <div cdkDropList (cdkDropListDropped)="dropQuestionOptions(i, $event)">
1345
+ <div *ngFor="let opt of q.options; let j = index" class="row border p-3 mb-2 align-items-center" cdkDrag>
1346
+ <div class="col-md-7 mb-2">
1347
+ <label [for]="'questionOption' + i + j" class="form-label">Option</label>
1348
+ <input [id]="'questionOption' + i + j" class="form-control" [(ngModel)]="opt.option" placeholder="Enter option" />
1349
+ </div>
1350
+ <div class="col-md-2 d-flex justify-content-between align-items-center mt-4">
1351
+ <i class="fa fa-trash in-page-trash-icon text-danger cursor-pointer"
1352
+ (click)="removeQuestionOption(i, j)"
1353
+ (keydown.enter)="removeQuestionOption(i, j)"
1354
+ (keydown.space)="removeQuestionOption(i, j)"></i>
1355
+ <i class="fa fa-bars in-page-bars-icon cursor-move" cdkDragHandle></i>
1356
+ </div>
1357
+ </div>
1358
+ </div>
1359
+
1360
+ <button class="btn btn-outline-primary btn-sm mt-2" (click)="addQuestionOption(i)">+ Add Option</button>
1361
+ </div>
1362
+ </div>
1363
+
1364
+ <button class="btn btn-primary mt-3" (click)="addNewQuestion()">+ Add Question</button>
1365
+ </div>
1366
+
1367
+ <div class="modal-footer">
1368
+ <button class="btn btn-secondary" (click)="onClose()">Cancel</button>
1369
+ <button class="btn btn-primary" (click)="onSave()">Save</button>
1370
+ </div>
1371
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i3$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3$2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); }
1372
+ }
1373
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: EditQuestionsModalComponent, decorators: [{
1374
+ type: Component,
1375
+ args: [{
1376
+ selector: 'pw-edit-questions-modal',
1377
+ standalone: true,
1378
+ imports: [CommonModule, FormsModule, DragDropModule],
1379
+ template: `
1380
+ <div class="modal-header">
1381
+ <h5 class="modal-title">Edit Questions</h5>
1382
+ <button type="button" class="btn-close" aria-label="Close" (click)="onClose()"></button>
1383
+ </div>
1384
+
1385
+ <div class="modal-body">
1386
+ <h4 class="mb-3">Questions Section</h4>
1387
+ <div cdkDropList (cdkDropListDropped)="dropQuestions($event)">
1388
+ <div *ngFor="let q of editingQuestions; let i = index" class="border p-3 mb-3" cdkDrag>
1389
+ <div class="row">
1390
+ <div class="col-md-11 mb-2">
1391
+ <label [for]="'questionText' + i" class="form-label">Question</label>
1392
+ <input [id]="'questionText' + i" class="form-control" [(ngModel)]="q.question" placeholder="Enter question" />
1393
+ </div>
1394
+ <div class="col-md-1 d-flex justify-content-end align-items-start mt-4">
1395
+ <i class="fa fa-bars in-page-bars-icon cursor-move" cdkDragHandle></i>
1396
+ </div>
1397
+ </div>
1398
+
1399
+ <!-- Options Section -->
1400
+ <div cdkDropList (cdkDropListDropped)="dropQuestionOptions(i, $event)">
1401
+ <div *ngFor="let opt of q.options; let j = index" class="row border p-3 mb-2 align-items-center" cdkDrag>
1402
+ <div class="col-md-7 mb-2">
1403
+ <label [for]="'questionOption' + i + j" class="form-label">Option</label>
1404
+ <input [id]="'questionOption' + i + j" class="form-control" [(ngModel)]="opt.option" placeholder="Enter option" />
1405
+ </div>
1406
+ <div class="col-md-2 d-flex justify-content-between align-items-center mt-4">
1407
+ <i class="fa fa-trash in-page-trash-icon text-danger cursor-pointer"
1408
+ (click)="removeQuestionOption(i, j)"
1409
+ (keydown.enter)="removeQuestionOption(i, j)"
1410
+ (keydown.space)="removeQuestionOption(i, j)"></i>
1411
+ <i class="fa fa-bars in-page-bars-icon cursor-move" cdkDragHandle></i>
1412
+ </div>
1413
+ </div>
1414
+ </div>
1415
+
1416
+ <button class="btn btn-outline-primary btn-sm mt-2" (click)="addQuestionOption(i)">+ Add Option</button>
1417
+ </div>
1418
+ </div>
1419
+
1420
+ <button class="btn btn-primary mt-3" (click)="addNewQuestion()">+ Add Question</button>
1421
+ </div>
1422
+
1423
+ <div class="modal-footer">
1424
+ <button class="btn btn-secondary" (click)="onClose()">Cancel</button>
1425
+ <button class="btn btn-primary" (click)="onSave()">Save</button>
1426
+ </div>
1427
+ `
1428
+ }]
1429
+ }], propDecorators: { editingQuestions: [{
1430
+ type: Input
1431
+ }], save: [{
1432
+ type: Output
1433
+ }], close: [{
1434
+ type: Output
1435
+ }] } });
1436
+
1437
+ var editQuestionsModal_component = /*#__PURE__*/Object.freeze({
1438
+ __proto__: null,
1439
+ EditQuestionsModalComponent: EditQuestionsModalComponent
1440
+ });
1441
+
580
1442
  /**
581
1443
  * Generated bundle index. Do not edit.
582
1444
  */
583
1445
 
584
- export { Trial4ContactUsComponent, Trial4ContactUsModule };
1446
+ export { CustomUploaderComponent, EditFooterLinksModalComponent, EditQuestionsModalComponent, FieldErrorDisplayComponent, FieldErrorDisplayModule, ProfileImageCropperComponent, ProfileImageCropperModule, ResourceHeaderComponent, ResourceHeaderModule, Trial4ContactUsComponent, Trial4ContactUsModule };
585
1447
  //# sourceMappingURL=posiwise-resource-contact-us.mjs.map